it-swarm-id.com

Pola desain apa yang paling buruk atau paling sempit?

Untuk setiap proyek pemrograman, manajer dengan pengalaman pemrograman sebelumnya mencoba bersinar ketika mereka merekomendasikan beberapa pola desain untuk proyek Anda. Saya suka pola desain ketika mereka masuk akal atau jika Anda membutuhkan solusi yang dapat diskalakan. Saya telah menggunakan pola Proxy, Pengamat dan Komando dalam cara yang positif misalnya, dan melakukannya setiap hari. Tapi saya benar-benar ragu untuk menggunakan katakan pola Pabrik jika hanya ada satu cara untuk membuat objek, karena pabrik mungkin membuat semuanya lebih mudah di masa depan, tetapi menyulitkan kode dan overhead murni.

Jadi, pertanyaan saya adalah berkenaan dengan karir masa depan saya dan jawaban saya untuk tipe manajer yang melemparkan nama-pola acak di sekitar:

Pola desain mana yang Anda gunakan, yang membuat Anda kembali secara keseluruhan? Yang merupakan pola desain terburuk, yang harus Anda pertimbangkan kecuali dalam satu situasi tunggal di mana mereka masuk akal (baca: pola desain mana yang didefinisikan dengan sangat sempit)? (Sepertinya saya sedang mencari ulasan negatif dari keseluruhan produk bagus Amazon untuk melihat apa yang paling disadap orang dalam menggunakan pola desain.) Dan saya tidak berbicara tentang Anti-Pola di sini, tetapi tentang Pola yang biasanya dianggap sebagai pola "baik".

Edit: Seperti yang dijawab beberapa orang, masalahnya paling sering adalah bahwa pola tidak "buruk" tetapi "salah digunakan". Jika Anda tahu pola, yang sering disalahgunakan atau bahkan sulit digunakan, mereka juga cocok sebagai jawaban.

28
Akku

Saya tidak percaya pada pola yang buruk, saya percaya bahwa pola dapat diterapkan dengan buruk!

  • IMHO singleton adalah pola yang paling banyak disalahgunakan dan diterapkan secara salah. Orang-orang tampaknya mendapatkan penyakit tunggal dan mulai melihat kemungkinan untuk lajang di mana saja tanpa mempertimbangkan alternatif.
  • IMHO pola pengunjung memiliki penggunaan paling sempit dan hampir tidak pernah kompleksitas tambahan akan dibenarkan. PDF yang bagus dapat diperoleh di sini . Benar-benar hanya ketika Anda memiliki struktur data yang Anda tahu akan dilalui saat melakukan operasi yang berbeda pada struktur data tanpa mengetahui semua cara di muka, berikan kesempatan kepada pengunjung pola pertempuran. Sangat cantik :)

Untuk jawaban ini saya hanya mempertimbangkan pola GOF. Saya tidak tahu semua pola yang mungkin cukup baik untuk dipertimbangkan juga.

40
KeesDijk

Saya akan mengambil risiko di sini dan menyarankan penggunaan warisan yang berlebihan. Jelas paling berlaku dalam bahasa tanpa dukungan polimorfisme waktu kompilasi yang solid, seperti Java. Warisan run-time adalah alat, bukan semacam keajaiban satu fitur yang cocok untuk semua.

Orang lain telah menyatakan hal yang serupa dengan kebencian pribadi saya terhadap Singletons, jadi saya tidak akan membahasnya di sini.

14
DeadMG

Terlepas dari Singleton dan Pengunjung yang telah disebutkan oleh penjawab lain, saya tidak tahu pola desain "terkenal". IMHO masalah terbesar tidak berasal dari pola desain tertentu yang "salah", melainkan dari pengembang yang menerapkan pola terlalu bersemangat.

Hampir semua orang melewati fase "pola demam" ketika berkenalan dengan pola. Berpikir bahwa pola adalah hal terbaik sejak memotong roti, awalnya seseorang mencoba menerapkannya kapan saja dia melihat kemungkinan. Ini menghasilkan kode yang terkubur di bawah pola, di mana pola itu sendiri tidak membantu lagi, hanya membuat kode lebih sulit untuk dipahami dan dipelihara dalam jangka panjang.

Akhirnya, kebanyakan dari kita melewati fase ini dan mulai belajar bagaimana menggunakan pola untuk menyelesaikan masalah nyata, bukan untuk kepentingan mereka sendiri. Pola memiliki harga, yang menambah kompleksitas, dan menerapkan pola spesifik apa pun hanya dibenarkan ketika membayar kembali untuk kompleksitas yang ditambahkan dengan membantu menyederhanakan beberapa bagian lain dari sistem, sehingga membuat kode/konfigurasi secara keseluruhan lebih mudah untuk dipahami dan dipelihara. Jika bukan ini masalahnya, seringkali lebih baik menjauhi pola, tetap dengan solusi paling sederhana yang mungkin bisa berhasil.

