วิธีการแก้ปัญหาควรเป็นทั่วไปที่สุดหรือเฉพาะเจาะจงที่สุด


124

สมมติว่าฉันมีเอนทิตีที่มีแอตทริบิวต์ "ประเภท" อาจมีประเภทที่เป็นไปได้มากกว่า 20 รายการ

ตอนนี้ฉันขอให้ใช้สิ่งที่จะอนุญาตให้เปลี่ยนประเภทจาก A-> B ซึ่งเป็นกรณีการใช้งานเท่านั้น

ดังนั้นฉันควรใช้สิ่งที่อนุญาตให้มีการเปลี่ยนแปลงประเภทโดยพลการตราบเท่าที่พวกเขาเป็นประเภทที่ถูกต้อง? หรือฉันควรอนุญาตให้เปลี่ยนจาก A-> B ตามความต้องการและปฏิเสธการเปลี่ยนแปลงประเภทอื่นเช่น B-> A หรือ A-> C

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

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

แก้ไข:

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


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

2
@ T.Sar เพิ่มคำตอบนี้แล้วฉันจะอัปโหลด :-)
Christophe

4
อะไรคือ“ คำตอบทั่วไป” ในมุมมองของคุณ? นอกจากนี้โปรดอธิบายสิ่งที่คุณหมายถึงโดย "ใช้เฉพาะกรณี" คุณหมายถึงว่าอนุญาตให้มีการเปลี่ยนแปลงจาก A-> B เท่านั้นหรือระบุการเปลี่ยนแปลงเท่านั้นและจะไม่เป็นเงื่อนไขข้อผิดพลาดในการเปลี่ยนจากสถานะอื่นเป็นรัฐอื่น ในฐานะนักพัฒนาที่คุณต้องถามผู้เขียนของกรณีการใช้งานเพื่อชี้แจง หากไม่อนุญาตให้มีการเปลี่ยนแปลงอื่น ๆ และรหัสของคุณอนุญาตโดยไม่คำนึงว่าใครเป็นผู้ควบคุมผู้เรียกรหัสของคุณไม่ผ่านตามข้อกำหนด
RibaldEddie

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

2
ลักษณะทั่วไปของการคลอดก่อนกำหนดอาจทำให้อิจฉาริษยามากเท่ากับการเพิ่มประสิทธิภาพก่อนกำหนด - คุณเลิกเขียนโค้ดจำนวนมากที่อาจไม่เคยใช้ แก้ไขปัญหาที่เฉพาะเจาะจงก่อนจากนั้นพูดคุยตามความต้องการที่เกิดขึ้น
John Bode

คำตอบ:


296

กฎง่ายๆของฉัน:

  1. ครั้งแรกที่คุณพบปัญหาเพียงแก้ไขปัญหาเฉพาะ (นี่คือหลักการYAGNI )
  2. ครั้งที่สองที่คุณพบปัญหาเดียวกันให้พิจารณาเรื่องทั่วไปเป็นกรณีแรกหากไม่ใช่งานมาก
  3. เมื่อคุณมีสามกรณีที่คุณสามารถใช้เวอร์ชันทั่วไปได้คุณควรเริ่มวางแผนเวอร์ชันทั่วไปโดยตอนนี้คุณควรเข้าใจปัญหาดีพอที่จะสรุปได้จริง

แน่นอนว่านี่เป็นแนวทางและไม่ใช่กฎที่ยากและรวดเร็วคำตอบที่แท้จริงคือการใช้วิจารณญาณที่ดีที่สุดของคุณเป็นกรณี ๆ ไป


1
คุณช่วยอธิบายว่า YAGNI คืออะไร?
Bernhard

7
@Bernhard คุณไม่ต้องการมันหรอก หลักการออกแบบซอฟต์แวร์ที่มีประโยชน์มาก
Angew

