Apa itu kode "iri fitur" dan mengapa dianggap sebagai bau kode?

53

Ini pertanyaan pada SO berbicara tentang mengoreksi apa pemikiran OP adalah fitur iri kode. Contoh lain di mana saya melihat ungkapan yang bagus ini dikutip dalam jawaban yang baru - baru ini diberikan di sini di programer.SE. Meskipun saya memberikan komentar untuk jawaban itu meminta informasi, saya pikir itu akan sangat membantu bagi programmer mengikuti T&J untuk memahami apa yang dimaksud dengan iri fitur . Silakan mengedit tag tambahan jika menurut Anda tepat.

Kutu buku
sumber

Jawaban:

88

Cemburu fitur adalah istilah yang digunakan untuk menggambarkan situasi di mana satu objek mendapat bidang bidang lain untuk melakukan semacam perhitungan atau membuat keputusan, daripada meminta objek untuk melakukan perhitungan itu sendiri.

Sebagai contoh sepele, pertimbangkan kelas yang mewakili persegi panjang. Pengguna persegi panjang mungkin perlu tahu wilayahnya. Pemrogram dapat mengekspos widthdan heightbidang dan kemudian melakukan perhitungan di luar Rectanglekelas. Atau, Rectanglebisa menjaga widthdan heightbidang pribadi dan menyediakan getAreametode. Ini bisa dibilang pendekatan yang lebih baik.

Masalah dengan situasi pertama, dan alasan itu dianggap sebagai bau kode, adalah karena itu merusak enkapsulasi.

Sebagai aturan praktis, setiap kali Anda menggunakan bidang yang luas dari kelas lain untuk melakukan segala jenis logika atau perhitungan, pertimbangkan untuk memindahkan logika itu ke metode di kelas itu sendiri.

jewewlett
sumber
7
+1, meskipun contoh Anda tidak realistis, karena kelas Rectangle yang berguna biasanya akan mengekspos bidang lebar dan tinggi.
Doc Brown
2
Dan meskipun pemecahan enkapsulasi dapat terjadi bersamaan dengan "Fitur envirism", dalam sebagian besar contoh dunia nyata yang saya lihat sejauh ini mungkin bukan itu masalahnya. Ini terjadi lebih dalam situasi "hei, saya perlu menghitung beberapa hal hanya dalam kode menggunakan objek itu, dan saya tidak yakin apakah saya bisa menyentuh implementasi objek itu / jika kita harus memberikan objek tanggung jawab untuk perhitungan itu". Dan kemudian satu mengimplementasikan perhitungan menggunakan bidang yang sudah terbuka (meskipun implementasi yang jauh lebih bersih mungkin dimungkinkan dalam objek).
Doc Brown
2
@DocBrown Bayangkan sebuah persegi panjang yang digambar di permukaan torus, kerucut atau bola. Jika pustaka gambar bentuk saya menghasilkan objek yang mampu menghasilkan hasil yang benar dalam konteks seperti itu, Anda akan bodoh untuk tidak membiarkan mereka menghitung area mereka sendiri - dalam konteks apa pun.
itsbruce
1
@OskarN .: Menurut definisi kita berbicara tentang fungsi yang sedang dibutuhkan. Mereka jelas diperlukan jika kelas-kelas lain menerapkannya berulang kali.
Aaronaught
1
@ OskarN .: tergantung; terkadang keputusannya jelas, kadang-kadang karena masalah selera, dan yang paling sering adalah soal pengalaman. Dalam artikel Anda, ada alasan bagus mengapa Scott Meyers menulis " kadang-kadang lebih sedikit lebih banyak", dan butuh bertahun-tahun untuk memahami kapan tidak menerapkan "algoritme untuk memutuskan kapan membuat fungsi anggota fa".
Doc Brown
1

Ada situasi yang memungkinkan ketika OK untuk menggunakan metode kelas / struct lain secara luas - ketika kelas / struct Anda adalah wadah untuk data. Biasanya ada sedikit yang bisa Anda lakukan dengan data ini tanpa konteks eksternal.

Kelas-kelas semacam itu masih dapat menyimpan beberapa logika internal tetapi lebih sering mereka digunakan sebagai wadah:

class YourUid {
 public:
  YourUid(int id_in_workplace_, int id_in_living_place_, DB* FBI_database, int id_in_FBI_database);
  bool IsInvalidWorker() const { return id_in_workplace == consts::invalid_id_in_workplace; }
  bool CanMessWith() const { return !FBI_database_.is_cool(id_in_FBI_database_); }
  int id_in_workplace;
  int id_in_living_place;
 private:
  int id_in_FBI_database_;
  const DB* FBI_database_;
};

@jhewlett dalam jawabannya merujuk pada artikel ini untuk membuktikan bahwa Anda tidak boleh menggunakan anggota kelas lain secara ekstensif, tetapi ada situasi lain yang berbau kode yang dijelaskan di sana bersama para pendukung contoh saya:

Daftar Parameter Panjang. Batasi jumlah parameter yang Anda butuhkan dalam metode yang diberikan, atau gunakan objek untuk menggabungkan parameter.

Riga
sumber
1
bagaimana ini menjawab pertanyaan yang diajukan?
nyamuk
@gnat Q adalah tentang Mengapa itu dianggap "bau kode". jhewlett memberikan nilai A dengan asumsi yang terlalu umum dipertanyakan dalam komentar. Jawaban saya adalah 2 sen untuk membedakan "bau kode" dari praktik normal.
Riga