ความสามารถในการนำกลับมาใช้ใหม่มีความหมายเหมือนกันกับการออกแบบที่ดีหรือไม่?


10

สามารถนำมาใช้เป็นคุณลักษณะของดีออกแบบซอฟต์แวร์

ความสามารถนำกลับมาใช้ใหม่เป็นเงาที่ยอมรับได้("สัญกรณ์สั้น ๆ ของความหมาย") สำหรับการออกแบบซอฟต์แวร์ที่ดีหรือไม่? ทำไม?


ฉันจะยืนยันว่าความยืดหยุ่นเป็นสิ่งสำคัญมาก การมีสถาปัตยกรรมพื้นฐานที่พยายามรองรับความจริงที่ว่าบางสิ่งอาจจะเปลี่ยนหรือเพิ่มในภายหลังเป็นกุญแจสำคัญในความคิดของฉัน Reusablity เกือบจะมาฟรีที่จุดนั้น
Pemdas

การใช้ความยืดหยุ่นของคุณฟังดูเหมือนนำมาใช้ใหม่
Matthew Rodatus

"ความสามารถในการนำกลับมาใช้ใหม่น่าจะเป็นส่วนของซอร์สโค้ดที่สามารถนำมาใช้อีกครั้งเพื่อเพิ่มฟังก์ชันการทำงานใหม่ที่มีการปรับเปลี่ยนเล็กน้อยหรือไม่มีเลย" - en.wikipedia.org/wiki/ ความ
Matthew Rodatus

ฉันประทับใจว่าส่วนใหญ่ของคำตอบด้านล่างกล่าวว่าไม่มี ตอนนี้จะเป็นเช่นนี้เมื่อไม่กี่ปีที่ผ่านมา (เอ่อ ... 5-10 ปี) เมื่อความสามารถในการนำกลับมาใช้ใหม่เป็นสิ่งที่น่าพอใจอย่างมาก
Martin Wickman

@ มาร์ตินวิคแมนนำมาใช้ใหม่ได้ดี แต่มันไม่ฟรี
Caleb

คำตอบ:


13

เลขที่

การใช้ซ้ำเป็นตัวบ่งชี้การออกแบบที่ดี มันบ่งชี้ว่าการมีเพศสัมพันธ์ของระบบนั้นหลวมพอและการรวมกันของหน่วยใดหน่วยหนึ่งสูงพอที่จะนำมาใช้ซ้ำได้โดยไม่ต้องเจอกับปัญหาการพึ่งพาหรือต้องเขียนรหัสส่วนใหญ่

สามารถนำมาใช้ใหม่เป็นภาพลวงตา เป็นไปไม่ได้ที่จะวัดความสามารถในการ "นำกลับมาใช้ใหม่" ของหน่วยโดยไม่ทราบล่วงหน้าว่าจะใช้งานที่ไหนหรืออย่างไร นักพัฒนาหลายคนจะพยายามออกแบบส่วนประกอบ "ที่ใช้ซ้ำได้" และมักจะพบในภายหลังว่าลักษณะเฉพาะที่พวกเขาพยายามทำให้ "ยืดหยุ่น" นั้นเป็นสิ่งที่ไม่จำเป็นต้องเป็น

ฉันจะใช้ "เงา" ที่แตกต่างกัน: การทดสอบได้

ตอนนี้ฉันไม่ได้เป็นผู้สนับสนุนของ TDD และฉันไม่รู้สึกว่าจำเป็นที่จะต้องทดสอบหน่วยอะไรและทุกอย่าง แต่การทดสอบการเขียนสำหรับองค์ประกอบจะทำให้คุณมีความคิดที่ดีเกี่ยวกับลักษณะของข้อต่อ / การเกาะติดกันและรวดเร็วมาก ถ้ามันขึ้นอยู่กับ abstractions นั่นก็คือคลัปหลวม คุณจะพบว่าง่ายต่อการลอกเลียนแบบการอ้างอิงและการออกแบบที่ดี ถ้ามันมีจุดประสงค์ที่ชัดเจน (ดูหลักการความรับผิดชอบเดี่ยว ) จากนั้นพฤติกรรมของมันจะค่อนข้างง่ายคุณจะพบว่ามันง่ายที่จะคิดว่าจะทดสอบอะไรซึ่งเป็นการออกแบบที่ดีอีกครั้ง

แน่นอนว่าไม่รับประกันการออกแบบที่ดี การใช้งานจริงหรือแม้แต่สถาปัตยกรรมทั้งหมดอาจไม่เหมาะสมอย่างสมบูรณ์ตามวัตถุประสงค์ที่ระบุไว้ แต่อย่างน้อยก็บอกคุณว่าคุณไม่ได้ทำงานกับรหัสสปาเก็ตตี้หรือ God Objects

