Ini bukan hanya tentang POLA, tetapi juga tentang mencegah keadaan tidak sah sebagai kemungkinan sumber bug.
Mari kita lihat bagaimana kami dapat memberikan beberapa kendala pada contoh Anda tanpa memberikan implementasi konkret:
Langkah pertama: Jangan biarkan apa pun dipanggil, sebelum file dibuka.
CreateDataFileInterface
+ OpenFile(filename : string) : DataFileInterface
DataFileInterface
+ SetHeaderString(header : string) : void
+ WriteDataLine(data : string) : void
+ SetTrailerString(trailer : string) : void
+ Close() : void
Sekarang harus jelas bahwa CreateDataFileInterface.OpenFile
harus dipanggil untuk mengambil DataFileInterface
contoh, di mana data aktual dapat ditulis.
Langkah kedua: Pastikan, header dan trailer selalu diatur.
CreateDataFileInterface
+ OpenFile(filename : string, header: string, trailer : string) : DataFileInterface
DataFileInterface
+ WriteDataLine(data : string) : void
+ Close() : void
Sekarang Anda harus memberikan semua parameter yang diperlukan dimuka untuk mendapatkan DataFileInterface
: nama file, header dan trailer. Jika string trailer tidak tersedia hingga semua baris ditulis, Anda juga dapat memindahkan parameter ini ke Close()
(kemungkinan mengubah nama metode WriteTrailerAndClose()
) sehingga file setidaknya tidak dapat diselesaikan tanpa string trailer.
Untuk membalas komentar:
Saya suka pemisahan antarmuka. Tapi saya cenderung berpikir bahwa saran Anda tentang penegakan (misalnya WriteTrailerAndClose ()) sedang melakukan pelanggaran terhadap SRP. (Ini adalah sesuatu yang telah saya perjuangkan dengan beberapa kesempatan, tetapi saran Anda tampaknya menjadi contoh yang mungkin). Bagaimana Anda merespons?
Benar. Saya tidak ingin lebih berkonsentrasi pada contoh daripada yang perlu untuk membuat poin saya, tapi itu pertanyaan yang bagus. Dalam hal ini saya pikir saya akan menyebutnya Finalize(trailer)
dan berpendapat bahwa itu tidak terlalu banyak. Menulis trailer dan menutup adalah detail implementasi belaka. Tetapi jika Anda tidak setuju atau memiliki situasi yang sama di mana itu berbeda, berikut ini adalah solusi yang mungkin:
CreateDataFileInterface
+ OpenFile(filename : string, header : string) : IncompleteDataFileInterface
IncompleteDataFileInterface
+ WriteDataLine(data : string) : void
+ FinalizeWithTrailer(trailer : string) : CompleteDataFileInterface
CompleteDataFileInterface
+ Close()
Saya tidak akan benar-benar melakukannya untuk contoh ini tetapi ini menunjukkan bagaimana melakukan teknik tersebut secara konsekuen.
By the way, saya berasumsi bahwa metode sebenarnya harus dipanggil dalam urutan ini, misalnya untuk menulis banyak baris secara berurutan. Jika ini tidak diperlukan, saya selalu lebih suka pembangun, seperti yang disarankan oleh Ben Cottrel .