4
"ที่thing1, thing2คิดลองใช้อาเรย์ที่thing1, thing2, thing3เกือบจะใช้thing[]อาเรย์แทนแน่นอน" เป็นกฎง่ายๆสำหรับการตัดสินใจระหว่างตัวแปรหลายตัวหรืออาเรย์เดี่ยว
Joker_vD

15
อีกวิธีในการระบุกฎ # 1: "คุณไม่สามารถพูดคุยเรื่องเดียวกันได้"
Wayne Conrad

2
@SantiBailors: ดังที่ Doc Brown กล่าวในคำตอบของเขาเรามักจะประเมินค่าสูงไปกว่าจำนวนของความพยายามที่สูญเปล่าอย่างมากมายที่เราอาจใช้จ่ายโดยการสร้างคนแรกที่จะทิ้ง ในThe Mythical Man-Monthเฟร็ดบรูคส์พูดว่า: "วางแผนที่จะทิ้งไป - คุณจะอย่างไรก็ตาม ที่กล่าวว่า: หากคุณพบการใช้งานมากกว่าหนึ่งอย่างในทันที - ตัวอย่างเช่นโดยการส่งชุดของข้อกำหนดที่คุณจะต้องแก้ไขปัญหาเดียวกันอย่างชัดเจนมากกว่าหนึ่งครั้ง - จากนั้นคุณมีมากกว่าหนึ่งกรณีที่จะพูดคุยกันทั่วไป จากและนั่นก็ดีโดยสิ้นเชิงและไม่ขัดแย้งกับคำตอบของฉัน
Daniel Pryden

95

โซลูชันเฉพาะ [... ] ต้องการงานมากขึ้นในอนาคตหากต้องการข้อกำหนดที่คล้ายกัน

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

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

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

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


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

2
@msb: บริบทนั้นถูกเพิ่มเข้ามาหลังจากที่ฉันเขียนคำตอบและตรงกันข้ามกับสิ่งที่ OP พูดมาก่อนโดยเฉพาะในส่วนที่ฉันอ้างถึง ดูการแก้ไขของฉัน
Doc Brown

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

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

2
ฉันจะจินตนาการถึงสำเนียงของคุณเมื่อฉันอ่านคำตอบในอนาคตของคุณ :-)
949300

64

TL: DR:ขึ้นอยู่กับสิ่งที่คุณพยายามแก้ไข

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

เขาเปลี่ยนเทคโนโลยีหลายครั้งในชีวิตของเขา เขาเขียนโค้ดใน C, COBOL, Pascal, BASIC, Fortran, Smalltalk, Java และในที่สุดก็เริ่ม C # เป็นงานอดิเรก ฉันเรียนรู้วิธีการเขียนโปรแกรมกับเขานั่งอยู่บนตักของเขาในขณะที่ฉันเป็นเพียง devling แกะสลักโค้ดบรรทัดแรกของฉันในโปรแกรมแก้ไขสีน้ำเงินของ SideKick ของ IBM ตอนที่ฉันอายุ 20 ฉันใช้เวลาในการเขียนโค้ดมากกว่าเล่นข้างนอก

นั่นเป็นความทรงจำของฉันเล็กน้อยดังนั้นขอโทษด้วยนะถ้าฉันไม่ได้ฝึกฝนจริง ๆ ฉันค่อนข้างชอบช่วงเวลาเหล่านั้น

นั่นคือสิ่งที่เขาพูดกับฉัน:


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

Gramps ใช้เวลาหยุดคิดสักครู่ในขณะที่กำหนดตำแหน่งของแว่นตาของเขาบนใบหน้าของเขา เขากำลังเล่นเกมจับคู่ 3 บนคอมพิวเตอร์ของเขาขณะที่ฟัง LP ของ Deep Purple บนระบบเสียงเก่าของเขา

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

"... ชีส Gramps?"

"ไม่สำคัญว่าคุณจะคิดอย่างไรเกี่ยวกับสิ่งที่คุณชื่นชอบจะมีใครบางคนที่คิดว่ามันเหม็น"

