Di halaman 45 dari Robert C. Martin Clean Code: A Handbook of Agile Software Craftsmanship, Martin menulis bahwa argumen keluaran harus dihindari. Saya mengalami kesulitan memahami arti "argumen keluaran" dan mengapa mereka harus dihindari.
Contoh Martin untuk argumen keluaran appendFooter(s);
memanggil fungsi public void appendFooter(StringBuffer report)
. Peningkatan kodenya adalahreport.appendFooter();
Mungkin karena kurangnya konteks kode, tapi saya tidak melihat bagaimana menggunakan argumen keluaran dianggap pengkodean yang buruk. Bisakah seseorang menjelaskan konsep atau memberikan contoh kode tambahan untuk memahami hal ini?
Apakah fungsi berikut ini juga dapat dianggap sebagai contoh kode najis oleh prinsip di atas?
int[] numberArray = {3, 5, 7, 1};
sortArray(numberArray);
Jika hal di atas merupakan pelanggaran prinsip Martin karena tidak menggunakan argumen output, apakah lebih baik memiliki objek yang memiliki array sebagai bidang dan fungsi yang dapat dipanggil untuk mengurutkan array?
ObjectWithArrayField numberArray = new ObjectWithArrayField(3, 5, 7, 1);
numberArray.sort();
sumber
sortArray(numberArray)
, tentu saja, ada beberapanumberArray
tempat. Atau apakah itu membuat salinannumberArray
, mengurutkan salinan, dan mengembalikan salinan yang diurutkan tanpa mengubahnumberArray
sama sekali?sort()
metode wadah dapat bekerja di tempat juga, tanpa menggunakan "argumen keluaran". Jadi hanya karenasortArray(numberArray)
metode in-place sama sekali tidak ada alasan yang membenarkan "bentuk argumen output".sortArray(numberArray)
sedang dilakukan. Ini bisa menjadi jelas jika tidak mengembalikan jenis yang sama dengan yang diterimanya, maka itu harus ada di tempatnya. Tetapi tanpa melihat jenis kembali, atau jika jenis kembali cocok dengan jenis input, tidak jelas tanpa melihat definisi.Ini masalah menggunakan mekanisme yang tidak terduga untuk mengembalikan nilai dari fungsi, yang biasanya merupakan hasil dari melakukan terlalu banyak fungsi atau memiliki tanggung jawab yang tidak selaras. Sejauh ini, cara terbaik untuk mengkomunikasikan hasil fungsi adalah dengan menggunakan nilai balik. Saya harap itu jelas. Dalam bahasa berorientasi objek, metode terbaik kedua adalah bermutasi objek.
Di antara dua opsi itu, ada begitu banyak cara yang bersih dan jelas untuk mengomunikasikan hasil suatu fungsi sehingga jika Anda mendapati diri Anda ingin mengubah argumen sebagai satu-satunya cara, ada sesuatu yang salah dalam arsitektur Anda. Anda perlu mengatur ulang tanggung jawab kelas Anda sehingga orang yang melakukan mutasi memiliki data di tempat pertama.
Satu-satunya pengecualian adalah untuk algoritma yang sangat umum. Misalnya, algoritma pengurutan mungkin terpisah dari wadah yang diurutkannya, jika dapat diterapkan secara umum ke semua jenis wadah menggunakan antarmuka publik. Sebuah satu-shot
appendFooter
fungsi tidak memiliki alasan itu.sumber