การลบค่าตายตัวและการออกแบบการป้องกันเทียบกับ YAGNI


10

พื้นหลังเล็กน้อยก่อน ฉันกำลังค้นหารหัสจากอายุ -> อัตรา มีวงเล็บอายุ 7 รายการดังนั้นตารางการค้นหาคือ 3 คอลัมน์ (จาก | ถึง | อัตรา) ด้วย 7 แถว ค่าไม่ค่อยมีการเปลี่ยนแปลง - เป็นอัตราที่มีการออกกฎหมาย (คอลัมน์แรกและคอลัมน์ที่สาม) ที่มีค่าคงเดิมเป็นเวลา 3 ปี ฉันคิดว่าวิธีที่ง่ายที่สุดในการจัดเก็บตารางนี้โดยไม่ต้องเข้ารหัสยากอยู่ในฐานข้อมูลในตารางการกำหนดค่าส่วนกลางเป็นค่าข้อความเดียวที่มี CSV (ดังนั้น "65,69,0.05,70,74,0.06" เป็นวิธีการที่ 65-69 และ 70-74 ชั้นจะถูกเก็บไว้) ค่อนข้างง่ายต่อการแยกวิเคราะห์แล้วใช้

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

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

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

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

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

แก้ไขในขณะที่คำตอบทั้งหมดน่าสนใจมากเพราะฉันคิดว่านี่เป็นตัวเลือกการออกแบบของแต่ละคน แต่ฉันคิดว่าคำตอบที่ดีที่สุดคือ@ Corbin'sและ@EZ Hart'sเนื่องจากพวกเขานำสิ่งที่ฉันไม่ได้พิจารณามาพิจารณา:

  • การแบ่งแยกขั้วที่ผิดพลาดของ 'การลบค่าที่กำหนดรหัสยาก' โดยการย้ายไปยังฐานข้อมูล vs 'การใช้ YAGNI อย่างมีประสิทธิภาพ' โดยใช้การเข้ารหัสแบบยาก มีตัวเลือกที่สามในการวางตารางการค้นหาลงในการกำหนดค่าแอพซึ่งไม่ได้เกิดค่าใช้จ่ายในทางที่ถูกต้องและไม่มีประสิทธิภาพของ YAGNI โดยทั่วไปเราไม่ได้ จำกัด อยู่เพียงแค่ / หรือการตัดสินใจและจากนั้นจะเป็นการตัดสินใจด้านราคา / ผลประโยชน์
  • การสร้างรหัสสามารถลดค่าใช้จ่ายในการย้ายค่าฮาร์ดโค้ดไปยังฐานข้อมูลและในทางที่จะลบการตัดสินใจที่เกินกำหนดของฉันเพื่อประมวลผล CSV ลงในตาราง อาจเป็นไปได้ว่าปัญหานี้จะเพิ่มปัญหาการบำรุงรักษาในระยะยาวด้วยรหัสที่สร้างขึ้นหากความต้องการพื้นฐานเปลี่ยนไปสำหรับวิธีการค้นหา ทั้งหมดนี้มีผลต่อการวิเคราะห์ค่าใช้จ่าย / ผลประโยชน์และเป็นไปได้ว่าถ้าฉันมีระบบอัตโนมัติที่ใช้ได้ฉันจะไม่คิดเลยว่าจะเขียนโค้ดแบบนี้

ฉันกำลังทำเครื่องหมาย @ คำตอบของ Corbin ให้ถูกต้องเพราะมันเปลี่ยนสมมติฐานการพัฒนาต้นทุนและฉันอาจจะเพิ่มเครื่องมือสร้างรหัสบางอย่างลงในคลังแสงของฉันในอนาคตอันใกล้


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

คำตอบ:


6

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

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

โอ้และไม่เก็บข้อมูลของคุณในรูปแบบที่ต้องการการประมวลผลเพิ่มเติม (CSV) นั่นเป็นเพียงการเพิ่มขั้นตอนพิเศษที่ต้องการความสนใจและการทดสอบของคุณ


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

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

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

10

หากต้องการปิดและขยายคำตอบของ @ Thorbjørn Ravn Andersen: การคำนวณ / ค้นหาในที่เดียวเป็นการเริ่มต้นที่ดี

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

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

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

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

โชคดี


