เราควรหลีกเลี่ยงการใช้รูปแบบการออกแบบในโครงการที่เปลี่ยนแปลงตลอดเวลาหรือไม่?


32

เพื่อนของฉันกำลังทำงานให้กับ บริษัท เล็ก ๆ ในโครงการที่ผู้พัฒนาทุกคนจะเกลียด: เขาถูกกดดันให้ปล่อยตัวโดยเร็วที่สุดเขาเป็นคนเดียวที่ดูเหมือนจะสนใจหนี้ทางเทคนิคลูกค้าไม่มีพื้นฐานด้านเทคนิค ฯลฯ

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

เราต้องแสดงผลิตภัณฑ์ในที่ต่างๆบนเว็บไซต์ ตัวอย่างเช่นผู้จัดการเนื้อหาสามารถดูผลิตภัณฑ์ แต่ยังรวมถึงผู้ใช้หรือคู่ค้าผ่าน API

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

แรงบันดาลใจจากการอ่านล่าสุดของฉันเกี่ยวกับรูปแบบการออกแบบผมคิดว่านี่คือโอกาสที่ดีที่จะใช้ที่มีมนต์ขลังรูปแบบวัตถุ Null ดังนั้นฉันจึงทำและทุกอย่างราบรื่นและสะอาด มีเพียงแค่โทรproduct.Price.ToString("c")เพื่อแสดงราคาหรือproduct.Description.Currentแสดงคำอธิบาย; ไม่จำเป็นต้องมีเงื่อนไข จนกระทั่งวันหนึ่งผู้มีส่วนได้เสียขอให้แสดงต่างกันใน API โดยมี a nullใน JSON และยังแตกต่างกันสำหรับผู้จัดการเนื้อหาด้วยการแสดง "ราคาไม่ระบุ [เปลี่ยน]" และฉันต้องฆ่ารูปแบบวัตถุ Null ที่รักของฉันเพราะมันไม่จำเป็นอีกต่อไป

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

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

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

อะไรจะเป็นทางออกในกรณีนี้?

  • ไม่ได้ใช้รูปแบบการออกแบบหยุดคิดและเขียนรหัสโดยตรงหรือไม่

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

  • รักษารูปแบบการออกแบบที่ไม่สมเหตุสมผลอีกต่อไปและลองเพิ่มรูปแบบเพิ่มเติมสำหรับสถานการณ์ที่สร้างขึ้นใหม่หรือไม่

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

  • เริ่มคิดถึงการออกแบบใหม่ที่ครอบคลุมความต้องการใหม่แล้วค่อยๆปรับโครงสร้างการออกแบบเก่าให้เป็นใหม่

    ในฐานะนักทฤษฎีและผู้ที่ชื่นชอบเปรียว ในทางปฏิบัติเมื่อคุณรู้ว่าคุณจะต้องกลับไปที่ไวท์บอร์ดทุกสัปดาห์และทำซ้ำส่วนใหญ่ของการออกแบบก่อนหน้านี้และลูกค้าก็มีเงินไม่พอที่จะจ่ายเงินให้คุณและไม่มีเวลาพอที่จะรอ สิ่งนี้อาจไม่ทำงาน

ดังนั้นข้อเสนอแนะใด ๆ


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

5
นอกจากนี้ FWIW ลูกค้าที่ไม่มีความอดทนต่อค่าใช้จ่ายในการดริฟท์ก็ไม่ควรทำแบบ Agile ยกเว้นว่ามีค่าใช้จ่ายในการเปลี่ยนความต้องการ
Robert Harvey

5
ฉันสงสัยว่าหากไม่มีรูปแบบการออกแบบรหัสก็จะเข้าสู่สภาวะที่ไม่สามารถรักษาได้เร็วกว่านี้
Steven A. Lowe

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

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

คำตอบ:


86

