สามารถนำมาใช้เป็นคุณลักษณะของดีออกแบบซอฟต์แวร์
ความสามารถนำกลับมาใช้ใหม่เป็นเงาที่ยอมรับได้("สัญกรณ์สั้น ๆ ของความหมาย") สำหรับการออกแบบซอฟต์แวร์ที่ดีหรือไม่? ทำไม?
สามารถนำมาใช้เป็นคุณลักษณะของดีออกแบบซอฟต์แวร์
ความสามารถนำกลับมาใช้ใหม่เป็นเงาที่ยอมรับได้("สัญกรณ์สั้น ๆ ของความหมาย") สำหรับการออกแบบซอฟต์แวร์ที่ดีหรือไม่? ทำไม?
คำตอบ:
การใช้ซ้ำเป็นตัวบ่งชี้การออกแบบที่ดี มันบ่งชี้ว่าการมีเพศสัมพันธ์ของระบบนั้นหลวมพอและการรวมกันของหน่วยใดหน่วยหนึ่งสูงพอที่จะนำมาใช้ซ้ำได้โดยไม่ต้องเจอกับปัญหาการพึ่งพาหรือต้องเขียนรหัสส่วนใหญ่
สามารถนำมาใช้ใหม่เป็นภาพลวงตา เป็นไปไม่ได้ที่จะวัดความสามารถในการ "นำกลับมาใช้ใหม่" ของหน่วยโดยไม่ทราบล่วงหน้าว่าจะใช้งานที่ไหนหรืออย่างไร นักพัฒนาหลายคนจะพยายามออกแบบส่วนประกอบ "ที่ใช้ซ้ำได้" และมักจะพบในภายหลังว่าลักษณะเฉพาะที่พวกเขาพยายามทำให้ "ยืดหยุ่น" นั้นเป็นสิ่งที่ไม่จำเป็นต้องเป็น
ฉันจะใช้ "เงา" ที่แตกต่างกัน: การทดสอบได้
ตอนนี้ฉันไม่ได้เป็นผู้สนับสนุนของ TDD และฉันไม่รู้สึกว่าจำเป็นที่จะต้องทดสอบหน่วยอะไรและทุกอย่าง แต่การทดสอบการเขียนสำหรับองค์ประกอบจะทำให้คุณมีความคิดที่ดีเกี่ยวกับลักษณะของข้อต่อ / การเกาะติดกันและรวดเร็วมาก ถ้ามันขึ้นอยู่กับ abstractions นั่นก็คือคลัปหลวม คุณจะพบว่าง่ายต่อการลอกเลียนแบบการอ้างอิงและการออกแบบที่ดี ถ้ามันมีจุดประสงค์ที่ชัดเจน (ดูหลักการความรับผิดชอบเดี่ยว ) จากนั้นพฤติกรรมของมันจะค่อนข้างง่ายคุณจะพบว่ามันง่ายที่จะคิดว่าจะทดสอบอะไรซึ่งเป็นการออกแบบที่ดีอีกครั้ง
แน่นอนว่าไม่รับประกันการออกแบบที่ดี การใช้งานจริงหรือแม้แต่สถาปัตยกรรมทั้งหมดอาจไม่เหมาะสมอย่างสมบูรณ์ตามวัตถุประสงค์ที่ระบุไว้ แต่อย่างน้อยก็บอกคุณว่าคุณไม่ได้ทำงานกับรหัสสปาเก็ตตี้หรือ God Objects
โปรดอย่าพยายามคาดเดาอย่างรุนแรงเกี่ยวกับ "ความสามารถในการนำกลับมาใช้" ของส่วนประกอบโดยเฉพาะอย่างยิ่งไม่ให้ใช้เป็นหลักฐานของ "การออกแบบที่ดี" นั่นคือสิ่งที่คุณสามารถสร้างได้ในเมื่อเข้าใจปัญหาเท่านั้นเมื่อมันถูกนำกลับมาใช้จริงและจากนั้นการออกแบบอาจเปลี่ยนไปอย่างมีนัยสำคัญ
เลขที่
ความสามารถในการนำกลับมาใช้ใหม่เป็นคุณสมบัติที่ดีเนื่องจากจะช่วยให้การพัฒนาในอนาคตรวดเร็วขึ้น (แม้ว่าในทางปฏิบัติแล้วมีองค์กรเพียงไม่กี่แห่งที่เห็นว่าการพัฒนาในอนาคตจะมีความเร็วเพิ่มขึ้นเกือบเท่าที่พวกเขาคาดหวังว่าจะเป็นเช่นนั้น) อย่างไรก็ตามซอฟต์แวร์ที่มีความสำคัญชิ้นส่วนใด ๆ และยิ่งไปกว่านั้นเมื่อผู้คนที่ไม่มีประสบการณ์โดเมนพยายามเขียนซอฟต์แวร์ที่ใช้ซ้ำได้พวกเขามักทำให้งงงวยและลดประสิทธิภาพโดยไม่ประสบความสำเร็จในการทำให้สามารถนำมาใช้ซ้ำได้
ดังนั้นการออกแบบที่ดีจึงเป็นแบบแยกส่วนและนำมาใช้ซ้ำได้เฉพาะที่คุณสามารถเห็นได้ว่าสามารถนำชิ้นส่วนนั้นมาใช้ซ้ำได้และในที่ที่คุณมีความเชี่ยวชาญเพื่อให้สามารถนำกลับมาใช้ใหม่ได้จริง ที่อื่นคุณควรพยายามทำให้สิ่งต่าง ๆ สะอาด แต่ไม่ต้องกังวลกับการใช้ซ้ำ (ยกเว้นที่ด้านหลังศีรษะของคุณซึ่งคุณกำลังจดบันทึกเพื่อให้ในบางระบบในอนาคตคุณจะมีแนวคิดที่จะทำให้สามารถใช้ซ้ำได้)
ฉัน belive (และนี่เป็นความเชื่อส่วนบุคคลของฉัน) ที่ความสัมพันธ์ระหว่างนำมาใช้และการออกแบบที่ดีไม่ได้สะท้อนดังนั้นคำตอบที่พื้นฐานและง่ายๆคือไม่มี หากคุณสนใจในบางคำแนะนำการออกแบบที่ดีตรวจสอบนี้บทความวิกิพีเดีย
การออกแบบซอฟต์แวร์ที่ดีจะต้องสามารถนำมาใช้ซ้ำได้อย่างน้อยในบางส่วนของแกนผมคิดว่าคนน้อยมากที่จะนำซอร์สโค้ดกลับมาใช้ใหม่เนื่องจากความจริงที่ว่ามันซับซ้อนมากในการออกแบบแกนของระบบเพื่อให้สามารถนำกลับมาใช้ใหม่ได้ (และฉันกำลังพูดถึงประสบการณ์นี้)
พิจารณาคลาสที่มีความรับผิดชอบจำนวนมาก (หรือที่รู้จักกันในชื่อ Blob) ที่ปฏิบัติงานทั้งหมดที่คุณต้องการได้ดี แต่ไม่มีข้อควรพิจารณาในการออกแบบใด ๆ เลยบางทีคุณอาจเคยเห็นเคสแล้ว คนส่วนใหญ่ที่มีคลาสเช่นนั้นจะใช้มันซ้ำแล้วซ้ำอีกและฉันคิดว่าเราจะต้องยอมรับว่ามันใช้ซ้ำได้โดยไม่ต้องใช้การออกแบบซ้ำ
หวังว่าฉันจะไม่อธิบายคำอธิบายของฉันมากเกินไป
ฉันคิดว่าตัวบ่งชี้ที่ดีกว่าของการออกแบบที่ดีคือการยึดมั่นกับความคิดพื้นฐานเช่นหลักการความรับผิดชอบเดียวและการบำรุงรักษาร่วมกันของแต่ละองค์ประกอบ โดยการใช้abstractions ด้วยอินเทอร์เฟซที่สะอาดและรัดกุมและรักษาความสอดคล้องกับหลักการทดแทน Liskovเราสนับสนุนให้ใช้ซ้ำในขณะที่ไม่พยายามทำนายว่าอะไรจะเกิดขึ้นและจะไม่ถูกนำมาใช้ซ้ำ
การยึดติดกับหลักการออกแบบพื้นฐานเหล่านี้ทำให้รหัสทดสอบง่ายขึ้นและนำมาใช้ซ้ำได้ง่ายขึ้น
การออกแบบที่ดี == การออกแบบที่ดีความสามารถในการนำกลับมาใช้ใหม่เป็นผลพลอยได้
การใช้ซ้ำได้มักเป็นเป้าหมายการออกแบบโดยนัย หากคุณสามารถสร้างส่วนประกอบหรือการออกแบบทั้งหมดในลักษณะที่สามารถนำกลับมาใช้ใหม่ได้ในภายหลังดูเหมือนจะชัดเจนว่าคุณควรทำเช่นนั้น สิ่งที่ไม่ชัดเจนเสมอไปคือการใช้เวลาและความพยายาม (และเงิน) ในการสร้างสิ่งที่สามารถนำกลับมาใช้ใหม่ได้และดังนั้นจึงต้องคำนึงถึงประโยชน์ของความสามารถในการนำกลับมาใช้ใหม่ได้
การออกแบบที่สามารถใช้ซ้ำได้ซึ่งมีค่าใช้จ่ายมากเป็นสองเท่าและ / หรือใช้เวลานานกว่าสองเท่าในการสร้างมากกว่าสิ่งที่ลูกค้าต้องการไม่ใช่การออกแบบที่ดีจากมุมมองของลูกค้าโดยเฉพาะอย่างยิ่งหากลูกค้าไม่ต้องการนำกลับมาใช้ซ้ำ
มีคุณสมบัติที่คล้ายกันหลายอย่างที่มักถูกพิจารณาว่าเป็นเป้าหมายการออกแบบโดยนัยเพราะพวกเขาดูเหมือนดี:
ลดต้นทุน
ลดเวลาในการพัฒนา
ลดความซับซ้อน
เพิ่มความน่าเชื่อถือสูงสุด
สิ่งเหล่านี้เป็นสิ่งที่ดีตามวัตถุประสงค์ แต่อาจไม่สำคัญสำหรับลูกค้าที่เฉพาะเจาะจงในเวลาใดเวลาหนึ่งดังนั้นจึงเป็นสิ่งสำคัญที่จะต้องเข้าใจสิ่งที่ลูกค้าต้องการอย่างเต็มที่ (แม้ว่าลูกค้านั้นจะเป็นเจ้านายของคุณ) มีคำพังเพยจำนวนหนึ่งที่เตือนเราถึงความจริงนี้ (เช่น "เสร็จสิ้นดีกว่าสมบูรณ์แบบ" และ "ดีราคาถูกเร็ว: เลือกสองคน") แต่ก็ยังง่ายที่จะตกหลุมพรางของความพยายาม ทำให้ซอฟต์แวร์ที่ยอดเยี่ยมในทุกประการเมื่อในความเป็นจริงที่ดีในทุกประการไม่จำเป็นต้องเสมอ
หากต้องการไปที่คำถามหัวเรื่องแล้ว: ไม่การใช้ซ้ำไม่เหมือนกันกับการออกแบบที่ดี การนำกลับมาใช้ใหม่อาจเป็นส่วนประกอบที่มีประโยชน์ของการออกแบบที่ดีโดยเฉพาะ แต่เมื่อจำเป็นเท่านั้น
ไม่จำเป็น. หากคุณทำสิ่งที่นำกลับมาใช้ใหม่ได้ซึ่งชัดเจนว่าจะไม่ถูกนำมาใช้ซ้ำนั่นก็เป็นการออกแบบที่ไม่ดี
ตัวอย่างเช่นหากคุณกำลังเขียนไฟล์ที่มีข้อมูลซึ่งเป็นเอกลักษณ์ของ บริษัท ของคุณและข้อมูลนั้นจะถูกนำเข้าหนึ่งครั้งไปยังที่อื่นทำไมต้องทำให้มันใช้ซ้ำได้?
ที่กล่าวว่าหากกรอบงานของคุณไม่มีอยู่แล้วรหัสที่จะเขียนไปยังไฟล์อาจจำเป็นต้องใช้ซ้ำได้ นั่นจะเป็นการออกแบบที่ดี
ฉันจะบอกว่าไม่ส่วนใหญ่เพราะมันอธิบายเพียงส่วนเล็ก ๆ ของรหัส ฉันพบว่าการใช้งานที่สำคัญที่สุดนั้นอยู่ที่แกนกลางและที่ขอบด้านนอกของพื้นที่ใช้สอยไม่มากนัก ฉันจะยกตัวอย่างบางสิ่งที่ฉันคิดว่าการใช้ซ้ำเป็นตัวชี้วัดที่มีประโยชน์ในการออกแบบคุณภาพ
สิ่งสำคัญ
ยูทิลิตี้ Stuff
สำหรับสิ่งที่ CRUD ที่ใช้มากที่สุด 70-80% ของแอพส่วนใหญ่ฉันไม่คิดว่าการใช้ซ้ำเป็นตัวชี้วัดที่มีค่าเลย