1
+1 สำหรับจุดที่สองของคุณ ฉันไม่ได้ลองเดาว่าสภานิติบัญญัติจะทำอะไรในอนาคต
David Thornley

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

คำตอบที่ดีที่สุดและสมบูรณ์ที่สุด +1
Andy

7

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


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

ขอบคุณสำหรับคำตอบของคุณ การใช้การค้นหาในที่เดียวเป็นการออกแบบที่ดีอย่างแน่นอน
Rebecca Scott

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

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

แล้วปัญหาคืออะไร เมื่อราคาเปลี่ยนแปลงคุณอัปเดตรหัสและจัดส่งไปยังลูกค้าทุกคน

2

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

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

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

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

นี่จะเป็นแนวทางของฉัน :)


ขอบคุณ @Oscar ส่วนทางเทคนิคของนั่นคือ def แก้ไข. และฉันเห็นด้วยกับวิธีที่คุณจะเข้าถึงปัญหาโดยการปรับสภาพเฉพาะเมื่อจำเป็นเท่านั้น ดังนั้นคุณกำลังบอกว่าในฐานะมืออาชีพเราสามารถและควรเลือกหลักการออกแบบของเราโดยพิจารณาจากต้นทุน / ผลประโยชน์เท่านั้น? มีเหตุผล.
Rebecca Scott

@Ben Scott: ยินดีต้อนรับ :) ใช่ในมุมมองของฉันหลักการออกแบบถูกสร้างขึ้น / แคตตาล็อกไม่ได้เพราะพวกเขาดูสวยงาม แต่เพราะพวกเขานำผลประโยชน์เช่นรหัส "ความสะอาด" ความยืดหยุ่นความแข็งแกร่ง ฯลฯ แต่มีคำถาม 2 ข้อเสมอ: 1- ฉันต้องการสิ่งนั้นหรือไม่ ? 2- ข้อ จำกัด ของฉัน (เวลาเทคนิค ฯลฯ ) อนุญาตให้ฉันนำไปใช้หรือไม่ นี่คือสิ่งที่ทำให้ฉันเลือกหลักการออกแบบของฉัน over-engineering ก็ไม่ดี;) ps: ถ้าคุณคิดว่ามันเป็นคำตอบที่น่าสนใจกรุณาโหวตให้คนอื่นอ่านด้วยความน่าจะเป็นที่สูงขึ้น ขอบคุณ! :)
JSBach

upvoted ;-)
Rebecca Scott

2

นี่คือรายการที่ "จะไม่เปลี่ยนแปลง" จนกว่าจะมี มันหลีกเลี่ยงไม่ได้ที่มันจะเปลี่ยนแปลง แต่เวลานั้นอาจจะค่อนข้างไกล

การให้เหตุผลของคุณถูกต้อง ในเวลานี้ลูกค้าไม่ได้ขอความสามารถในการเปลี่ยนแปลงอัตราเหล่านั้นได้อย่างง่ายดาย เช่น YAGNI

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

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

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


ขอบคุณ @berin ฉันไม่ได้พูดถึง SRP ในคำถาม แต่มันอยู่ในแผน จุดที่ดีให้เป็นเจ้าของปัญหากลับไปที่ลูกค้า
Rebecca Scott

การตัดสินว่าเมื่อใดที่สิ่งต่าง ๆ ผิดพลาดในอนาคตดูเหมือนจะไม่เป็นมืออาชีพสำหรับฉัน
Andy

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

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

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

2

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

โดยปกติเมื่อคุณกำลังมองหาตัวเลือกระหว่างสองขั้ว (ละเมิด YAGNI กับข้อมูลไดนามิกที่เข้ารหัสยาก) คำตอบที่ดีที่สุดคือที่ตรงกลาง ระวังการแบ่งขั้วที่ผิดพลาด

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


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

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

2