ฉันเห็นสมมติฐานที่ผิดพลาดในคำถามนี้:

  • รหัสที่มีรูปแบบการออกแบบแม้ว่าการใช้อย่างถูกต้องนั้นต้องใช้เวลามากขึ้นกว่าการใช้รหัสโดยไม่มีรูปแบบเหล่านั้น

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

  • ลูกค้าต้องตำหนิเพราะเขาไม่มีพื้นฐานด้านเทคนิคและไม่สนใจเกี่ยวกับการติดต่อกันหรือการเชื่อมโยงของผลิตภัณฑ์

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

  • ทางออกสำหรับความต้องการที่เปลี่ยนแปลงอย่างรวดเร็วคือการเปลี่ยนรหัสอย่างรวดเร็ว

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


30
+1 - คุณไม่สามารถแก้ปัญหาคนด้วยโซลูชันทางเทคนิค
Telastyn

1
+1 แต่ "หรืออย่างน้อยก็ดีกว่า evolvable (นั่นหมายความว่าง่ายกว่าที่จะปรับให้เข้ากับความต้องการที่เปลี่ยนแปลง)" - ฉันจะมีคุณสมบัตินี้ด้วยความต้องการที่เปลี่ยนแปลงอย่างสมเหตุสมผลใช่ไหม?
Fuhrmanator

1
@Fuhrmanator: ฉันคิดว่ามันยากที่จะพูดคุยในแง่ทั่วไป IMHO เป็นที่ชัดเจนว่าไม่มีรูปแบบการออกแบบที่จะช่วยคุณได้เมื่อความต้องการแรกของคุณคือ "เราต้องการโปรแกรมประมวลผลคำ" และการเปลี่ยนแปลงนี้เป็น "เราต้องการโปรแกรมจำลองการบิน" สำหรับการเปลี่ยนแปลงข้อกำหนดที่น้อยลงนั้นไม่ใช่เรื่องง่ายที่จะตัดสินใจว่าอะไรจะช่วยให้คุณพัฒนาซอฟต์แวร์ของคุณได้ สิ่งที่ดีที่สุดคือ IMHO ที่จะไม่ใช้รูปแบบมากเกินไป แต่มีหลักการบางอย่าง - ส่วนใหญ่เป็นหลักการที่มั่นคงและ YAGNI และฉันเห็นด้วย 100% กับ Telastyn - เมื่อความต้องการเปลี่ยนแปลงบ่อยเกินไปมันอาจไม่ใช่ปัญหาทางเทคนิค
Doc Brown

4
+1 - "สุจริตถ้า 'อินเทอร์เฟซพื้นฐานเปลี่ยนสองครั้งต่อวันเป็นเวลาสามเดือน' ดังนั้นโซลูชันไม่ควรตอบสนองโดยการเปลี่ยนรหัสวันละสองครั้งวิธีแก้ปัญหาที่แท้จริงคือถามว่าทำไมความต้องการเปลี่ยนแปลงบ่อยครั้งและหาก เป็นไปได้ที่จะทำการเปลี่ยนแปลงในส่วนนั้นของกระบวนการ "ถ้าคุณได้รับทิศทางใหม่อย่างต่อเนื่องคุณควรจะนั่งกับผู้มีส่วนได้ส่วนเสียทั้งหมดและยืนยันสิ่งที่คาดหวังไว้ ทำความแตกต่างของคุณและหวังว่าจะไม่เสียเวลาและเงินของทุกคนด้วยการทำให้เป้าหมายชัดเจนยิ่งขึ้น
krillgar

