ควรทำการตรวจสอบความถูกต้องโดยเร็วที่สุด
การตรวจสอบความถูกต้องในบริบทใด ๆ ไม่ว่าจะเป็นรูปแบบโดเมนหรือวิธีการเขียนซอฟต์แวร์อื่น ๆ ควรทำหน้าที่ตามวัตถุประสงค์ของสิ่งที่คุณต้องการตรวจสอบและในระดับที่คุณอยู่ในขณะนี้
จากคำถามของคุณฉันเดาว่าคำตอบคือการแยกการตรวจสอบออก
การตรวจสอบความถูกต้องของคุณสมบัติตรวจสอบว่าค่าสำหรับคุณสมบัตินั้นถูกต้องเช่นเมื่อช่วงระหว่าง 1-10 ถูก expeced
การตรวจสอบความถูกต้องของวัตถุรับประกันว่าคุณสมบัติทั้งหมดในวัตถุนั้นจะถูกใช้งานร่วมกันได้ เช่น BeginDate อยู่ก่อน EndDate สมมติว่าคุณอ่านค่าจากแหล่งข้อมูลและทั้ง BeginDate และ EndDate จะเริ่มต้นได้ที่ DateTime.Min โดยค่าเริ่มต้น เมื่อตั้งค่า BeginDate จะไม่มีเหตุผลที่จะบังคับใช้กฎ "ต้องเป็นก่อนวันที่สิ้นสุด" เนื่องจากสิ่งนี้ไม่ได้ใช้ YET กฎนี้ควรถูกตรวจสอบหลังจากตั้งค่าคุณสมบัติทั้งหมดแล้ว สิ่งนี้สามารถเรียกได้ที่ระดับรากรวม
การตรวจสอบควรถูก preformed ในเอนทิตีรวม (หรือรากรวม) วัตถุคำสั่งซื้ออาจมีข้อมูลที่ถูกต้องและมันเป็น OrderLines แต่กฎธุรกิจระบุว่าไม่มีคำสั่งซื้ออาจมีมูลค่าเกิน $ 1,000 คุณจะบังคับใช้กฎนี้อย่างไรในบางกรณีการอนุญาตนี้ คุณไม่สามารถเพิ่มคุณสมบัติ "อย่าตรวจสอบจำนวนเงิน" ได้เนื่องจากจะนำไปสู่การใช้งานที่ไม่เหมาะสม (ไม่ช้าก็เร็วคุณอาจจะได้รับ "คำขอที่น่ารังเกียจ" ออกไป)
ถัดไปคือการตรวจสอบที่ชั้นนำเสนอ คุณกำลังจะส่งวัตถุผ่านเครือข่ายจริงหรือไม่โดยรู้ว่ามันจะล้มเหลว? หรือคุณจะสำรองผู้ใช้ burdon นี้และแจ้งให้เขาทราบทันทีที่เขาป้อนค่าที่ไม่ถูกต้อง เช่นเวลาส่วนใหญ่สภาพแวดล้อม DEV ของคุณจะช้ากว่าการผลิต คุณต้องการรอเป็นเวลา 30 วินาทีก่อนที่คุณจะได้รับแจ้งว่า "คุณลืมฟิลด์นี้อีกครั้งในระหว่างที่ยังมีการทดสอบการทำงานอีกครั้ง" โดยเฉพาะอย่างยิ่งเมื่อมีข้อผิดพลาดในการผลิตที่ต้องแก้ไขกับหัวหน้าของคุณ
การตรวจสอบที่ระดับการคงอยู่นั้นน่าจะใกล้เคียงกับการตรวจสอบความถูกต้องของค่าคุณสมบัติมากที่สุด วิธีนี้จะช่วยป้องกันข้อยกเว้นในการอ่านข้อผิดพลาด "null" หรือ "ค่าที่ไม่ถูกต้อง" เมื่อใช้ตัวแม็พของตัวอ่านข้อมูลชนิดเก่าหรือแบบธรรมดา การใช้โพรซีเดอร์ที่เก็บไว้จะช่วยแก้ปัญหานี้ได้ แต่ต้องเขียนตรรกะการเทียบเคียงเดียวกันอีกครั้งและดำเนินการอีกครั้ง และขั้นตอนการจัดเก็บคือโดเมนผู้ดูแลระบบ DB ดังนั้นอย่าพยายามทำงานของเขาด้วย (หรือแย่กว่านั้นกวนใจเขาด้วย
เพื่อบอกด้วยคำพูดที่มีชื่อเสียง "มันขึ้นอยู่" แต่อย่างน้อยตอนนี้คุณรู้ว่าทำไมมันขึ้นอยู่
ฉันหวังว่าฉันจะวางทั้งหมดนี้ไว้ในที่เดียว แต่น่าเสียดายที่นี่ไม่สามารถทำได้ การทำสิ่งนี้จะทำให้การพึ่งพา "วัตถุพระเจ้า" ที่มีการตรวจสอบทั้งหมดสำหรับทุกชั้น คุณไม่ต้องการที่จะลงไปในเส้นทางมืด
ด้วยเหตุนี้ฉันเพียงแค่ตรวจสอบข้อยกเว้นระดับคุณสมบัติ ระดับอื่น ๆ ทั้งหมดที่ฉันใช้ ValidationResult ด้วยวิธี IsValid เพื่อรวบรวม "กฎที่เสียหาย" และส่งต่อให้กับผู้ใช้ใน AggregateException เดียว
เมื่อแพร่กระจายสแต็คการโทรฉันจะรวบรวมสิ่งเหล่านี้อีกครั้งใน AggregateExceptions จนกว่าฉันจะไปถึงเลเยอร์การนำเสนอ ชั้นบริการสามารถส่งข้อยกเว้นนี้ตรงไปยังลูกค้าในกรณีที่ WCF เป็น FaultException
สิ่งนี้ช่วยให้ฉันสามารถยกเว้นและแยกมันขึ้นเพื่อแสดงข้อผิดพลาดของแต่ละบุคคลในการควบคุมการป้อนข้อมูลหรือทำให้เรียบและแสดงในรายการเดียว ทางเลือกเป็นของคุณ
นี่คือเหตุผลที่ฉันยังกล่าวถึงการตรวจสอบการนำเสนอเพื่อลัดวงจรเหล่านี้ให้มากที่สุด
ในกรณีที่คุณสงสัยว่าทำไมฉันถึงมีการตรวจสอบที่ระดับการรวม (หรือระดับการให้บริการหากคุณต้องการ) นั่นเป็นเพราะฉันไม่มีลูกบอลคริสตัลบอกฉันว่าใครจะใช้บริการของฉันในอนาคต คุณจะมีปัญหาในการค้นหาความผิดพลาดของตัวเองมากพอที่จะป้องกันไม่ให้คนอื่นทำผิดพลาดด้วยตัวคุณเอง :) โดยการป้อนข้อมูลที่ไม่ถูกต้องคุณจัดการแอปพลิเคชัน A เดาว่าพวกเขาถามใครก่อนเมื่อมีข้อบกพร่อง? ผู้ดูแลระบบของแอปพลิเคชัน B จะแจ้งให้ผู้ใช้ทราบอย่างมีความสุข "ไม่มีข้อผิดพลาดในตอนท้ายฉันเพิ่งป้อนข้อมูล"