Martin Fowler'in Refactoring kitabındaki ortak kod kokularını okuyorum . Bu bağlamda, bir kod tabanı içinde gördüğüm bir model merak ediyordum ve biri objektif bir anti-desen olarak düşünebilir olsun.
Desen, bir nesnenin, tümü nesnenin durumunu değiştiren ancak hiçbiri nesneyi döndürmeyen bir veya daha fazla yönteme argüman olarak iletildiği modeldir. Bu nedenle (bu durumda) C # /. NET'in referans niteliğine göre geçişe dayanmaktadır.
var something = new Thing();
// ...
Foo(something);
int result = Bar(something, 42);
Baz(something);
(Özellikle yöntemler uygun şekilde adlandırılmadığında), nesnenin durumunun değişip değişmediğini anlamak için bu tür yöntemlere bakmam gerektiğini buluyorum. Kod yığınını daha karmaşık hale getirir, çünkü çağrı yığınının birden fazla seviyesini izlemem gerekir.
Yeni durum ile başka bir (klonlanmış) nesne veya çağrı sitesinde nesneyi değiştirmek için gereken bir şey döndürmek için bu tür kodu geliştirmek öneriyoruz.
var something1 = new Thing();
// ...
// Let's return a new instance of Thing
var something2 = Foo(something1);
// Let's use out param to 'return' other info about the operation
int result;
var something3 = Bar(something2, out result);
// If necessary, let's capture and make explicit complex changes
var changes = Baz(something3)
something3.Apply(changes);
Bana öyle geliyor ki varsayımlar üzerinde ilk kalıp seçilmiş
- daha az iş olduğunu veya daha az kod satırı gerektirdiğini
- Her iki değişim nesnesi bize imkan verdiğini ve bazı bilgileri diğer parçasını iade
- daha az örneğimiz olduğundan daha verimli
Thing
.
Bir alternatifi açıklarım, ancak bunu önermek için orijinal çözüme karşı argümanların olması gerekir. Orijinal çözümün bir anti-desen olduğu gerçeğini ortaya koymak için varsa, argümanlar ne yapılabilir?
Ve alternatif çözümümde bir şey olursa ne olur?