โปรดอย่าพยายามคาดเดาอย่างรุนแรงเกี่ยวกับ "ความสามารถในการนำกลับมาใช้" ของส่วนประกอบโดยเฉพาะอย่างยิ่งไม่ให้ใช้เป็นหลักฐานของ "การออกแบบที่ดี" นั่นคือสิ่งที่คุณสามารถสร้างได้ในเมื่อเข้าใจปัญหาเท่านั้นเมื่อมันถูกนำกลับมาใช้จริงและจากนั้นการออกแบบอาจเปลี่ยนไปอย่างมีนัยสำคัญ


คำตอบที่ดี. คุณตอบคำถามที่ฉันควรถาม: "กลอสที่ดีสำหรับการออกแบบซอฟต์แวร์ที่ดีคืออะไร"
Matthew Rodatus

+1: โดยเฉพาะอย่างยิ่งสำหรับ "ความสามารถในการนำกลับมาใช้ใหม่เป็นภาพลวงตา"
Kramii

มันเป็นเพียงตัวบ่งชี้ของการออกแบบที่ดีถ้าความสามารถในการนำกลับมาใช้ใหม่เป็นเป้าหมาย บ่อยครั้งเป็นเป้าหมายหากมีการบอกเป็นนัย แต่ใช้เวลาและเงินในการทำส่วนประกอบที่สามารถนำกลับมาใช้ใหม่ได้หากไม่จำเป็นต้องสิ้นเปลือง
Caleb

5

เลขที่

ความสามารถในการนำกลับมาใช้ใหม่เป็นคุณสมบัติที่ดีเนื่องจากจะช่วยให้การพัฒนาในอนาคตรวดเร็วขึ้น (แม้ว่าในทางปฏิบัติแล้วมีองค์กรเพียงไม่กี่แห่งที่เห็นว่าการพัฒนาในอนาคตจะมีความเร็วเพิ่มขึ้นเกือบเท่าที่พวกเขาคาดหวังว่าจะเป็นเช่นนั้น) อย่างไรก็ตามซอฟต์แวร์ที่มีความสำคัญชิ้นส่วนใด ๆ และยิ่งไปกว่านั้นเมื่อผู้คนที่ไม่มีประสบการณ์โดเมนพยายามเขียนซอฟต์แวร์ที่ใช้ซ้ำได้พวกเขามักทำให้งงงวยและลดประสิทธิภาพโดยไม่ประสบความสำเร็จในการทำให้สามารถนำมาใช้ซ้ำได้

ดังนั้นการออกแบบที่ดีจึงเป็นแบบแยกส่วนและนำมาใช้ซ้ำได้เฉพาะที่คุณสามารถเห็นได้ว่าสามารถนำชิ้นส่วนนั้นมาใช้ซ้ำได้และในที่ที่คุณมีความเชี่ยวชาญเพื่อให้สามารถนำกลับมาใช้ใหม่ได้จริง ที่อื่นคุณควรพยายามทำให้สิ่งต่าง ๆ สะอาด แต่ไม่ต้องกังวลกับการใช้ซ้ำ (ยกเว้นที่ด้านหลังศีรษะของคุณซึ่งคุณกำลังจดบันทึกเพื่อให้ในบางระบบในอนาคตคุณจะมีแนวคิดที่จะทำให้สามารถใช้ซ้ำได้)


แล้วการทดสอบอัตโนมัติล่ะ หน่วยไม่ทดสอบรูปแบบการใช้ซ้ำหรือไม่
Matthew Rodatus

@ Matthew-Rodatus: การทดสอบหน่วยเป็นส่วนหนึ่งของซอฟต์แวร์ที่สามารถส่งมอบได้ การใช้ซ้ำมักจะหมายถึงการใช้ซ้ำรหัสในซอฟต์แวร์อื่น ๆ
btilly

จุดดี. ฉันเดาว่าฉันกำลังใช้ "ความสามารถนำกลับมาใช้ใหม่" ในแง่ของ ontological ซึ่งทำให้เกิดความสับสน อย่างไรก็ตามสังเกตว่าคุณสมบัติของการใช้ซ้ำยังเป็นคุณสมบัติของรหัสที่ทดสอบได้: en.wikipedia.org/wiki/Reusability
Matthew Rodatus

1
@ matthew-rodatus: ความสามารถในการนำกลับมาใช้ใหม่ไม่ได้ "มีรายการคุณสมบัติการซักรีดนี้" หากคุณพยายามนำกลับมาใช้ใหม่ในลักษณะนั้นคุณจะล้มเหลวอย่างหนัก เชื่อฉันในสิ่งนี้
btilly

จุดดี. ฉันเห็นตอนนี้ว่าฉันไม่ได้ถามคำถามที่ฉันตั้งใจจะถาม แต่มันก็ยังเป็นบทสนทนาที่น่าสนใจ
Matthew Rodatus