1
@Cornelius Doc Brown กล่าวว่ามันยากโดยไม่ต้อง concreteness ความต้องการที่เพิ่มขึ้นจากโปรแกรมประมวลผลคำไปยังโปรแกรมจำลองการบินจะไม่สมเหตุสมผล ไม่มีรูปแบบการออกแบบที่จะช่วยได้ มีพื้นที่สีเทาจำนวนมากอยู่ระหว่างตัวอย่างและเพิ่มรูปแบบไฟล์ใหม่ให้กับฟังก์ชั่นบันทึกของโปรแกรมประมวลผลคำ (ซึ่งเหมาะสมมาก) เป็นการยากที่จะพูดคุย นอกจากนี้ไม่ใช่ว่าจะไม่ต้องการเปลี่ยนแปลง การเปลี่ยนแปลงดังกล่าวเป็นเรื่องยากหากคุณได้เลือกตัวเลือกการออกแบบมาก่อนตามความต้องการ โปรแกรมประมวลผลคำเทียบกับ flight sim เป็นตัวอย่างที่ยอดเยี่ยมของตัวเลือกแรก
Fuhrmanator

43

ความเห็นต่ำต้อยของฉันคือคุณไม่ควรหลีกเลี่ยงหรือไม่หลีกเลี่ยงการใช้รูปแบบการออกแบบ

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

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

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


13
+1 "รูปแบบการออกแบบเป็นที่รู้จักกันดีและเชื่อถือได้ในการแก้ปัญหาทั่วไปที่ได้รับชื่อพวกเขาไม่ได้แตกต่างกันในด้านเทคนิคมากกว่าวิธีการแก้ปัญหาหรือการออกแบบอื่น ๆ ที่คุณสามารถนึกได้" เผง ผู้คนสับสนในรูปแบบการออกแบบที่มีชื่อซึ่งพวกเขาลืมสิ่งเหล่านี้ไม่ได้เป็นอะไรมากไปกว่าชื่อที่กำหนดไว้ในกลยุทธ์ต่างๆเพื่อให้โปรแกรมเมอร์เขียนโปรแกรมสื่อสารกับกันและกันเกี่ยวกับรหัสและตัวเลือกการออกแบบของเราได้ง่ายขึ้น ทัศนคติแบบนี้เป็นมากมักจะเกี่ยวข้องกับความพยายามที่จะบังคับไม่เหมาะสม "รูปแบบ" เกี่ยวกับปัญหาที่ไม่จำเป็นต้องได้รับประโยชน์ - รับประทานอาหารขนาดใหญ่
Jason C

14

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

ดังนั้นเมื่อรูปแบบการออกแบบไม่เป็นไปตามข้อกำหนดเราจะบอกว่ารูปแบบการออกแบบทั้งหมดต้องเสียเวลาหรือเราบอกว่าเราต้องการรูปแบบการออกแบบที่แตกต่างกันหรือไม่?


9

มันจะปรากฏความผิดพลาดมากกว่าการลบวัตถุรูปแบบมากกว่าที่จะใช้พวกเขา ในการออกแบบเริ่มต้นวัตถุ Null ดูเหมือนจะให้วิธีแก้ไขปัญหา นี่อาจไม่ใช่ทางออกที่ดีที่สุด

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

ผูกมัดอ้างอิงในการ product.Price.toString แบบฟอร์ม ( 'C') ละเมิดกฎหมายของ Demeter ฉันได้เห็นปัญหาทุกประเภทเกี่ยวกับการฝึกนี้ซึ่งหลาย ๆ เรื่องที่เกี่ยวข้องกับการเป็นโมฆะ วิธีการเช่น product.displayPrice ('c') สามารถจัดการราคาที่เป็นโมฆะภายใน product.Description.Current สามารถจัดการได้โดย product.displayDescription (), product.displayCurrentDescription () หรือ product.diplay ('ปัจจุบัน')

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

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


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

7

คำถามดูเหมือนจะผิดที่หลายจุด แต่สิ่งที่เห็นได้ชัดคือ:

  • สำหรับรูปแบบวัตถุ Null ที่คุณกล่าวถึงหลังจากข้อกำหนดเปลี่ยนไปคุณเปลี่ยนรหัสเล็กน้อย ไม่เป็นไร แต่ก็ไม่ได้หมายความว่าคุณ 'สังหาร' Null Object Pattern (btw โปรดระวังข้อความของคุณเสียงนี้ฟังดูสุดขั้วเกินไปบางคนหวาดระแวงเกินไปที่จะไม่เห็นว่ามันตลกเลย)

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

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

