Doğrulama kodunu yerleştirebileceğimiz seçeneklere bakalım:
- Oluşturucudaki ayarlayıcıların içinde.
- İçinde
build()
yöntemle.
- Oluşturulan varlığın içinde: Varlığın
build()
yaratılması sırasında yöntem çağrılır .
Seçenek 1 , sorunları daha önce tespit etmemize izin verir, ancak girdiyi yalnızca tam içeriğe sahip olarak doğrulayabildiğimizde karmaşık durumlar olabilir, böylece build()
yöntemde doğrulamanın en azından bir kısmını yaparsınız . Bu nedenle, seçenek 1'in seçilmesi, validasyonun bir yerinde yapılması ve bir başka bölümünün başka bir yerde yapılmasıyla tutarsız koda yol açacaktır.
Seçenek 2 , seçenek 1'den önemli ölçüde daha kötü değildir, çünkü genellikle oluşturucudaki ayarlayıcılar build()
, özellikle de akıcı arayüzlerde hemen önce çağrılır . Bu nedenle, çoğu durumda bir sorunu yeterince erken tespit etmek hala mümkündür. Ancak, oluşturucu bir nesneyi yaratmanın tek yolu değilse, doğrulama kodunun çoğaltılmasına yol açar, çünkü nesneyi oluşturduğunuz her yerde bulundurmanız gerekir. Bu durumda en mantıklı çözüm, doğrulamayı, yaratılan nesneye mümkün olduğu kadar yakın hale getirmek olacaktır. Ve bu seçenek 3 .
SOLID bakış açısından, oluşturucuya doğrulama koymak aynı zamanda SRP'yi de ihlal eder: oluşturucu sınıfı zaten bir nesne oluşturmak için verileri toplama sorumluluğuna sahiptir. Doğrulama, kendi iç devletinde sözleşmeler yapmaktır, başka bir nesnenin durumunu kontrol etmek yeni bir sorumluluktur.
Bu nedenle, benim açımdan, sadece tasarım perspektifinden geç kalmamak daha iyi bir şey değil, aynı zamanda yapının kendisinde değil, inşa edilen varlık içinde başarısız olmak daha iyidir.
UPD: bu yorum , bir daha olasılıkla, hatırlattığında, oluşturucu içindeki doğrulama (seçenek 1 veya 2) anlamlıdır. Yapıcının yarattığı nesneler üzerinde kendi sözleşmelerinin olup olmadığı mantıklıdır. Örneğin, sayı aralıkları listesi gibi belirli bir içeriğe sahip bir dize oluşturan bir oluşturucumuz olduğunu varsayalım 1-2,3-4,5-6
. Bu oluşturucu gibi bir yöntem olabilir addRange(int min, int max)
. Ortaya çıkan dize bu numaralar hakkında hiçbir şey bilmez, ne bilmesi gerekir de. Oluşturucu, dizgenin biçimini ve sayılardaki kısıtlamaları tanımlar. Bu nedenle, yöntem addRange(int,int)
giriş numaralarını doğrulamalı ve eğer maksimum min. Değerden küçükse bir istisna atmalıdır.
Bununla birlikte, genel kural yalnızca inşaatçı tarafından tanımlanan sözleşmeleri doğrulamak olacaktır.