ฉันกระพริบตาสับสนอยู่ครู่หนึ่ง แต่ก่อนที่ฉันจะพูดอะไรก็ตามที่ Gramps ดำเนินต่อไป

"เมื่อคุณสร้างรถยนต์คุณจะเลือกวัสดุสำหรับชิ้นส่วนอย่างไร"

"ฉัน ... ฉันเดาว่ามันขึ้นอยู่กับต้นทุนที่เกี่ยวข้องและส่วนที่ควรทำฉันคิดว่า"

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

โปรแกรมเมอร์ผู้สูงอายุเอื้อมมือไปที่โมเดลรถไฟเลโก้ตัวเล็ก ๆ ที่เขาวางไว้บนโต๊ะก่อนดำเนินการต่อ

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

".. คุณเพียงแค่พูดThe Matrix? "

"อะไร?"

"ไม่มีอะไรไปต่อ"

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

Gramps วางรถไฟเลโก้กลับเข้าที่เดิมและหันกลับไปเล่นเกมจับคู่ที่ 3 ของเขา

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


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


14
ฉันแน่ใจว่ามีบางอย่างที่มีประโยชน์ในเรื่องนั้น แต่มันเจ็บปวดเกินกว่าจะอ่านได้ขอโทษ
GoatInTheMachine

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

16
@ T.Sar ไม่ฟังคนที่เกลียดการโพสต์ของคุณเป็นอัญมณีของคำแนะนำที่มีประโยชน์จากกูรู +1
LLlAMnYP

7
ส่วน "สถาปัตยกรรมซอฟต์แวร์นั้นเหมือนชีส" นั้นช่างยอดเยี่ยมจริงๆ แน่นอนคำตอบนี้เป็นอัญมณี!
Mathieu Guindon

3
บางทีคำตอบนี้ก็เหมือนชีสใช่ไหม ;) แต่โปรด "SmallTalk" ควรจะเป็น "สมอลล์ทอล์ค" และใช่ฉันเป็นว่าคนที่แต่งตัวประหลาดขอโทษ
fede s

14

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

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


13

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

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


คำถามชัดเจนเกี่ยวกับปัญหาที่เป็นรูปธรรม
RibaldEddie

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

7
"คำตอบสแต็คโอเวอร์โฟลว์ควรเป็นคำตอบทั่วไปที่สุดหรือเฉพาะเจาะจงที่สุด"
Lyndon White

@LyndonWhite คำถามสแต็คโอเวอร์โฟลว์ควรเป็นคำถามทั่วไปที่กว้างที่สุด (กว้างเกินไป!) หรือเจาะจงมากที่สุดเท่าที่จะเป็นไปได้ ฮ้า

4

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

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

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

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


"คุณพลาดบั๊กทั้งหมดที่คุณไม่ได้รหัส" (จากโปสเตอร์บาสเก็ตบอล: คุณพลาดทุกช็อตที่คุณไม่ได้ถ่าย)

3

เป็นการยากที่จะให้คำตอบทั่วไปสำหรับปัญหาเฉพาะนี้ ;-)

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

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

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


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

  2. การทดสอบ สำหรับการแปลง A-> B ฉันจะต้องเขียนการทดสอบหนึ่ง (หรือจำนวนเล็กน้อย) สำหรับการแปลง x-> y ทั่วไปฉันอาจต้องเขียนเมทริกซ์การทดสอบทั้งหมด นั่นเป็นสิ่งที่ใช้งานได้มากกว่าแม้ว่าการแปลงทั้งหมดจะมีการใช้งานร่วมกันเพียงครั้งเดียว

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

  3. การแต่งงานกัน ตัวแปลงจาก A ถึง B อาจจำเป็นต้องทราบรายละเอียดการใช้งานเกี่ยวกับ A's และ B (การมีเพศสัมพันธ์อย่างแน่นหนา) หาก A และ B ยังคงมีการพัฒนาอยู่นั่นหมายความว่าฉันอาจต้องกลับไปที่ตัวแปลง (และการทดสอบ) ซึ่งมันดูด แต่อย่างน้อยก็ จำกัด A และ B อยู่

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

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


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

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

