Đây không chỉ là về Pola, mà còn về việc ngăn chặn trạng thái không hợp lệ như là một nguồn có thể có lỗi.
Hãy xem cách chúng tôi có thể cung cấp một số ràng buộc cho ví dụ của bạn mà không cung cấp triển khai cụ thể:
Bước đầu tiên: Không cho phép bất cứ điều gì được gọi, trước khi một tệp được mở.
CreateDataFileInterface
+ OpenFile(filename : string) : DataFileInterface
DataFileInterface
+ SetHeaderString(header : string) : void
+ WriteDataLine(data : string) : void
+ SetTrailerString(trailer : string) : void
+ Close() : void
Bây giờ rõ ràng là CreateDataFileInterface.OpenFile
phải được gọi để lấy một DataFileInterface
thể hiện, trong đó dữ liệu thực tế có thể được ghi.
Bước thứ hai: Đảm bảo, các tiêu đề và đoạn giới thiệu luôn được đặt.
CreateDataFileInterface
+ OpenFile(filename : string, header: string, trailer : string) : DataFileInterface
DataFileInterface
+ WriteDataLine(data : string) : void
+ Close() : void
Bây giờ bạn phải cung cấp tất cả các tham số cần thiết trả trước để có được DataFileInterface
: tên tệp, tiêu đề và đoạn giới thiệu. Nếu chuỗi trailer không khả dụng cho đến khi tất cả các dòng được ghi, bạn cũng có thể di chuyển tham số này sang Close()
(có thể đổi tên phương thức thành WriteTrailerAndClose()
) để ít nhất tệp không thể kết thúc mà không có chuỗi trailer.
Để trả lời bình luận:
Tôi thích tách giao diện. Nhưng tôi có xu hướng nghĩ rằng đề xuất của bạn về việc thực thi (ví dụ WriteTrailerAndClose ()) đang phản đối việc vi phạm SRP. (Đây là điều mà tôi đã đấu tranh trong một số dịp, nhưng đề nghị của bạn dường như là một ví dụ có thể.) Bạn sẽ trả lời như thế nào?
Thật. Tôi không muốn tập trung vào ví dụ nhiều hơn cần thiết để đưa ra quan điểm của mình, nhưng đó là một câu hỏi hay. Trong trường hợp này tôi nghĩ rằng tôi sẽ gọi nó Finalize(trailer)
và lập luận rằng nó không làm quá nhiều. Viết đoạn giới thiệu và kết thúc chỉ là chi tiết thực hiện. Nhưng nếu bạn không đồng ý hoặc có một tình huống tương tự khác, thì đây là một giải pháp khả thi:
CreateDataFileInterface
+ OpenFile(filename : string, header : string) : IncompleteDataFileInterface
IncompleteDataFileInterface
+ WriteDataLine(data : string) : void
+ FinalizeWithTrailer(trailer : string) : CompleteDataFileInterface
CompleteDataFileInterface
+ Close()
Tôi thực sự sẽ không làm điều đó cho ví dụ này nhưng nó cho thấy cách thực hiện kỹ thuật này.
Nhân tiện, tôi giả định rằng các phương thức thực sự phải được gọi theo thứ tự này, ví dụ để viết tuần tự nhiều dòng. Nếu điều này là không bắt buộc, tôi sẽ luôn thích một người xây dựng, như đề xuất của Ben Cottrel .