คุณจะทำลายหลักการ DRY โดยวางตรรกะการตรวจสอบความถูกต้องทุกที่ที่ใช้รหัสไปรษณีย์
ในทางกลับกันเมื่อต้องรับมือกับหลาย ๆ ประเทศและระบบรหัสไปรษณีย์ที่แตกต่างกันนั่นหมายความว่าคุณไม่สามารถตรวจสอบรหัสไปรษณีย์ได้จนกว่าคุณจะทราบประเทศที่เป็นปัญหา ดังนั้นZipCode
ชั้นเรียนของคุณต้องจัดเก็บประเทศด้วย
แต่คุณแยกเก็บประเทศเป็นส่วนหนึ่งของAddress
(ซึ่งรหัสไปรษณีย์นี้ยังเป็นส่วนหนึ่งของ) และส่วนหนึ่งของรหัสไปรษณีย์ (สำหรับการตรวจสอบ)
- หากคุณเป็นเช่นนั้นคุณกำลังละเมิด DRY เช่นกัน แม้ว่าคุณจะไม่เรียกว่าเป็นการละเมิดแบบ DRY (เนื่องจากแต่ละอินสแตนซ์มีจุดประสงค์ที่แตกต่างกัน) แต่ก็ยังจำเป็นต้องใช้หน่วยความจำเพิ่มเติมโดยไม่จำเป็นนอกจากการเปิดประตูสู่ข้อบกพร่องเมื่อค่าประเทศทั้งสองแตกต่างกัน จะ)
- หรือมิฉะนั้นจะทำให้คุณต้องซิงโครไนซ์จุดข้อมูลสองจุดเพื่อให้แน่ใจว่าจุดเหล่านั้นเหมือนกันเสมอซึ่งแนะนำว่าคุณควรเก็บข้อมูลนี้ไว้ในจุดเดียวจริงๆ
- ถ้าคุณไม่มีก็ไม่ใช่
ZipCode
คลาส แต่เป็นAddress
คลาสซึ่งอีกครั้งจะมีคลาสstring ZipCode
ซึ่งหมายความว่าเรามาเต็มวงกลมแล้ว
ตัวอย่างเช่นฉันสามารถพูดคุยกับนักวิเคราะห์ธุรกิจเกี่ยวกับรหัสไปรษณีย์แทนที่จะเป็นสตริงที่มีรหัสไปรษณีย์
ประโยชน์คือคุณสามารถพูดคุยเกี่ยวกับพวกเขาเมื่ออธิบายรูปแบบโดเมน
ฉันไม่เข้าใจคำยืนยันพื้นฐานของคุณว่าเมื่อข้อมูลชิ้นหนึ่งมีประเภทของตัวแปรที่กำหนดคุณจะต้องกล่าวถึงประเภทนั้นเมื่อใดก็ตามที่คุณพูดคุยกับนักวิเคราะห์ธุรกิจ
ทำไม? ทำไมคุณถึงไม่สามารถพูดถึง "รหัสไปรษณีย์" และละเว้นประเภทเฉพาะได้อย่างสมบูรณ์ คุณกำลังทำการสนทนาประเภทใดกับนักวิเคราะห์ธุรกิจของคุณ (ไม่ใช่ด้านเทคนิค!) โดยที่ประเภทของทรัพย์สินนั้นมีความสำคัญต่อการสนทนา
ฉันมาจากไหนรหัสไปรษณีย์เป็นตัวเลขเสมอ ดังนั้นเราจึงมีทางเลือกที่เราจะได้เก็บไว้เป็นหรือเป็นint
string
เรามักจะใช้สตริงเพราะไม่มีความคาดหวังของการดำเนินการทางคณิตศาสตร์กับข้อมูล แต่ไม่เคยมีนักวิเคราะห์ธุรกิจบอกฉันว่ามันต้องเป็นสตริง การตัดสินใจนั้นขึ้นอยู่กับนักพัฒนา (หรือนักวิเคราะห์ทางเทคนิคเนื้อหาแม้ว่าในประสบการณ์ของฉันพวกเขาไม่ได้จัดการกับ nitty gritty โดยตรง)
นักวิเคราะห์ธุรกิจไม่สนใจประเภทข้อมูลตราบใดที่แอปพลิเคชันทำในสิ่งที่คาดหวังไว้
การตรวจสอบความถูกต้องเป็นสัตว์หากินเพื่อจัดการเพราะมันขึ้นอยู่กับสิ่งที่มนุษย์คาดหวัง
สำหรับหนึ่งฉันไม่เห็นด้วยกับข้อโต้แย้งการตรวจสอบเป็นวิธีที่จะแสดงว่าทำไมความหลงใหลครอบงำดั้งเดิมควรหลีกเลี่ยงเพราะฉันไม่เห็นด้วยว่าข้อมูล (เป็นความจริงสากล) จะต้องได้รับการตรวจสอบตลอดเวลา
ตัวอย่างเช่นจะเกิดอะไรขึ้นถ้านี่เป็นการค้นหาที่ซับซ้อนกว่านี้ แทนที่จะเป็นการตรวจสอบรูปแบบที่ง่ายจะเกิดอะไรขึ้นถ้าการตรวจสอบของคุณเกี่ยวข้องกับการติดต่อ API ภายนอกและรอการตอบกลับ คุณต้องการบังคับให้แอปพลิเคชันของคุณเรียก API ภายนอกนี้สำหรับZipCode
วัตถุทุกชิ้นที่คุณสร้างอินสแตนซ์หรือไม่
อาจเป็นข้อกำหนดทางธุรกิจที่เข้มงวดและแน่นอนว่ามันสมเหตุสมผล แต่นี่ไม่ใช่ความจริงสากล จะมีกรณีการใช้งานมากมายซึ่งเป็นภาระมากกว่าที่เป็นวิธีแก้ปัญหา
ตัวอย่างที่สองเมื่อป้อนที่อยู่ของคุณในแบบฟอร์มการป้อนรหัสไปรษณีย์ของคุณอยู่หน้าประเทศของคุณ ในขณะที่มันเป็นเรื่องดีที่จะมีข้อเสนอแนะการตรวจสอบทันทีใน UI จริง ๆ แล้วมันจะเป็นอุปสรรคต่อฉัน (ในฐานะผู้ใช้) ถ้าแอปพลิเคชันแจ้งเตือนฉันในรูปแบบ zipcode "ผิด" เพราะแหล่งที่แท้จริงของปัญหาคือ (เช่น) ประเทศของฉันไม่ใช่ประเทศที่เลือกตามค่าเริ่มต้นและทำให้การตรวจสอบเกิดขึ้นสำหรับประเทศที่ไม่ถูกต้อง
มันเป็นข้อความแสดงข้อผิดพลาดที่ผิดซึ่งกวนใจผู้ใช้และทำให้เกิดความสับสนโดยไม่จำเป็น
เช่นเดียวกับวิธีการตรวจสอบความถูกต้องไม่สิ้นสุดไม่ใช่ความจริงสากลและไม่ใช่ตัวอย่างของฉัน มันเป็นบริบท บางโดเมนแอปพลิเคชันต้องการการตรวจสอบความถูกต้องของข้อมูลเหนือสิ่งอื่นใด โดเมนอื่นไม่มีการตรวจสอบความถูกต้องที่อยู่ในรายการลำดับความสำคัญเนื่องจากความยุ่งยากที่เกิดขึ้นขัดแย้งกับลำดับความสำคัญที่แท้จริงของตน (เช่นประสบการณ์ผู้ใช้หรือความสามารถในการเก็บข้อมูลที่ผิดพลาดในขั้นต้นเพื่อให้สามารถแก้ไขได้ เก็บไว้)
วันเดือนปีเกิด: ตรวจสอบว่ามีมากกว่าจิตใจและน้อยกว่าวันที่วันนี้
เงินเดือน: ตรวจสอบว่ามากกว่าหรือเท่ากับศูนย์
ปัญหาเกี่ยวกับการตรวจสอบความถูกต้องเหล่านี้คือพวกเขาไม่สมบูรณ์ซ้ำซ้อนหรือบ่งบอกถึงปัญหาที่ใหญ่กว่ามาก
การตรวจสอบว่าวันที่มีค่ามากกว่าความคิดนั้นซ้ำซ้อน ใจจริงหมายถึงว่ามันเป็นวันที่เล็กที่สุดที่เป็นไปได้ นอกจากนี้คุณจะวาดเส้นของความเกี่ยวข้องที่ไหน มีจุดประสงค์อะไรในการป้องกันDateTime.MinDate
แต่ยอมให้DateTime.MinDate.AddSeconds(1)
? คุณกำลังกระตุ้นให้มีค่าเฉพาะที่ไม่ผิดโดยเฉพาะเมื่อเทียบกับค่าอื่น ๆ
วันเกิดของฉันคือ 2 มกราคม 1978 (ไม่ใช่ แต่ลองคิดดูนะ) แต่สมมุติว่าข้อมูลในใบสมัครของคุณผิดและมันบอกว่าวันเกิดของฉันคือ:
- 1 มกราคม 1978
- 1 มกราคม 1722
- 1 มกราคม 2355
วันที่เหล่านี้ทั้งหมดไม่ถูกต้อง ไม่มีใครในพวกเขา "ถูกกว่า" กว่าคนอื่น แต่กฎการตรวจสอบของคุณจะจับได้เพียงหนึ่งในสามตัวอย่างนี้เท่านั้น
คุณได้ละเว้นบริบทของการใช้ข้อมูลนี้อย่างสมบูรณ์ หากมีการใช้งานในเช่นบอทเตือนความจำวันเกิดฉันจะบอกว่าการตรวจสอบนั้นไม่มีประโยชน์เพราะไม่มีผลที่ไม่ดีเป็นพิเศษในการกรอกวันที่ผิด
ในทางตรงกันข้ามถ้านี้เป็นข้อมูลของรัฐบาลและคุณจำเป็นต้องวันเกิดเพื่อเป็นตัวตนของใครบางคนรับรองความถูกต้อง (และล้มเหลวในการทำเช่นนั้นจะนำไปสู่ผลกระทบที่ไม่ดีเช่นการปฏิเสธการรักษาความปลอดภัยคนสังคม) แล้วความถูกต้องของข้อมูลเป็นสิ่งสำคัญยิ่งและคุณจำเป็นต้องได้อย่างเต็มที่ตรวจสอบข้อมูล การตรวจสอบความถูกต้องที่คุณเสนอตอนนี้ไม่เพียงพอ
สำหรับเงินเดือนมีสามัญสำนึกบางอย่างที่ไม่สามารถลบได้ แต่ถ้าคุณคาดหวังว่าจะมีการป้อนข้อมูลที่ไร้สาระจริงแนบเนียนฉันขอแนะนำให้คุณตรวจสอบแหล่งที่มาของข้อมูลไร้สาระนี้ เพราะหากพวกเขาไม่สามารถเชื่อถือได้ในการป้อนข้อมูลที่มีเหตุผลคุณจึงไม่สามารถเชื่อถือได้เพื่อป้อนข้อมูลที่ ถูกต้อง
หากคุณคำนวณเงินเดือนโดยใช้ใบสมัครของคุณแทนและอาจเป็นไปได้ที่จะมีตัวเลขติดลบ (และถูกต้อง) ดังนั้นวิธีที่ดีกว่าคือMath.Max(myValue, 0)
การเปลี่ยนตัวเลขติดลบให้เป็น 0 แทนที่จะตรวจสอบล้มเหลว เพราะถ้าตรรกะของคุณตัดสินใจว่าผลลัพธ์นั้นเป็นจำนวนลบการไม่ผ่านการตรวจสอบหมายความว่ามันจะต้องทำการคำนวณซ้ำและไม่มีเหตุผลที่จะคิดว่ามันจะเกิดขึ้นกับตัวเลขที่แตกต่างกันในครั้งที่สอง
และหากมีตัวเลขที่แตกต่างกันมันจะทำให้คุณสงสัยว่าการคำนวณไม่สอดคล้องกันดังนั้นจึงไม่น่าเชื่อถือ
นี่ไม่ได้เป็นการบอกว่าการตรวจสอบไม่มีประโยชน์ แต่การตรวจสอบที่ไม่มีจุดหมายนั้นไม่ดีทั้งคู่เพราะต้องใช้ความพยายามในขณะที่ไม่ได้แก้ปัญหาจริงๆและให้ความรู้สึกที่ผิด ๆ กับความปลอดภัย