Dalam Clean Code, ada tertulis bahwa "jumlah ideal argumen untuk suatu fungsi adalah nol". Alasan mengapa dijelaskan dan masuk akal. Apa yang saya kejar adalah teknik untuk memperbaiki metode dengan 4 atau lebih argumen untuk menyelesaikan masalah ini.
Salah satu caranya adalah mengekstraksi argumen ke dalam kelas baru, tetapi itu pasti akan menyebabkan ledakan kelas? Dan kelas-kelas itu cenderung berakhir dengan nama yang melanggar beberapa aturan penamaan (diakhiri dengan "Data" atau "Info" dll)?
Teknik lain adalah membuat variabel yang digunakan oleh banyak fungsi sebagai variabel anggota pribadi untuk menghindari melewatinya, tetapi itu memperluas ruang lingkup variabel, mungkin sedemikian sehingga terbuka untuk fungsi yang sebenarnya tidak membutuhkannya.
Hanya mencari cara untuk meminimalkan argumen fungsi, setelah menerima alasan mengapa itu ide yang baik untuk melakukannya.
sumber
Jawaban:
Yang paling penting untuk diingat adalah bahwa itu adalah pedoman, bukan aturan.
Ada kasus di mana suatu metode harus mengambil argumen. Pikirkan tentang
+
metode angka, misalnya. Atauadd
metode untuk koleksi.Bahkan, orang mungkin bahkan berpendapat bahwa apa artinya menambahkan dua angka tergantung pada konteks, misalnya dalam ℤ
3 + 3 == 6
, tetapi dalam ℤ | 53 + 3 == 2
, jadi benar-benar operator tambahan harus menjadi metode pada objek konteks yang mengambil dua argumen alih-alih sebuah metode pada angka yang mengambil satu argumen.Demikian juga, metode untuk membandingkan dua objek harus berupa metode dari satu objek mengambil yang lain sebagai argumen, atau metode konteks, mengambil dua objek sebagai argumen, sehingga tidak masuk akal untuk memiliki metode perbandingan dengan kurang dari satu argumen.
Yang mengatakan, ada beberapa hal yang dapat dilakukan untuk mengurangi jumlah argumen untuk suatu metode:
Point
objek, atau alih-alih mengirimkan nama pengguna dan email, kirimkanIdCard
objek.)Jika model domain Anda memiliki berbagai jenis hal, maka kode Anda akan berakhir dengan berbagai jenis objek. Tidak ada yang salah dengan itu.
Jika Anda tidak dapat menemukan nama yang tepat, mungkin Anda mengelompokkan terlalu banyak argumen bersama atau terlalu sedikit. Jadi, Anda hanya memiliki sebuah fragmen kelas atau Anda memiliki lebih dari satu kelas.
Jika Anda memiliki sekelompok metode yang semuanya beroperasi pada argumen yang sama, dan kelompok metode lain yang tidak, mungkin mereka termasuk dalam kelas yang berbeda.
Perhatikan seberapa sering saya menggunakan kata "mungkin"? Itu sebabnya itu adalah pedoman, bukan aturan. Mungkin metode Anda dengan 4 parameter baik-baik saja!
sumber
add
fungsi untuk nomor alam danadd
fungsi untuk cincin bilangan bulat mod n dua fungsi tindakan yang berbeda pada dua jenis yang berbeda. Saya juga tidak mengerti apa yang Anda maksud dengan "konteks".Perhatikan bahwa argumen nol tidak menyiratkan efek samping, karena objek Anda adalah argumen implisit. Lihat berapa banyak metode zero-arity daftar abadi Scala , misalnya.
Salah satu teknik yang berguna saya sebut teknik "pemfokusan lensa". Saat Anda memfokuskan lensa kamera, lebih mudah untuk melihat titik fokus sebenarnya jika Anda mengambilnya terlalu jauh, lalu mundur ke titik yang benar. Hal yang sama berlaku untuk refactoring perangkat lunak.
Terutama jika Anda menggunakan kontrol versi terdistribusi, perubahan perangkat lunak mudah dilakukan dengan percobaan, lihat apakah Anda suka tampilannya, dan mundur jika tidak, tetapi karena alasan tertentu orang sering enggan melakukannya.
Dalam konteks pertanyaan Anda saat ini, itu berarti menulis versi argumen nol atau satu, dengan beberapa fungsi pemisahan terlebih dahulu, maka relatif mudah untuk melihat fungsi mana yang perlu digabungkan agar mudah dibaca.
Perhatikan bahwa penulis juga merupakan penganjur besar pengembangan yang digerakkan oleh tes, yang cenderung menghasilkan fungsi rendah arity pada awalnya karena Anda mulai dengan kasus-kasus tes sepele Anda.
sumber
Suatu pendekatan yang sederhana (dan naif - atau harus saya katakan secara membabi buta ) hanya bertujuan untuk mengurangi jumlah argumen ke fungsi ist mungkin salah. Sama sekali tidak ada yang salah dengan fungsi yang memiliki banyak argumen. Jika mereka diperlukan oleh logika, ya mereka diperlukan ... Daftar parameter yang panjang tidak membuat saya khawatir sama sekali - selama diformat dengan benar dan dikomentari agar mudah dibaca.
Jika semua atau sebagian argumen termasuk dalam satu entitas logis unik dan biasanya diedarkan secara berkelompok di seluruh program Anda, mungkin masuk akal untuk mengelompokkannya ke dalam wadah - Biasanya struct atau objek lain. Contoh umum mungkin semacam pesan atau tipe data acara .
Anda dapat dengan mudah melakukan pendekatan itu - begitu Anda menemukan bahwa mengepak dan membongkar barang ke dan dari wadah pengangkutan seperti itu menghasilkan lebih banyak overhead daripada meningkatkan pembacaan, Anda mungkin sudah melangkah terlalu jauh.
OTOH, daftar parameter besar dapat menjadi tanda bahwa program Anda mungkin tidak terstruktur dengan baik - mungkin fungsi yang memerlukan sejumlah besar parameter hanya mencoba melakukan terlalu banyak dan harus dipecah menjadi beberapa fungsi yang lebih kecil. Saya lebih suka mulai di sini daripada mengkhawatirkan # parameter.
sumber
Tidak ada cara ajaib: Anda harus menguasai domain masalah untuk menemukan arsitektur yang tepat. Itulah satu-satunya cara untuk refactor: menguasai domain masalah. Lebih dari empat parameter hanyalah taruhan pasti bahwa arsitektur Anda saat ini salah dan salah.
Satu-satunya pengecualian adalah kompiler (metaprogram) dan simulasi, di mana batasnya secara teoritis 8, tetapi mungkin hanya 5.
sumber