Pola harus digunakan hanya di mana mereka bisa menjadi solusi terbaik atau bantuan dalam penciptaan solusi yang baik (apakah Anda setuju?).
Saya melihat pola desain secara ketat sebagai detail implementasi. Jika Anda mendokumentasikan API dan program publik Anda untuk dokumentasi itu, secara umum tidak masalah (atau banyak mempengaruhi Anda) di mana Anda memiliki pola desain. Artinya, Anda tidak pergi "Saya punya pola jembatan di sini, dan saya akan menerapkan pengunjung di atasnya". Sebaliknya, ini adalah "kelas ini akan memiliki implementasi yang berbeda pada berbagai sistem operasi sehingga akan diimplementasikan menggunakan pola jembatan". Kemudian, ketika Anda menggunakannya, Anda tidak peduli dengan penerapannya sebagai jembatan - karena Anda melihat API publik, bukan pola jembatan.
berapa banyak usaha yang harus diinvestasikan dalam menciptakan desain yang longgar dan fleksibel?
Kopling longgar dapat dicapai dengan mengikuti serangkaian aturan sederhana. Jika Anda menghormati ini, kode Anda akan (lebih) digabungkan secara longgar, saat Anda menulisnya (yaitu segala upaya sudah menjadi bagian dari proses pengembangan).
Di antara aturan (bukan daftar lengkap):
- tentukan antarmuka Anda dengan memikirkan (atau menulis) kode klien (bagaimana kelas akan digunakan), bukan apa yang akan dilakukan kelas (mis. menginginkan antarmuka, bukan implementasi)
- "katakan, jangan tanya"
- membangun objek dari bagian yang sudah dibuat
- masukkan ke konstruktor objek aktual yang akan Anda gunakan (bukan pabrik untuk anggota, parameter untuk pabrik parameter, atau semacamnya).
- KERING (jika Anda memiliki dua baris yang muncul dalam urutan yang sama di dua tempat, ekstrak menjadi fungsi yang terpisah dan seterusnya).
- Jika penciptaan objek adalah operasi yang lebih kompleks, terapkan penciptaan bagian perantara sebagai metode / kelas pabrik (yaitu tidak di badan konstruktor).
- YAGNI (buat sesuatu sesuai kebutuhan Anda, bukan sebelumnya).
Aturan-aturan ini diikuti secara berbeda, tergantung pada bahasa, metodologi pengembangan yang diikuti oleh tim Anda (misalnya TDD), batasan anggaran waktu, dan sebagainya.
Sebagai contoh, di Jawa, itu adalah praktik yang baik untuk mendefinisikan antarmuka Anda sebagai interfacedan menulis kode klien pada itu (kemudian, instantiate antarmuka dengan kelas implementasi).
Di C ++ di sisi lain, Anda tidak memiliki antarmuka, jadi Anda hanya bisa menulis antarmuka sebagai kelas dasar abstrak; Karena di C ++ Anda hanya menggunakan warisan ketika Anda memiliki persyaratan yang kuat untuk itu (dan karena itu menghindari overhead fungsi virtual yang tidak perlu), Anda mungkin tidak akan mendefinisikan antarmuka secara terpisah, hanya header kelas).
Mereka yang menentang pola desain mengatakan bahwa biaya untuk menggunakan pola-pola ini sering melebihi manfaatnya.
Saya pikir mereka salah melakukannya. Jika Anda menulis kode yang digabungkan secara longgar (dan KERING), mengintegrasikan pola desain ke dalamnya dilengkapi dengan upaya ekstra minimal. Jika tidak, Anda harus menyesuaikan kode Anda untuk menerapkan pola desain.
Jika Anda harus melakukan banyak perubahan untuk menerapkan pola desain, masalah Anda bukan pola desain - itu adalah basis kode Anda yang monolitik, dan digabungkan secara ketat. Ini adalah masalah desain yang buruk / kurang optimal, bukan masalah pola desain.
Apa yang ingin saya ketahui adalah berapa banyak upaya yang harus saya lakukan dalam menciptakan level tambahan abstraksi dan desain, hanya untuk memungkinkan aplikasi saya mengikuti prinsip-prinsip OO seperti kopling longgar, programmign ke antarmuka, dll. Apakah itu benar-benar layak Itu? Berapa banyak usaha yang harus saya lakukan dalam hal ini?
Pertanyaan Anda membuat asumsi (tidak dinyatakan) bahwa satu-satunya manfaat dari kopling longgar adalah kemampuan untuk dengan mudah menerapkan pola desain. Bukan itu.
Di antara manfaat lepas kopling adalah:
- fleksibilitas refactoring dan desain ulang
- usaha yang kurang sia-sia
- testabilitas
- peningkatan kemungkinan untuk menggunakan kembali kode
- kesederhanaan desain
- lebih sedikit waktu yang dihabiskan dalam debugger
... dan beberapa lainnya yang tidak muncul di benak saya saat ini.