Memilih Pola Desain yang tepat

32

Saya selalu menyadari pentingnya memanfaatkan pola desain. Saya ingin tahu bagaimana pengembang lain pergi tentang memilih yang paling tepat. Apakah Anda menggunakan serangkaian karakteristik (seperti diagram alur) untuk membantu Anda memutuskan?

Sebagai contoh:

Jika objek terkait, tetapi kami tidak ingin menentukan kelas beton, pertimbangkan Abstrak

Ketika Instansiasi diserahkan kepada kelas turunan, pertimbangkan Factory

Perlu mengakses elemen objek agregat secara berurutan, coba Iterator

atau yang serupa?

Carl Sagan
sumber
8
Menurut Anda apa pentingnya itu? programmers.stackexchange.com/questions/70877/...
pdr
Saya pikir yang penting adalah kemampuan untuk mengenali pola yang paling tepat dan holistik, untuk akhirnya dapat berkomunikasi dengan pengembang lain. Jika itu masuk akal?
Carl Sagan
Saya setuju dengan @pdr. Saya berpikir tentang apa yang perlu saya lakukan, dan mengingat nama polanya membantu saya memberi nama Kelas sehingga orang lain tahu apa fungsinya.
Amy Blankenship
4
Memang. Ini bisa diringkas menjadi "Bagaimana Anda memilih desain yang tepat?". Pertama, tidak ada desain yang tepat , hanya banyak yang salah. Di luar itu, ia datang dengan pengalaman tumpukan (memilih yang salah).
Telastyn

Jawaban:

109

Kesalahpahaman utama dalam dunia pengkodean hari ini adalah bahwa pola adalah blok bangunan. Anda mengambil di AbstractFactorysini dan di Flyweightsana dan mungkin Singletondi sana dan menghubungkannya dengan XML dan presto, Anda punya aplikasi yang berfungsi.

Mereka tidak.

Hmm, itu tidak cukup besar.

Pola bukanlah blok bangunan

Itu lebih baik.

Pola adalah sesuatu yang Anda gunakan saat Anda menemukan masalah - Anda memerlukan fleksibilitas yang disediakan oleh pola, atau yang Anda temui ketika Anda membuat sedikit bahasa dalam file konfigurasi dan Anda berkata "tunggu sebentar, berhenti, ini adalah penerjemahnya sendiri yang saya tulis - ini adalah masalah yang diketahui dan diselesaikan, gunakan pola Penerjemah . "

Tetapi perhatikan di sana, bahwa itu adalah sesuatu yang Anda temukan dalam kode Anda, bukan sesuatu yang Anda mulai dengan. Para pembuat Java tidak mengatakan "Oh, kami akan meletakkan Flyweight di Integer" pada awalnya, tetapi lebih menyadari masalah kinerja yang bisa diselesaikan oleh kelas terbang .

Dan dengan demikian, tidak ada "diagram alur" yang Anda gunakan untuk menemukan pola yang tepat. Pola adalah solusi untuk jenis masalah tertentu yang telah ditemui berulang-ulang dan bagian-bagian utama dari itu disuling menjadi Pola.

Memulai dengan Pola adalah seperti memiliki solusi dan mencari masalah. Ini adalah hal yang buruk: itu mengarah pada rekayasa berlebihan dan pada akhirnya tidak fleksibel dalam desain.

Ketika Anda menulis kode, ketika Anda menyadari bahwa Anda sedang menulis sebuah Pabrik, Anda dapat mengatakan "ah ha! Itu adalah pabrik yang akan saya tulis" dan gunakan pengetahuan Anda untuk mengetahui pola Pabrik untuk dengan cepat menulis bagian selanjutnya dari kode tanpa mencoba menemukan kembali pola Pabrik. Tetapi Anda tidak memulai dengan "Saya punya kelas di sini, saya akan menulis sebuah pabrik untuk itu sehingga bisa fleksibel" - karena tidak akan.

Berikut kutipan dari wawancara dengan Erich Gamma (dari Gamma, Helm, Johnson, dan Vissides ): Cara Menggunakan Pola Desain :

Mencoba menggunakan semua pola adalah hal yang buruk, karena Anda akan berakhir dengan desain sintetis — desain spekulatif yang memiliki fleksibilitas yang tidak diperlukan siapa pun. Perangkat lunak saat ini terlalu rumit. Kami tidak dapat berspekulasi apa yang harus dilakukan. Kita harus benar-benar fokus pada apa yang dibutuhkan. Itu sebabnya saya suka refactoring ke pola. Orang-orang harus belajar bahwa ketika mereka memiliki masalah atau bau kode tertentu, seperti orang menyebutnya hari ini, mereka dapat pergi ke kotak alat pola mereka untuk menemukan solusi.


