Bu sadece POLA ile ilgili değil, aynı zamanda olası bir hata kaynağı olarak geçersiz durumun önlenmesi ile de ilgilidir.
Somut bir uygulama sağlamadan örneğinize nasıl bazı kısıtlamalar sağlayabileceğimizi görelim:
İlk adım: Bir dosya açılmadan önce hiçbir şeyin çağrılmasına izin verme.
CreateDataFileInterface
+ OpenFile(filename : string) : DataFileInterface
DataFileInterface
+ SetHeaderString(header : string) : void
+ WriteDataLine(data : string) : void
+ SetTrailerString(trailer : string) : void
+ Close() : void
Şimdi , gerçek verilerin yazılabileceği CreateDataFileInterface.OpenFile
bir DataFileInterface
örneği almak için çağrılması gerektiği açıktır .
İkinci adım: Başlıkların ve römorkların daima ayarlandığından emin olun.
CreateDataFileInterface
+ OpenFile(filename : string, header: string, trailer : string) : DataFileInterface
DataFileInterface
+ WriteDataLine(data : string) : void
+ Close() : void
Şimdi bir DataFileInterface
dosya adı, başlık ve fragman almak için gerekli tüm parametreleri önceden sağlamanız gerekir . Tüm satırlar yazılana kadar trey dizesi kullanılamıyorsa, bu parametreyi Close()
(büyük olasılıkla yöntemi yeniden adlandırmak WriteTrailerAndClose()
) olarak da taşıyabilirsiniz ; böylece dosyanın en azından bir trey dizesi olmadan tamamlanması mümkün olmaz.
Yorumu yanıtlamak için:
Arayüzün ayrılmasını seviyorum. Ancak, yaptırımla ilgili önerilerinizin (ör. WriteTrailerAndClose ()) SRP ihlali konusunda kararsız olduğunu düşünmeye meyilliyim. (Bu, birkaç kez uğraştığım bir şey, ancak öneriniz olası bir örnek gibi görünüyor.) Nasıl cevap verirdiniz?
Doğru. Demek istediğim daha fazla örnek üzerinde durmak istemedim, ama bu iyi bir soru. Bu durumda bence onu arayacağım Finalize(trailer)
ve çok fazla bir şey yapmadığını iddia ediyorum . Fragmanı yazmak ve kapatmak sadece uygulama detaylarıdır. Ancak, farklı olduğu konusunda aynı fikirde değilseniz veya benzer bir duruma sahipseniz, olası bir çözüm şudur:
CreateDataFileInterface
+ OpenFile(filename : string, header : string) : IncompleteDataFileInterface
IncompleteDataFileInterface
+ WriteDataLine(data : string) : void
+ FinalizeWithTrailer(trailer : string) : CompleteDataFileInterface
CompleteDataFileInterface
+ Close()
Aslında bu örnek için yapmazdım ama sonuçta tekniğin nasıl taşınacağını gösterir.
Bu arada, örneğin sırayla birçok satır yazmak için yöntemlerin aslında bu sırayla çağrılması gerektiğini varsaydım. Bu gerekli değilse, Ben Cottrel'in önerdiği gibi her zaman bir inşaatçı tercih ederim .