4

ฉัน belive (และนี่เป็นความเชื่อส่วนบุคคลของฉัน) ที่ความสัมพันธ์ระหว่างนำมาใช้และการออกแบบที่ดีไม่ได้สะท้อนดังนั้นคำตอบที่พื้นฐานและง่ายๆคือไม่มี หากคุณสนใจในบางคำแนะนำการออกแบบที่ดีตรวจสอบนี้บทความวิกิพีเดีย

การออกแบบซอฟต์แวร์ที่ดีจะต้องสามารถนำมาใช้ซ้ำได้อย่างน้อยในบางส่วนของแกนผมคิดว่าคนน้อยมากที่จะนำซอร์สโค้ดกลับมาใช้ใหม่เนื่องจากความจริงที่ว่ามันซับซ้อนมากในการออกแบบแกนของระบบเพื่อให้สามารถนำกลับมาใช้ใหม่ได้ (และฉันกำลังพูดถึงประสบการณ์นี้)

พิจารณาคลาสที่มีความรับผิดชอบจำนวนมาก (หรือที่รู้จักกันในชื่อ Blob) ที่ปฏิบัติงานทั้งหมดที่คุณต้องการได้ดี แต่ไม่มีข้อควรพิจารณาในการออกแบบใด ๆ เลยบางทีคุณอาจเคยเห็นเคสแล้ว คนส่วนใหญ่ที่มีคลาสเช่นนั้นจะใช้มันซ้ำแล้วซ้ำอีกและฉันคิดว่าเราจะต้องยอมรับว่ามันใช้ซ้ำได้โดยไม่ต้องใช้การออกแบบซ้ำ

หวังว่าฉันจะไม่อธิบายคำอธิบายของฉันมากเกินไป


นั่นเป็นเหตุผลที่ฉันพูดว่า "เงา" (โดยที่ฉันหมายถึงว่าในทางปฏิบัติความสามารถในการนำมาใช้ซ้ำได้ส่วนใหญ่ แต่ไม่ใช่ทั้งหมดที่เราหมายถึงโดยการออกแบบที่ดี)
Matthew Rodatus

จุดของฉันคือคุณต้องสามารถนำมาใช้จะต้องมีการออกแบบที่ดีแต่มีจำนวนมาก "นำมาใช้ใหม่" รหัส deosn't เฉลี่ยที่คุณมีการออกแบบที่ดีดังนั้นฉันยังคงบอกว่าไม่มีไม่ได้เป็นเงา
เดวิด Conde

นั่นทำให้รู้สึก ฉันไม่แน่ใจว่าฉันเห็นด้วย แต่ +1 สำหรับคำตอบที่คิดอย่างดี
Matthew Rodatus

2

ฉันคิดว่าตัวบ่งชี้ที่ดีกว่าของการออกแบบที่ดีคือการยึดมั่นกับความคิดพื้นฐานเช่นหลักการความรับผิดชอบเดียวและการบำรุงรักษาร่วมกันของแต่ละองค์ประกอบ โดยการใช้abstractions ด้วยอินเทอร์เฟซที่สะอาดและรัดกุมและรักษาความสอดคล้องกับหลักการทดแทน Liskovเราสนับสนุนให้ใช้ซ้ำในขณะที่ไม่พยายามทำนายว่าอะไรจะเกิดขึ้นและจะไม่ถูกนำมาใช้ซ้ำ

การยึดติดกับหลักการออกแบบพื้นฐานเหล่านี้ทำให้รหัสทดสอบง่ายขึ้นและนำมาใช้ซ้ำได้ง่ายขึ้น

การออกแบบที่ดี == การออกแบบที่ดีความสามารถในการนำกลับมาใช้ใหม่เป็นผลพลอยได้


1

การใช้ซ้ำได้มักเป็นเป้าหมายการออกแบบโดยนัย หากคุณสามารถสร้างส่วนประกอบหรือการออกแบบทั้งหมดในลักษณะที่สามารถนำกลับมาใช้ใหม่ได้ในภายหลังดูเหมือนจะชัดเจนว่าคุณควรทำเช่นนั้น สิ่งที่ไม่ชัดเจนเสมอไปคือการใช้เวลาและความพยายาม (และเงิน) ในการสร้างสิ่งที่สามารถนำกลับมาใช้ใหม่ได้และดังนั้นจึงต้องคำนึงถึงประโยชน์ของความสามารถในการนำกลับมาใช้ใหม่ได้

การออกแบบที่สามารถใช้ซ้ำได้ซึ่งมีค่าใช้จ่ายมากเป็นสองเท่าและ / หรือใช้เวลานานกว่าสองเท่าในการสร้างมากกว่าสิ่งที่ลูกค้าต้องการไม่ใช่การออกแบบที่ดีจากมุมมองของลูกค้าโดยเฉพาะอย่างยิ่งหากลูกค้าไม่ต้องการนำกลับมาใช้ซ้ำ