Bantuan terbaik untuk "apa yang harus digunakan, kapan" kemungkinan halaman Wikipedia untuk pola desain perangkat lunak - bagian "Klasifikasi dan daftar" menggambarkan kategori masing-masing pola dan apa fungsinya. Tidak ada diagram alur; deskripsi di sana mungkin yang terbaik yang akan Anda temukan sebagai cuplikan singkat untuk "apa yang harus digunakan, kapan."

Perhatikan bahwa Anda akan menemukan pola yang berbeda di berbagai bidang pemrograman. Desain web memiliki set pola sendiri sementara JEE (bukan desain web) memiliki set pola lain. Pola pemrograman keuangan sangat berbeda dengan pola desain aplikasi UI yang berdiri sendiri.

Jadi setiap upaya untuk membuat daftar semuanya secara inheren tidak lengkap. Anda menemukannya, cari tahu bagaimana menggunakannya dan akhirnya menjadi kebiasaan dan Anda tidak perlu memikirkan bagaimana atau kapan menggunakannya lagi (sampai seseorang meminta Anda untuk menjelaskannya).

Robert Harvey
sumber
11
+1 untuk "solusi mencari masalah." Mengetahui pola akan memungkinkan Anda untuk melewatkan penemuan alami mereka ketika ternyata Anda harus menyelesaikan masalah yang mereka pecahkan. Mempelajari tentang mereka mungkin akan membantu meningkatkan keterampilan coding dan desain Anda, dengan cara yang sama seperti membaca kode orang lain atau belajar bahasa pemrograman lain. Tetapi Anda pasti tidak boleh secara aktif mencoba "menyesuaikan pola" dengan kode Anda.
gregmac
1
Saya selalu merekomendasikan pengembang mulai melihat pola untuk pertama kali membiasakan diri dengan prinsip-prinsip desain. Setiap pola adalah ilustrasi dari beberapa prinsip desain (Kumpulan prinsip 'SOLID' hanyalah satu contoh).
ryscl
2
Mungkin Anda menambahkan dekorator dan fasad Anda akan memiliki aplikasi ;-) Mengatakan cara lain, titik pola desain adalah memberi kita nama, bahasa yang umum ketika mendiskusikan apa yang kita sedang membangun. Ini adalah singkatan dari setumpuk pengetahuan pembangunan yang dimenangkan.
EBarr
2
Membaca yang tersirat di sini, langkah-langkah untuk memilih pola desain: 1. Selalu berpikir kritis tentang kode apa pun yang sedang Anda kerjakan. 2. Abstraksi kode spesifik menjadi masalah dasar 3. Apakah masalah itu memiliki solusi yang diketahui (pola desain) )? 4. Ya, bagaimana saya menerapkan solusi itu untuk spesifik saya? 5. Adaptasikan solusi umum untuk masalah abstrak, untuk membuat solusi untuk masalah spesifik Anda.
Chris
@ Chris yang benar-benar merangkumnya. Tidak ada yang salah dengan menulisnya tanpa pola dan kemudian refactoring kode ke dalam pola yang sesuai jika desain membutuhkannya.
18

Saya bertanya pada diri sendiri:

  1. Masalah apa yang saya coba selesaikan?
  2. Pola desain perangkat lunak mana (jika ada) yang paling dekat memecahkan masalah yang sama, atau menyediakan jalur logis untuk menyelesaikan masalah saya?
  3. Apakah saya memerlukan abstraksi tambahan (dan kompleksitas) yang disediakan oleh pola, atau apakah itu rekayasa berlebihan untuk masalah khusus saya? Bisakah masalah dipecahkan dengan cara yang lebih sederhana, lebih efisien tanpa pola?

Proses memilih pola perangkat lunak tidak berbeda dengan proses memilih struktur data, kecuali bahwa dalam memilih struktur data, Anda akan mengevaluasi kinerja dan karakteristik memori dari masalah Anda, dan memilih struktur data yang paling cocok dengan karakteristik tersebut.

Robert Harvey
sumber
Tentu, itu adalah beberapa hal tentang pengalaman dan keahlian, bukan cetak biru atau diagram alur, dan saya setuju dengan Anda. Tetapi harus ada beberapa sumber daya yang digunakan penuh seperti lembar contekan canggih di mana ia telah dikategorikan, setidaknya dalam kasus dengan pola yang paling penting dan sering seperti pabrik, dll. Saya mengejar hal-hal seperti situasi yang direkomendasikan paling terkenal di yang lebih baik Anda gunakan pola. apakah Anda tahu sumber daya seperti itu di internet ?!
Pmpr
3
@Trix: sourcemaking.com/design_patterns
Robert Harvey