สิ่งนี้ไม่เพียงเกี่ยวกับ POLA แต่ยังเกี่ยวกับการป้องกันสถานะที่ไม่ถูกต้องว่าเป็นแหล่งที่มาของข้อบกพร่อง
มาดูกันว่าเราสามารถให้ข้อ จำกัด บางประการกับตัวอย่างของคุณได้อย่างไรโดยไม่ต้องมีการนำไปใช้อย่างเป็นรูปธรรม:
ขั้นตอนแรก: ไม่อนุญาตให้เรียกสิ่งใด ๆ ก่อนที่จะเปิดไฟล์
CreateDataFileInterface
+ OpenFile(filename : string) : DataFileInterface
DataFileInterface
+ SetHeaderString(header : string) : void
+ WriteDataLine(data : string) : void
+ SetTrailerString(trailer : string) : void
+ Close() : void
ตอนนี้มันควรจะชัดเจนว่าCreateDataFileInterface.OpenFile
จะต้องเรียกเพื่อดึงDataFileInterface
อินสแตนซ์ที่สามารถเขียนข้อมูลจริง
ขั้นตอนที่สอง: ตรวจสอบว่าได้ตั้งค่าส่วนหัวและตัวอย่างเสมอ
CreateDataFileInterface
+ OpenFile(filename : string, header: string, trailer : string) : DataFileInterface
DataFileInterface
+ WriteDataLine(data : string) : void
+ Close() : void
ตอนนี้คุณต้องระบุพารามิเตอร์ที่จำเป็นทั้งหมดล่วงหน้าเพื่อรับDataFileInterface
: ชื่อไฟล์ส่วนหัวและส่วนท้าย หากสตริงส่วนท้ายไม่พร้อมใช้งานจนกว่าจะมีการเขียนทุกบรรทัดคุณสามารถย้ายพารามิเตอร์นี้ไปที่Close()
(อาจจะเปลี่ยนชื่อเมธอดเป็นWriteTrailerAndClose()
) เพื่อให้ไฟล์อย่างน้อยไม่สามารถดำเนินการให้เสร็จสิ้นได้หากไม่มีสตริงส่วนท้าย
ในการตอบกลับความคิดเห็น:
ฉันชอบแยกอินเทอร์เฟซ แต่ฉันอยากจะคิดว่าข้อเสนอแนะของคุณเกี่ยวกับการบังคับใช้ (เช่น WriteTrailerAndClose ()) กำลังตรวจสอบว่ามีการละเมิด SRP (นี่คือสิ่งที่ฉันต่อสู้มาหลายครั้ง แต่ข้อเสนอแนะของคุณน่าจะเป็นตัวอย่างที่เป็นไปได้) คุณจะตอบอย่างไร
จริง ฉันไม่ต้องการมีสมาธิกับตัวอย่างมากกว่าที่จำเป็นเพื่อให้ประเด็นของฉัน แต่มันเป็นคำถามที่ดี ในกรณีนี้ฉันคิดว่าฉันจะเรียกมันFinalize(trailer)
และยืนยันว่ามันไม่ได้ทำมากเกินไป การเขียนตัวอย่างและปิดเป็นเพียงรายละเอียดการใช้งาน แต่ถ้าคุณไม่เห็นด้วยหรือมีสถานการณ์คล้ายกันที่แตกต่างกันนี่เป็นวิธีแก้ปัญหาที่เป็นไปได้:
CreateDataFileInterface
+ OpenFile(filename : string, header : string) : IncompleteDataFileInterface
IncompleteDataFileInterface
+ WriteDataLine(data : string) : void
+ FinalizeWithTrailer(trailer : string) : CompleteDataFileInterface
CompleteDataFileInterface
+ Close()
ฉันจะไม่ทำมันสำหรับตัวอย่างนี้จริง ๆ แต่มันแสดงให้เห็นว่าจะส่งผ่านเทคนิคได้อย่างไร
โดยวิธีการที่ฉันคิดว่าวิธีการที่จริงจะต้องเรียกว่าในคำสั่งนี้เช่นการเขียนตามลำดับหลายบรรทัด หากไม่ต้องการสิ่งนี้ฉันจะชอบผู้สร้างเสมอตามที่ Ben Cottrelแนะนำ