มีคุณสมบัติที่คล้ายกันหลายอย่างที่มักถูกพิจารณาว่าเป็นเป้าหมายการออกแบบโดยนัยเพราะพวกเขาดูเหมือนดี:

  • ลดต้นทุน

  • ลดเวลาในการพัฒนา

  • ลดความซับซ้อน

  • เพิ่มความน่าเชื่อถือสูงสุด

สิ่งเหล่านี้เป็นสิ่งที่ดีตามวัตถุประสงค์ แต่อาจไม่สำคัญสำหรับลูกค้าที่เฉพาะเจาะจงในเวลาใดเวลาหนึ่งดังนั้นจึงเป็นสิ่งสำคัญที่จะต้องเข้าใจสิ่งที่ลูกค้าต้องการอย่างเต็มที่ (แม้ว่าลูกค้านั้นจะเป็นเจ้านายของคุณ) มีคำพังเพยจำนวนหนึ่งที่เตือนเราถึงความจริงนี้ (เช่น "เสร็จสิ้นดีกว่าสมบูรณ์แบบ" และ "ดีราคาถูกเร็ว: เลือกสองคน") แต่ก็ยังง่ายที่จะตกหลุมพรางของความพยายาม ทำให้ซอฟต์แวร์ที่ยอดเยี่ยมในทุกประการเมื่อในความเป็นจริงที่ดีในทุกประการไม่จำเป็นต้องเสมอ

หากต้องการไปที่คำถามหัวเรื่องแล้ว: ไม่การใช้ซ้ำไม่เหมือนกันกับการออกแบบที่ดี การนำกลับมาใช้ใหม่อาจเป็นส่วนประกอบที่มีประโยชน์ของการออกแบบที่ดีโดยเฉพาะ แต่เมื่อจำเป็นเท่านั้น


0

ไม่จำเป็น. หากคุณทำสิ่งที่นำกลับมาใช้ใหม่ได้ซึ่งชัดเจนว่าจะไม่ถูกนำมาใช้ซ้ำนั่นก็เป็นการออกแบบที่ไม่ดี

ตัวอย่างเช่นหากคุณกำลังเขียนไฟล์ที่มีข้อมูลซึ่งเป็นเอกลักษณ์ของ บริษัท ของคุณและข้อมูลนั้นจะถูกนำเข้าหนึ่งครั้งไปยังที่อื่นทำไมต้องทำให้มันใช้ซ้ำได้?

ที่กล่าวว่าหากกรอบงานของคุณไม่มีอยู่แล้วรหัสที่จะเขียนไปยังไฟล์อาจจำเป็นต้องใช้ซ้ำได้ นั่นจะเป็นการออกแบบที่ดี


คุณจะรู้ได้อย่างไรว่ามีบางสิ่งที่ไม่เคยถูกนำมาใช้ซ้ำ
Matthew Rodatus

1
@ Matthew - นั่นจะเป็นคำจำกัดความของฉันในการเป็นนักออกแบบที่ดี: คนที่มักจะได้รับคำถามนั้นถูกต้อง
pdr 11'11

0

ฉันจะบอกว่าไม่ส่วนใหญ่เพราะมันอธิบายเพียงส่วนเล็ก ๆ ของรหัส ฉันพบว่าการใช้งานที่สำคัญที่สุดนั้นอยู่ที่แกนกลางและที่ขอบด้านนอกของพื้นที่ใช้สอยไม่มากนัก ฉันจะยกตัวอย่างบางสิ่งที่ฉันคิดว่าการใช้ซ้ำเป็นตัวชี้วัดที่มีประโยชน์ในการออกแบบคุณภาพ

สิ่งสำคัญ

  • เทมเพลต Webform ที่อนุญาตให้เพิ่มหน้าได้ง่ายและสม่ำเสมอ (หรือสำหรับ UI ประเภทใดก็ได้)
  • ผู้ออกแบบรูปแบบการออกแบบเช่นคลาสพื้นฐาน ViewModel ซึ่งจะรวมอยู่ในแอปพลิเคชัน MVVM ทั้งหมดของฉัน

ยูทิลิตี้ Stuff

  • คลาสอีเมลที่ส่งข้อความ SMTP (ใช้งานได้ตลอดเวลา)
  • คลาสคำนวณระยะทาง GIS (ใช้ในแอพพลิเคชั่นมากมายของเรา)

สำหรับสิ่งที่ CRUD ที่ใช้มากที่สุด 70-80% ของแอพส่วนใหญ่ฉันไม่คิดว่าการใช้ซ้ำเป็นตัวชี้วัดที่มีค่าเลย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.