3

วิธีการแก้ปัญหาควรเป็นทั่วไปที่สุดหรือเฉพาะเจาะจงที่สุด

นั่นไม่ใช่คำถามที่ตอบได้

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

  1. ครั้งแรกประมาณสั่งซื้อ: กฎ YAGNI ปกติของสามตามที่อธิบายไว้โดยแดเนียล Pryden หมอสีน้ำตาล, et al,

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

    ดังนั้นข้อสันนิษฐานเบื้องต้นคือเราทำสิ่งที่เฉพาะเจาะจงที่สุด

  2. การประมาณอันดับสอง: จากความรู้ของผู้เชี่ยวชาญเกี่ยวกับโดเมนโซลูชันของคุณ

    โซลูชัน "ทั่วไป" ในกรณีนี้ต้องใช้งานน้อยกว่าโซลูชัน "เฉพาะ"

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

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

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

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

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


2

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

ในการตอบคำถามของคุณจริงคุณต้องพิจารณาว่างานของคุณมักจะไม่ใช้สิ่งที่เปลี่ยนแปลง A-> B หากคุณเป็นผู้รับเหมาอาจเป็นข้อกำหนด แต่ถ้าคุณเป็นพนักงานคุณจะได้รับการว่าจ้างให้ทำงานเล็ก ๆ น้อย ๆ ให้กับ บริษัท การเปลี่ยน A-> B เป็นเพียงหนึ่งในภารกิจเหล่านั้น บริษัท ของคุณจะใส่ใจว่าการเปลี่ยนแปลงในอนาคตนั้นสามารถทำได้ดีเพียงใดแม้ว่าจะไม่ได้ระบุไว้ในคำขอ ในการค้นหา "TheBestImplementation (tm)" คุณต้องดูภาพขนาดใหญ่ของสิ่งที่คุณถูกขอให้ทำจริง ๆ จากนั้นใช้สิ่งนั้นเพื่อตีความคำขอเล็ก ๆ น้อย ๆ ที่คุณได้รับเพื่อเปลี่ยน A-> B

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

ฉันสามารถให้ตัวอย่างที่เป็นรูปธรรมซึ่งคำถามของคุณมีคำตอบที่ชัดเจนตามบริบท พิจารณากรณีที่คุณกำลังเขียนซอฟต์แวร์ที่สำคัญต่อความปลอดภัย ซึ่งหมายความว่าคุณมีทีมทดสอบยืนขึ้นเพื่อให้แน่ใจว่าผลิตภัณฑ์ทำงานได้ตามที่สัญญาไว้ ทีมทดสอบเหล่านี้บางกลุ่มจำเป็นต้องทดสอบทุกเส้นทางที่เป็นไปได้ผ่านรหัส หากคุณพูดคุยกับพวกเขาคุณอาจพบว่าถ้าคุณพูดคุยเรื่องพฤติกรรมคุณจะเพิ่ม $ 30,000 เป็นค่าใช้จ่ายในการทดสอบเพราะพวกเขาจะต้องทดสอบเส้นทางพิเศษเหล่านั้นทั้งหมด ในกรณีดังกล่าวอย่าเพิ่มฟังก์ชันการทำงานทั่วไปแม้ว่าคุณจะต้องทำซ้ำงาน 7 หรือ 8 ครั้งเพราะมัน ประหยัดเงินของ บริษัท และทำสิ่งที่ร้องขอตามที่ระบุไว้

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


1

อืม ... บริบทไม่มากนักสำหรับคำตอบ ... สะท้อนคำตอบก่อนหน้านี้ "ขึ้นอยู่กับ"

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

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

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