ฉันคิดว่าวิธีที่ง่ายที่สุดในการจัดเก็บตารางนี้โดยไม่ต้องเข้ารหัสยากอยู่ในฐานข้อมูลในตารางการกำหนดค่าส่วนกลางเป็นค่าข้อความเดียวที่มี CSV (ดังนั้น "65,69,0.05,70,74,0.06" เป็นวิธีการที่ 65-69 และ 70-74 ชั้นจะถูกเก็บไว้

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

ตารางต้องการ 2 ฟิลด์ไม่ใช่ 3. อายุและอัตรา แถวถัดไปนี้มีค่าสูงสุด! คุณกำลังทำให้ปกติโดยที่ไม่รู้ตัว!

นี่คือ Sql เพื่อรับอัตราสำหรับคนที่อายุ 67 ปี

Select * from RateTable where Age in (Select max(age) from RateTable where age <=67) 

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

แก้ไข: ตามที่คนอื่นพูดว่ารักษารหัสได้รับอัตราการรวมศูนย์ในกรณีที่โครงสร้าง chages ทั้งอัตรา


สวัสดี @Morons ขอขอบคุณสำหรับคำตอบของคุณ ตารางจะต้องมี 3 คอลัมน์ มันเป็นอัตราเดียวต่อช่วงอายุอายุขั้นต่ำถึงอายุสูงสุด (65-69 ปีอยู่ที่ 5%) และฉันกำลังเก็บข้อมูลเพียงเล็กน้อยเพื่อจุดประสงค์ที่ จำกัด ดังนั้นสิ่งที่ผิดพลาดในการสร้างโครงสร้างและการไปหา CSV แทนที่จะเป็นตารางเฉพาะทั้งหมดคืออะไร ฉันอาจจะเพิ่มตัวคั่นแถวและแยกตามแถวแล้วคอลัมน์และดึงคอลัมน์ลงในฟิลด์ที่ต้องการ มันจะอ่านมากกว่าเขียนอยู่เสมอดังนั้นฉันจึงไม่กังวลเกี่ยวกับตารางเต็ม
Rebecca Scott

แถวถัดไปมีค่าสูงสุดของช่วง ... นี่คือการทำซ้ำของข้อมูล การพูด <69 และ> 7 นั้นเป็นสิ่งเดียวกัน เหตุผลเดียวที่มีค่าทั้งสองคือถ้าช่วงสามารถมีรูได้ ... ฉันกำลังบอกว่าจะใช้ตารางเพราะมันง่ายกว่า (และการออกแบบที่ดีกว่า) ฉันไม่เข้าใจว่าทำไมคุณคิดว่าการจัดเก็บ csv ในตารางจะช่วยให้คุณประหยัดเวลาหรือความพยายามคุณยังต้องใช้การเรียก DB เพื่อรับสายนั้นจากนั้นคุณต้องแยกวิเคราะห์ ดังที่ฉันแสดงให้คุณเห็นด้านบนคุณจะได้รับอัตราค่าโทรฐานเดียว
Morons

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

1
"คุณกำลังทำให้เสียศีลธรรมโดยไม่รู้ตัว!" - ตอนแรกฉันคิดว่านี่เป็นตัวพิมพ์ผิดและคุณหมายถึง 'denormalizing' แต่ยิ่งฉันคิดเกี่ยวกับเรื่องนี้มากเท่าไหร่มันก็ยิ่งดูเหมือนว่าคุณจะถูกทางใดทางหนึ่งมากขึ้น :)
EZ Hart

@ez hart LOL จริง
Rebecca Scott

1

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

ฉันมีความทรงจำที่ห่างไกลจากการอ่านคนที่มีความคล่องแคล่ว / OOP (เช่น Dave Thomas หรือ Kent Beck หรือบางคน) ที่บอกว่ากฎง่ายๆสำหรับการทำสำเนารหัสเป็นสองครั้งและสองครั้งเท่านั้น: อย่า refactor ในครั้งแรกที่คุณทำซ้ำตั้งแต่ คุณอาจเคยเขียนมันสองครั้งในชีวิตของคุณ แต่ครั้งที่สาม ...

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


ขอบคุณ @Dave นั่นเป็นประโยชน์ ฉันเป็นผู้ดูแลเพียงคนเดียวจากการลงทะเบียน แต่มันเป็นฐานรหัสขนาดใหญ่ที่ค่อนข้างเสถียร (หลายพันไฟล์กว่า 100 ตาราง ฯลฯ ) และฉันก็ยังประหลาดใจอยู่ตลอดเวลา ความมั่นคงเป็นหนึ่งในเป้าหมายของฉันในอนาคต
Rebecca Scott

0

รหัสยากในฟังก์ชั่น

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

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