จากประสบการณ์ของฉันเมื่อความต้องการเล็กน้อยมาถึงคุณจะต้องเปลี่ยนส่วนเล็ก ๆ ของ codebase เท่านั้น บางคนอาจแฮ็คเล็กน้อย แต่ไม่มีอะไรจริงจังเกินไปที่จะส่งผลกระทบอย่างมากต่อการบำรุงรักษาหรือการอ่านและมักจะแสดงความคิดเห็นไม่กี่บรรทัดเพื่ออธิบายส่วนแฮ็คที่เพียงพอ นี่คือการปฏิบัติที่เหมือนกันมากเช่นกัน


7

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

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

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

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

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

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

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

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

แก้ไข

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


+1 สิ่งเหล่านี้เป็นความคิดที่ดีมากเกี่ยวกับระดับที่สูงมากฉันคิดว่าคุณต้องมองในระบบ แต่อย่างที่คุณพูดมันต้องใช้ประสบการณ์มากมายในการออกแบบซอฟต์แวร์
ซามูเอล

4

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

เนื่องจากมีปัญหาที่แตกต่างกันสองด้านคือด้านเทคนิคและความสัมพันธ์ระหว่างบุคคลฉันจะพูดคุยแยกกัน

ความสัมพันธ์ระหว่างบุคคล

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

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

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

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

วิชาการ

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

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

