ขออภัยสำหรับ necro ในโพสต์นี้ แต่ฉันรู้สึกถูกบังคับให้ต้องคำนึงถึงบางสิ่งที่ดูเหมือนจะไม่ได้รับการสัมผัส
สิ่งสำคัญอันดับแรก - เมื่อเราพบว่าตัวเองต้องการเข้าถึงสมาชิกส่วนตัวในชั้นเรียนในระหว่างการทดสอบหน่วยโดยทั่วไปเป็นธงสีแดงขนาดใหญ่ที่เราได้ทำผิดพลาดในเชิงกลยุทธ์หรือยุทธวิธีและมีการละเมิดหลักความรับผิดชอบโดยไม่ตั้งใจ พฤติกรรมที่ไม่ได้เป็นของ การรู้สึกถึงความจำเป็นในการเข้าถึงวิธีการที่ไม่มีอะไรมากไปกว่ารูทีนย่อยแบบแยกของกระบวนการก่อสร้างเป็นหนึ่งในเหตุการณ์ที่เกิดขึ้นบ่อยที่สุด อย่างไรก็ตามมันก็เหมือนกับเจ้านายของคุณที่คาดหวังว่าคุณจะปรากฏตัวขึ้นสำหรับการทำงานพร้อมไปและยังมีความจำเป็นที่จะต้องรู้ว่ากิจวัตรประจำวันตอนเช้าที่คุณผ่านมาเพื่อให้คุณเข้าสู่สถานะที่ ...
อินสแตนซ์อื่น ๆ ที่พบบ่อยที่สุดของเหตุการณ์นี้คือเมื่อคุณพบว่าตัวเองพยายามทดสอบ "ชั้นพระเจ้า" ที่เป็นสุภาษิต มันเป็นปัญหาแบบพิเศษที่เกิดขึ้นในตัวของมันเอง แต่ก็มีปัญหาพื้นฐานเดียวกันกับที่จำเป็นต้องรู้รายละเอียดของกระบวนการอย่างใกล้ชิด
ในตัวอย่างที่เฉพาะเจาะจงนี้เราได้มอบหมายความรับผิดชอบในการกำหนดค่าเริ่มต้นอย่างสมบูรณ์วัตถุบาร์ให้กับตัวสร้างของ FooBar คลาส ในการเขียนโปรแกรมเชิงวัตถุหนึ่งในผู้เช่าหลักคือว่าตัวสร้างคือ "ศักดิ์สิทธิ์" และควรได้รับการปกป้องจากข้อมูลที่ไม่ถูกต้องซึ่งจะทำให้สถานะภายในของตนเองเป็นโมฆะและปล่อยให้มันล้มเหลวที่อื่นลง (ในสิ่งที่อาจลึกมาก ท่อ.)
เราไม่สามารถทำสิ่งนี้ได้โดยการอนุญาตให้วัตถุ FooBar ยอมรับบาร์ที่ยังไม่พร้อมในเวลาที่สร้าง FooBar และชดเชยด้วยการ "แฮ็ค" วัตถุ FooBar เพื่อให้ความสำคัญกับตัวเอง มือ.
นี่คือผลของความล้มเหลวในการยึดติดกับการเขียนโปรแกรมเชิงวัตถุอื่น ๆ (ในกรณีของ Bar) ซึ่งเป็นสถานะของวัตถุที่จะเริ่มต้นได้อย่างเต็มที่และพร้อมที่จะจัดการกับสายเรียกเข้าใด ๆ กับสมาชิกสาธารณะทันทีหลังจากการสร้าง ตอนนี้ไม่ได้หมายความว่าทันทีหลังจากที่นวกรรมิกถูกเรียกในทุกกรณี เมื่อคุณมีวัตถุที่มีสถานการณ์การก่อสร้างที่ซับซ้อนจำนวนมากดังนั้นจะเป็นการดีกว่าที่จะให้ setters แก่สมาชิกที่เป็นตัวเลือกไปยังวัตถุที่ถูกนำไปใช้ตามรูปแบบการออกแบบการสร้าง (Factory, Builder, ฯลฯ ... ) กรณีหลัง
ในตัวอย่างของคุณคุณสมบัติ "สถานะ" ของบาร์ดูเหมือนจะไม่อยู่ในสถานะที่ถูกต้องซึ่ง FooBar สามารถยอมรับได้ดังนั้น FooBar จึงทำบางสิ่งเพื่อแก้ไขปัญหานั้น
ปัญหาที่สองที่ฉันเห็นคือปรากฏว่าคุณกำลังพยายามทดสอบรหัสของคุณแทนที่จะฝึกพัฒนาโดยใช้การทดสอบ นี่เป็นความเห็นของฉันในเวลานี้ แต่การทดสอบประเภทนี้เป็นรูปแบบต่อต้านจริง ๆ สิ่งที่คุณทำคือตกหลุมพรางของการตระหนักว่าคุณมีปัญหาการออกแบบหลักที่ป้องกันไม่ให้โค้ดของคุณทดสอบได้จริงหลังจากเขียนแบบทดสอบที่คุณต้องการแล้วเขียนโปรแกรมไปทดสอบ ไม่ว่าคุณจะมาที่ปัญหาอย่างไรคุณก็ควรจบด้วยการทดสอบจำนวนมากและบรรทัดของรหัสที่คุณได้รับการใช้งานที่แท้จริง เหตุใดจึงต้องลองทำวิศวกรรมย้อนกลับให้เป็นรหัสที่สามารถทดสอบได้เมื่อคุณสามารถจัดการกับปัญหาเมื่อเริ่มต้นความพยายามในการพัฒนาของคุณ
ถ้าคุณทำอย่างนั้นแล้วคุณจะรู้ก่อนหน้านี้มากว่าคุณจะต้องเขียนโค้ดที่ค่อนข้างลำบากเพื่อทดสอบกับการออกแบบของคุณและจะมีโอกาสก่อนที่จะปรับวิธีการของคุณโดยปรับพฤติกรรมการใช้งาน ทดสอบได้ง่าย