14
Péter Török

Singleton. Ini adalah salah satu dari pola GOF yang sekarang lebih sering disebut sebagai anti-pola. Salah satu alasan untuk itu adalah Singleton membuat kode lebih sulit untuk diuji.

10
SiberianGuy

Jika Anda tahu pola, yang sering disalahgunakan atau bahkan sulit digunakan, mereka juga cocok sebagai jawaban.

Mengikuti pola MVVM untuk [~ # ~] wpf [~ # ~] terlalu ketat, seperti ditunjukkan misalnya - dengan pertanyaan ini . Beberapa orang mencoba mengikuti panduan bahwa tidak boleh ada kode yang dimasukkan ke dalam kode terlalu ketat dan menghasilkan semua jenis peretasan yang eksotis.

Dan tentu saja, MVVM sulit sekali, dan tidak layak untuk proyek jangka pendek kecil.

WPF melakukan posting ironis tentang hal itu di artikelnya M-V-poo .

7
Steven Jeuris

Factory. Saya telah melihat kode mengimplementasikannya yang hanya membuat satu jenis. Itu kode IMO yang sama sekali tidak berguna. Itu tidak membantu bahwa banyak contoh daring sepenuhnya dibuat-buat. Pabrik pizza?

Mungkin pabrik lebih mudah untuk diuji karena injeksi ketergantungan. Tetapi untuk menambahkan kode itu ketika Anda tidak membutuhkannya tidak ada gunanya bagi saya, dan argumen pengujian menghilang ketika Anda dapat menggunakan kerangka kerja tiruan seperti JMockit. Semakin mudah Anda membuat program, semakin baik. Pabrik hanya benar-benar masuk akal dengan jumlah tipe yang lebih besar (lebih besar, maksud saya setidaknya lebih dari 2).

5
Michael K

Beberapa pola dalam buku GOF bersifat spesifik C++, dalam arti mereka kurang berlaku dalam bahasa dengan refleksi, mis. pola Prototipe kurang signifikan di Jawa.

Saya menganggap pola Juru Bahasa sebagai 'sempit'. Anda harus memiliki masalah umum yang layak dikembangkan pemecah masalah umum. Ini hanya berfungsi untuk masalah khusus di mana Anda dapat menciptakan bahasa, mendefinisikan tata bahasa dan menulis penerjemah. Contoh masalah harus dinyatakan sebagai kalimat dalam tata bahasa. Saya tidak berpikir Anda sering menemukan situasi seperti itu.

5
Karl

Yang saya sesali paling sering (meskipun tidak paling keras): Ketika saya seharusnya baru saja membuat fungsi tetapi saya mengimplementasikan solusi OOP.

5
C SD

Singleton

Saya setuju dengan yang lain tentang Singleton. Bukan berarti Anda tidak boleh menggunakannya, hanya saja itu harus dibatasi untuk beberapa kasus. Mereka sering digunakan sebagai global malas.

Thread-safety adalah satu masalah dengan lajang. Penanganan pengecualian adalah hal lain - jika singleton gagal dibuat dengan benar - Anda tidak selalu tahu apakah Anda dapat menangkap kesalahan dengan aman, terutama jika itu adalah salah satu objek yang dibuat "sebelum main". Dan kemudian ada masalah membersihkan setelah itu.

Saya cenderung lebih suka menggunakan satu singleton dan meminta semua lajang "wannabe" lainnya "berlangganan" untuk Anda. Penggunaan tunggal saya yang paling umum adalah penanganan "acara berteriak": Anda hanya "menyiarkan ke dunia" bahwa suatu peristiwa telah terjadi dan siapa pun yang mendengarkan yang akan menangani acara tersebut melakukannya. Dengan begitu Anda memisahkan peristiwa yang sebenarnya terjadi dengan apa yang mendengarkannya. (Logging, sinyal, dll.)

Pengunjung

Hal buruk yang saya temukan tentang hal ini, terlepas dari kenyataan bahwa pengembang tidak dapat memikirkan nama yang bermakna dan hanya memanggil metode kunjungan (), adalah bahwa hal itu menambah ekstensibilitas dalam satu arah sementara menghapusnya di yang lain, yaitu menambahkan fungsionalitas tambahan tetapi membatasi jumlah objek yang perlu diketahui pengunjung tentang semua jenis objek yang mungkin dikunjungi.

Dimungkinkan, meskipun berantakan, untuk memungkinkan ekstensi di kedua arah tetapi ini tidak sepenuhnya menggunakan pola pengunjung dalam bentuk regulernya. Aplikasi paling umum untuk ini adalah mencetak objek: Anda memiliki berbagai cara untuk mencetak objek dan objek berbeda yang perlu dicetak. Anda harus dapat memperpanjang ini di kedua arah. (Mencetak berarti segala jenis benda yang berubah menjadi aliran: menyimpan dalam file/menulis ke konsol/GUI .. dll).

(Catatan: Anda tidak harus membingungkan ini dengan arsitektur tampilan dokumen, yang merupakan pola yang sedikit berbeda).

2
CashCow

Saya pikir masalah dengan beberapa pola yang lebih kompleks adalah bahwa ada begitu banyak variasi pada mereka sehingga mereka kehilangan banyak nilainya sebagai alat komunikasi.

Pelaku terburuk yang bisa saya pikirkan dalam kategori ini adalah pola MVC. Bahkan jika kita mengabaikan MVP, ada begitu banyak variasi dalam peran masing-masing item ini sehingga Anda harus menghabiskan satu jam di setiap kerangka kerja baru mencari tahu di mana batas-batasnya.

2
Uri

Tidak ada pola buruk hanya orang jahat.

Saya lebih suka mewarisi kode yang mudah dibaca yang melakukan sesuatu yang jelas tetapi sedikit bertele-tele atau tidak (musik villian jahat antrian) dapat digunakan kembali (terkesiap!) Daripada beberapa mash mash InheritAbstractTemplateFaucetSink<Kitchen>.

Kode yang dapat digunakan kembali bagus! Kemungkinannya adalah Anda tidak menulis kode yang akan digunakan kembali atau menulis ulang logika serupa untuk aplikasi lain akan membawa Anda lebih sedikit waktu daripada beberapa upaya gila untuk menggunakan kembali beberapa kode aplikasi lain.

Untuk membaca lebih lanjut, buka beberapa kode C di implementasi waras dari posix header atau clibs dan mainkan polanya. Kode ini ditulis oleh beberapa programmer paling cerdas dan paling berdedikasi di dunia. Apakah Anda tahu berapa banyak Pola Pabrik Abstrak yang akan Anda lihat? ... TIDAK ADA !. Peluang yang lebih baik adalah jika Anda memahami bagian lain dari apa yang terjadi, Anda akan menemukan logika yang sangat mudah dipahami dan dilacak.

Maksud saya adalah ini sebagian besar "pola" tidak dibuat untuk membuat kode lebih baik mereka diciptakan untuk menjual buku dan perangkat lunak pemodelan. Jika Anda pandai pemrograman Anda mungkin akan menghindari sebagian besar dari ini dan menulis kode yang dirancang jelas, ringkas, dan cerdik yang memecahkan masalah Anda. Ketika Anda memiliki masalah lain, Anda akan menulis kode yang jelas, ringkas, dan cerdik untuk memecahkan masalah itu. Jika tujuan Anda adalah untuk menulis lebih sedikit kode daripada yang saya kira Anda tidak cocok menjadi seorang programmer. Saya suka menulis kode dan ingin menulis sebanyak mungkin. Ketika saya menulis ulang sesuatu yang sudah saya tulis, saya melakukannya puluhan kali lebih cepat dan menyingkirkan semua hal yang tidak saya sukai dengan pertama kali saya melakukannya. Sebagai bonus saya dapat melakukannya dengan tidak ada batasan dari masalah pertama yang ditetapkan karena ini adalah masalah baru (saya mungkin memiliki 15 skrip dalam 5 bahasa berbeda yang mulai membuat Tomcat terombang-ambing).

Dengan itu saya akan meninggalkan Anda mungkin dengan kutipan terbaik (relevan) dalam ilmu komputer.

"Ada dua cara membangun desain perangkat lunak: Salah satu caranya adalah membuatnya sangat sederhana sehingga jelas tidak ada kekurangan, dan cara lainnya adalah membuatnya sangat rumit sehingga tidak ada kekurangan yang jelas. Metode pertama jauh lebih sulit. "

  • Tony Hoare (penemu quicksort, bapak desain OS modern, pencipta logika Hoare, dan penerima penghargaan Turing)
1
nsfyn55

Saya setuju bahwa ada waktu untuk sebagian besar pola, dan Anda dapat menyalahgunakan banyak pola. Saya tahu salah satu yang paling banyak saya lecehkan di masa lalu adalah pola Template Abstrak. Diambil sepenuhnya itu dikenal sebagai ASP.NET webforms.

0
Wyatt Barnett