หากกรณีทั่วไปยากขึ้นฉันจะถามก่อนเริ่มงาน แต่ในกรณีของคุณถ้าฉันสามารถ 'ทำนาย' ว่า 'คำขอ' การเปลี่ยนแปลงประเภทอื่นจะมาในอนาคตฉันจะถูกล่อลวงไป: ก) เขียนสิ่งที่สามารถใช้ซ้ำได้สำหรับกรณีทั่วไปและ b) ห่อไว้ในเงื่อนไขที่อนุญาตให้ A -> B เท่านั้นในตอนนี้

ง่ายพอที่จะตรวจสอบกรณีปัจจุบันในการทดสอบอัตโนมัติและง่ายพอที่จะเปิดตัวเลือกอื่น ๆ ในภายหลังหาก / เมื่อกรณีการใช้งานที่แตกต่างกันเกิดขึ้น


1

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

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

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


0

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

โดยหลักการแล้วใช่ แต่นี่ไม่ได้นำไปสู่การแก้ปัญหาทั่วไป

มีหัวข้อสองประเภทในการพัฒนาซอฟต์แวร์เท่าที่ฉันกังวลซึ่งคุณควรคาดการณ์การเปลี่ยนแปลงในอนาคต:

  • ห้องสมุดที่ตั้งใจจะใช้โดยบุคคลที่สามและ
  • สถาปัตยกรรมซอฟต์แวร์โดยรวม

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

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

  • YAGNI (คุณไม่ gonna จำเป็นต้องใช้มัน) บอกคุณจะใช้ขั้นต่ำอย่างแน่นอนสิ่งพื้นฐานที่คุณต้องการและการใช้งานในขณะนี้ มันหมายถึงการใช้ขั้นต่ำที่ทำให้ชุดการทดสอบปัจจุบันของคุณเปลี่ยนจากสีแดงเป็นสีเขียวถ้าคุณควรใช้การพัฒนารูปแบบ TDD / BDD / FDD ไม่มากไปกว่าบรรทัดเดียว
  • แห้ง (ไม่ซ้ำตัวเอง) หมายความว่าถ้าคุณมาเกี่ยวกับปัญหาที่คล้ายกันอีกครั้งแล้วคุณจะดูยากดีที่ไม่ว่าคุณจะต้องแก้ปัญหาทั่วไป

เมื่อรวมกับวิธีปฏิบัติที่ทันสมัยอื่น ๆ (เช่นการครอบคลุมการทดสอบที่ดีเพื่อให้สามารถ refactor ได้อย่างปลอดภัย) ซึ่งหมายความว่าคุณท้ายด้วยโค้ดที่เขียนได้อย่างรวดเร็วเอนเอียงซึ่งเติบโตขึ้นตามที่ต้องการ

สิ่งที่ดูเหมือนโซลูชั่นทั่วไปเป็นวิธีที่จะไป?

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

ดู ORM สมัยใหม่หรือกรอบงาน MVC เช่น Ruby on Rails ในระดับแอปพลิเคชันการมุ่งเน้นทั้งหมดคือการทำงานที่ไม่ใช่ทั่วไป เห็นได้ชัดว่า Rails library นั้นเกือบ 100% ทั่วไป แต่รหัสโดเมน (ซึ่งเป็นคำถามของคุณ) ควรทำ shenanigans น้อยที่สุดในด้านนั้น


0

วิธีคิดเกี่ยวกับปัญหาที่แตกต่างคือพิจารณาว่าอะไรเหมาะสม

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

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

แน่นอนมันทำให้รู้สึกถึงการแปลงประเภทเฉพาะ มันสมเหตุสมผลหรือไม่ที่จะทำการแปลงประเภทเพิ่มเติมหรือไม่

โปรดทราบว่าหากการแก้ปัญหาทั่วไปเร็วกว่าการดำเนินการกรณี apecific ก็ง่ายเช่นกันเพียงตรวจสอบว่าเป็นการแปลงประเภทเดียวที่คุณอนุญาต

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

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