Saya membaca tentang bau kode umum dalam buku Refactoring Martin Fowler . Dalam konteks itu, saya bertanya-tanya tentang pola yang saya lihat di basis kode, dan apakah orang dapat secara objektif menganggapnya sebagai anti-pola.
Pola adalah satu tempat objek dilewatkan sebagai argumen ke satu atau lebih metode, yang semuanya mengubah keadaan objek, tetapi tidak ada yang mengembalikan objek. Jadi ia mengandalkan sifat referensi pass by (dalam hal ini) C # /. NET.
var something = new Thing();
// ...
Foo(something);
int result = Bar(something, 42);
Baz(something);
Saya menemukan bahwa (terutama ketika metode tidak dinamai dengan tepat) saya perlu melihat ke metode tersebut untuk memahami jika keadaan objek telah berubah. Itu membuat pemahaman kode lebih kompleks, karena saya perlu melacak beberapa level dari panggilan-tumpukan.
Saya ingin mengusulkan untuk meningkatkan kode tersebut untuk mengembalikan objek lain (dikloning) dengan status baru, atau apa pun yang diperlukan untuk mengubah objek di situs panggilan.
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);
Bagi saya sepertinya pola pertama dipilih berdasarkan asumsi
- bahwa itu kurang berfungsi, atau membutuhkan lebih sedikit baris kode
- bahwa itu memungkinkan kita untuk mengubah objek, dan mengembalikan beberapa informasi lainnya
- bahwa itu lebih efisien karena kita memiliki lebih sedikit contoh
Thing
.
Saya mengilustrasikan suatu alternatif, tetapi untuk mengusulkannya, orang perlu memiliki argumen yang menentang solusi asli. Apa, jika ada, argumen yang dapat dibuat untuk membuat kasus bahwa solusi asli adalah anti-pola?
Dan apa, jika ada, yang salah dengan solusi alternatif saya?