Uygulamamızın kaynak kodunda, bir sınıfın aynı adlara ve farklı parametrelere sahip birçok yöntemi olduğu oldukça fazla yerimiz var. Bu yöntemler her zaman bir 'önceki' yöntemin artı bir tane daha parametresine sahiptir.
Bu uzun evrimin (eski kod) ve bu düşüncenin (inanıyorum) bir sonucudur:
" A şeyi yapan bir M yöntemi var. A + B yapmalıyım. Tamam, biliyorum ... M'ye yeni bir parametre ekleyeceğim, bunun için yeni bir yöntem oluşturacağım, M'den yeni yönteme kod taşıyacağım bir parametre daha ile, orada A + B yapın ve M'den yeni yöntemi varsayılan olarak yeni parametrenin değeriyle çağırın. "
İşte bir örnek (Java benzeri bir dilde):
class DocumentHome {
(...)
public Document createDocument(String name) {
// just calls another method with default value of its parameter
return createDocument(name, -1);
}
public Document createDocument(String name, int minPagesCount) {
// just calls another method with default value of its parameter
return createDocument(name, minPagesCount, false);
}
public Document createDocument(String name, int minPagesCount, boolean firstPageBlank) {
// just calls another method with default value of its parameter
return createDocument(name, minPagesCount, false, "");
}
public Document createDocument(String name, int minPagesCount, boolean firstPageBlank, String title) {
// here the real work gets done
(...)
}
(...)
}
Bunun yanlış olduğunu hissediyorum. Sadece böyle yeni parametreler sonsuza kadar ekleyemeyiz, aynı zamanda yöntemler arasındaki tüm bağımlılıklar nedeniyle kodun genişletilmesi / değiştirilmesi zor.
İşte bunu daha iyi yapmanın birkaç yolu:
Bir parametre nesnesi ekleyin:
class DocumentCreationParams { String name; int minPagesCount; boolean firstPageBlank; String title; (...) } class DokumentHome { public Document createDocument(DocumentCreationParams p) { // here the real work gets done (...) } }
DocumentHome
Aramadan önce parametreleri nesneye ayarlayıncreateDocument()
@In DocumentHome dh = null; (...) dh.setName(...); dh.setMinPagesCount(...); dh.setFirstPageBlank(...); Document newDocument = dh.createDocument();
Çalışmayı farklı yöntemlere ayırın ve gerektiği gibi çağırın:
@In DocumentHome dh = null; Document newDocument = dh.createDocument(); dh.changeName(newDocument, "name"); dh.addFirstBlankPage(newDocument); dh.changeMinPagesCount(new Document, 10);
Sorularım:
- Açıklanan sorun gerçekten bir sorun mu?
- Önerilen çözümler hakkında ne düşünüyorsunuz? Hangisini tercih edersiniz (deneyiminize dayanarak)?
- Başka bir çözüm düşünebiliyor musunuz?