หลักการที่อยู่เบื้องหลังวัตถุว่างเปล่าคือแนวคิดของการห่อหุ้มสิ่งที่แตกต่างกันไป เราซ่อนสิ่งที่เปลี่ยนแปลงดังนั้นเราจึงไม่ต้องจัดการกับมันในที่อื่น ที่นี่วัตถุ null ถูกห่อหุ้มความแปรปรวนในproduct.Priceอินสแตนซ์ (ฉันจะเรียกมันว่าPriceวัตถุและราคาวัตถุ null จะเป็นNullPrice) Priceเป็นวัตถุโดเมนแนวคิดธุรกิจ บางครั้งในตรรกะทางธุรกิจของเราเรายังไม่ทราบราคา สิ่งนี้เกิดขึ้น กรณีการใช้งานที่สมบูรณ์แบบสำหรับวัตถุ null Prices มีToStringเมธอดที่ส่งออกราคาหรือสตริงว่างถ้าไม่ทราบ (หรือNullPrice#ToStringส่งคืนสตริงว่าง) นี่เป็นพฤติกรรมที่สมเหตุสมผล จากนั้นความต้องการเปลี่ยนแปลง

เราต้องส่งออกnullไปยังมุมมอง API หรือสตริงที่แตกต่างกันไปยังมุมมองของผู้จัดการ สิ่งนี้ส่งผลกระทบต่อตรรกะทางธุรกิจของเราอย่างไร ก็ไม่เป็นไร ในข้อความข้างต้นฉันใช้คำว่า 'มุมมอง' สองครั้ง คำนี้อาจไม่พูดอย่างชัดเจน แต่เราต้องฝึกตัวเองให้ได้ยินคำที่ซ่อนอยู่ในข้อกำหนด เหตุใด 'มุมมอง' จึงสำคัญมาก เพราะมันบอกเราว่าการเปลี่ยนแปลงจะเกิดขึ้นจริง : ในมุมมองของเรา

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

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

if(product.Price.ToString("c").Length == 0) { // one way of many
    writer.write("Price unspecified [Change]");
} else {
    writer.write(product.Price.ToString("c"));
}

สิ่งนี้มีผลต่อการห่อหุ้มอย่างไร ส่วนที่สำคัญที่สุดที่นี่คือมุมมองตรรกะจะห่อหุ้มในมุมมอง เราสามารถแยกลอจิกธุรกิจ / วัตถุโดเมนออกจากการเปลี่ยนแปลงในมุมมองตรรกะด้วยวิธีนี้ มันน่าเกลียด แต่มันได้ผล นี่ไม่ใช่ตัวเลือกเดียวเท่านั้น

เราสามารถพูดได้ว่าตรรกะทางธุรกิจของเรามีการเปลี่ยนแปลงเพียงเล็กน้อยที่เราต้องการที่จะส่งออกสตริงเริ่มต้นหากไม่มีการตั้งราคา เราสามารถปรับแต่งเล็กน้อยกับPrice#ToStringวิธีการของเรา(จริง ๆ แล้วสร้างวิธีการโอเวอร์โหลด) เราสามารถยอมรับค่าส่งคืนเริ่มต้นและส่งคืนได้หากไม่มีการกำหนดราคา:

class Price {
    ...
    // A new ToString method
    public string ToString(string c, string default) {
        return ToString(c);
    }
    ...
}

class NullPrice {
    ...
    // A new ToString method
    public string ToString(string c, string default) {
        return default;
    }
    ...
}

และตอนนี้รหัสมุมมองของเรากลายเป็น:

writer.write(product.Price.ToString("c", "Price unspecified [Change]"));

เงื่อนไขหายไป อย่างไรก็ตามการทำเช่นนี้มากเกินไปสามารถเพิ่มวิธีการกรณีพิเศษลงในวัตถุโดเมนของคุณดังนั้นจึงเหมาะสมถ้ามีเพียงไม่กี่กรณี

เราสามารถสร้างIsSetวิธีการPriceที่คืนค่าบูลีนแทน:

class Price {
    ...
    public bool IsSet() {
        return return true;
    }
    ...
}

class NullPrice {
    ...
    public bool IsSet() {
        return false;
    }
    ...
}

ดูตรรกะ:

if(product.Price.IsSet()) {
    writer.write(product.Price.ToString("c"));
} else {
    writer.write("Price unspecified [Change]");
}

เราเห็นการกลับมาของเงื่อนไขในมุมมอง แต่กรณีมีความแข็งแกร่งสำหรับตรรกะทางธุรกิจที่บอกว่าราคาถูกตั้งไว้ เราสามารถใช้Price#IsSetที่อื่นตอนนี้ที่เรามีให้

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

class PriceStringHelper {
    public PriceStringHelper() {}

    public string PriceToString(Price price, string default) {
        if(price.IsSet()) { // or use string length to not change the Price class at all
           return price.ToString("c");
        } else {
            return default;
        }
    }
}

ดูตรรกะ:

writer.write(new PriceStringHelper().PriceToString(product.Price, "Price unspecified [Change]"));

มีหลายวิธีที่จะทำการเปลี่ยนแปลง (เราสามารถพูดคุยPriceStringHelperเป็นวัตถุที่ส่งกลับค่าเริ่มต้นหากสตริงว่างเปล่า) แต่สิ่งเหล่านี้เป็นวิธีที่รวดเร็วสองสามอย่างที่เก็บรักษาไว้ (ส่วนใหญ่) ทั้งรูปแบบและหลักการตามที่ เช่นเดียวกับในทางปฏิบัติของการเปลี่ยนแปลงดังกล่าว


3

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

จุดผันแปรเอกสาร (เป็นความเสี่ยง) ตามข้อกำหนด

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

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

Craig Larman พูดถึงสองโอกาสในการใช้รูปแบบที่ได้รับการป้องกัน:

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

นักพัฒนาทั้งสองควรได้รับการบันทึกไว้โดยนักพัฒนาซอฟต์แวร์ แต่คุณควรมีข้อผูกพันกับลูกค้าในประเด็นการเปลี่ยนแปลง

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

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

CONSTANTS ในรหัสที่มาเป็นรูปแบบที่เรียบง่ายของ PV

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


2

ฉันคิดว่าอย่างน้อยส่วนหนึ่งขึ้นอยู่กับลักษณะของสถานการณ์ของคุณ

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

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

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

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