Apakah pola desain disukai?

135

Saya berdiskusi dengan salah satu pengembang senior kami yang sudah berkecimpung dalam bisnis ini selama 20 tahun. Dia cukup terkenal di Ontario untuk blog yang ditulisnya.

Yang aneh adalah apa yang dia katakan kepada saya: dia mengatakan bahwa ada sepotong kode yang merupakan mimpi buruk untuk bekerja dengan karena ditulis dari buku teks, dan tidak menjelaskan dunia nyata. Menambahkan bidang baru ke UI / database / lapisan Data membutuhkan 2-3 jam untuk dilakukan, sedangkan dalam kode-nya dibutuhkan 30 menit.

Hal lain juga adalah bahwa ia menghindari pola desain karena kebanyakan programmer tidak memahaminya dan mereka tidak baik dari sudut pandang pemeliharaan.

Lalu ada juga gagasan bahwa sebagian besar pengembang web di Kanada lebih memilih untuk memiliki model data yang diwarisi dari kelas Data Layer, daripada menjaganya tetap terisolasi. Saya bertanya kepadanya, "Bukankah itu standar industri untuk model yang akan dipisahkan dari lapisan data?" Terkadang dia berkata, tetapi kebanyakan orang di sini memilih untuk tidak melakukannya karena terlalu banyak pekerjaan.

Sepertinya alasannya untuk tidak mengkode menggunakan praktik terbaik adalah karena itu adalah mimpi buruk pemeliharaan, beberapa karyawan kami memahaminya (selain saya sendiri), dan lambat untuk bekerja jika Anda perlu menyingkirkan fitur atau bidang baru dalam beberapa hari ' waktu.

Sangat aneh mendengar pendapat seperti ini, mengingat Stack Overflow sebagian besar mendorong orang untuk mengikuti standar industri. Apakah masalah bahwa kita terus-menerus dipaksa untuk menghasilkan bidang dan fitur baru dalam hitungan hari, bahwa tidak mungkin untuk menyimpulkan pola yang solid yang cukup fleksibel? Tampaknya itulah inti dari apa yang saya mengerti dari ini.

Apa yang Anda buat dari pernyataan ini?

Igneous01
sumber
67
Secara pribadi saya gugup dengan apa pun yang disebut sebagai "praktik terbaik" (tanpa pembenaran) karena biasanya berarti "Saya tidak tahu mengapa ini adalah ide yang baik tetapi saya ingin Anda tetap melakukannya; akhir diskusi"
Richard Tingle
34
standar industri, pola desain, dan praktik terbaik hanyalah istilah untuk "Hal-hal yang seseorang katakan bekerja lebih baik pada konteksnya sehingga hal itu juga mempengaruhi Anda juga. mungkin. mungkin" ®. dev seniormu benar.
CptEric
86
Ini tidak ada hubungannya dengan Agile.
Lightness Races dalam Orbit
68
"Pola desain senior pengembang" PVC buruk "disonansi kognitif
Dan Pantry

Jawaban:

239

Ini adalah kata-kata seseorang yang telah menemukan kesuksesan dan mengabaikan orang yang mencoba mengatakan kepadanya apa yang harus dilakukan dalam jargon pola yang tidak dia mengerti.

Pola desain dan praktik terbaik bukan hal yang sama. Beberapa orang mengira mereka adalah dan mendorong orang-orang yang tahu apa yang mereka lakukan gila. Bahkan jika mereka tidak tahu nama yang tepat untuk apa yang mereka lakukan.

Pola desain sudah ada sebelum mereka memiliki nama. Kami memberi mereka nama untuk mempermudah membicarakannya. Pola yang memiliki nama tidak membuatnya menjadi hal yang baik. Itu membuatnya menjadi hal yang dikenali.

Orang ini kemungkinan menggunakan pola yang tidak pernah kalian berdua dengar. Tidak apa-apa, sampai Anda perlu berbicara dengannya tentang bagaimana sesuatu dilakukan. Dia harus belajar cara berbicara dengan Anda atau Anda harus belajar cara berbicara dengannya. Tidak ada hubungannya dengan siapa yang "benar."

candied_orange
sumber
12
Setuju, dengan peringatan itu, ketika kebanyakan orang menggunakan istilah "pola desain" saat ini, mereka biasanya mengacu pada Geng Empat .
Robert Harvey
35
Benar dan saya suka menggunakan bahasa Inggris, itu masuk akal bagi saya. Tidak tahu mengapa butuh waktu lama bagi orang Prancis untuk mengadopsinya. Sampai mereka tahu, saya akan belajar sedikit tentang sistem metrik yang terus saya dengar.
candied_orange
6
Mungkin bukan karena dia tidak mengerti, mungkin juga dia memang mengerti tetapi dia tahu bahwa tidak semuanya berlaku dalam semua situasi.
whatsisname
148
"Pola yang memiliki nama tidak membuatnya menjadi hal yang baik. Itu membuatnya menjadi hal yang dapat dikenali." Ya Tuhan, ini adalah ringkasan terbaik dari masalah yang pernah saya dengar: D
Lightness Races di Orbit
7
@JanDoggen Mereka disebut (anti-) pola karena mereka juga pola umum dalam pengembangan perangkat lunak (beberapa di antaranya adalah pola yang berhubungan dengan desain).
JAB
95

Banyak pola desain, dari jenis yang Anda dan teman Anda gambarkan, benar-benar hanya solusi untuk kekurangan dalam bahasa pemrograman . Gunakan bahasa pemrograman yang lebih ekspresif, dan sebagian besar kebutuhan untuk pola desain ini menghilang.

Karena pola desain yang baik diperlukan untuk memenuhi banyak skenario penggunaan yang mungkin, mereka cenderung direkayasa berlebihan. Kode rekayasa berlebihan memiliki biaya: Anda harus membacanya, memahami apa fungsinya, dan memahami cara kerjanya dalam konteks keseluruhan sistem perangkat lunak. Akibatnya, seperti halnya dengan teknik pengembangan perangkat lunak lain, Anda harus mengevaluasi teknik terhadap biaya menggunakan teknik, dan memutuskan apakah manfaatnya melebihi biaya.

Semua hal lain dianggap sama, kode lebih sedikit selalu lebih baik. Saya telah melalui arsitektur berlapis di mana Anda benar-benar harus membuat tiga hingga enam lompatan melalui beberapa proyek untuk menemukan kode yang menarik, yaitu, kode yang benar - benar mencapai sesuatu selain menambahkan overhead.

Pola perangkat lunak yang terkenal seharusnya memberi Anda kosa kata umum di mana Anda dapat mengomunikasikan strategi desain. Sayangnya, banyak pengembang perangkat lunak tidak memahami kosa kata pola perangkat lunak dengan cukup baik untuk menerapkannya dengan benar pada masalah pemrograman mereka. Pengembang yang tidak berpengalaman melihat pola-pola ini berada dalam domain para ahli; mereka ingin dilihat sebagai ahli, dan karenanya mereka mencoba untuk belajar dan menerapkan pola terlalu dini, sebelum mereka siap. Yang harus mereka lakukan adalah fokus pada mempelajari dasar-dasar pemrograman terlebih dahulu, dan kemudian mencoba untuk memecahkan masalah yang masing-masing pola selesaikan sendiri. Jika mereka melakukan ini, mereka akan berada dalam posisi yang jauh lebih baik untuk memahami dan menerapkan pola dengan benar.

Robert Harvey
sumber
19
Nah, itu masalah yang berbeda dari yang Anda gambarkan dalam pertanyaan Anda. Toko tempat saya bekerja sekarang adalah bukti nyata bahwa Anda bisa gesit dan masih memiliki kode lean yang sangat bersih dan mudah dirawat, tetapi itu bukan perusahaan biasa, barang berlapis-lapis yang Anda lihat di sebagian besar toko di Jawa, dan ini cukup "non-standar" dalam pendekatannya. Kami tidak punya waktu satu tahun untuk membangun aplikasi dengan cara "perusahaan".
Robert Harvey
34
@ Igneous01: Perhatikan bahwa apa yang oleh seorang profesor yang belum pernah memiliki pengalaman di dunia nyata menganggap "baik" dapat berbeda secara radikal dari apa yang oleh bisnis yang berusaha menghasilkan uang dianggap "baik."
Robert Harvey
8
"Sayangnya, banyak pengembang perangkat lunak tidak memahami kosa kata pola perangkat lunak dengan cukup baik untuk menerapkannya dengan benar pada masalah pemrograman mereka." Singkatnya, ini singkatnya. =) Beberapa saya telah melihat nama-nama, saya memiliki waktu yang sangat sulit menemukan implementasi nyata dari mereka. Saya mungkin memiliki blok kode yang saya tulis yang dapat diklasifikasikan sebagai pola implementasi, tapi saya yakin tidak bisa memberi tahu Anda yang mana. Saya mulai berpikir bahwa polanya jauh lebih tidak penting daripada kode yang benar-benar dapat diuraikan dan perubahan persyaratan hanya mempengaruhi beberapa tempat kode.
jpmc26
35
Sementara saya akan dengan pedas mengambil masalah dengan "kode kurang selalu lebih baik" karena saya tahu itu mengarah ke kode yang terlihat seperti brainfuck , saya akan dengan antusias setuju dengan titik "pola kosakata". Jangan mengeluh bahwa kode saya omong kosong hanya karena Anda tidak dapat menemukannya di buku teks Anda. Ada banyak alasan yang sangat bagus untuk memanggil omong kosong kode saya, tetapi itu bukan salah satunya.
candied_orange
23
"kode yang benar-benar mencapai sesuatu selain menambahkan overhead" - Saya pikir tujuan perangkat lunak perusahaan adalah bahwa tidak boleh ada kode yang benar-benar mencapai apa pun . Setiap perilaku aktual yang mungkin dimiliki perangkat lunak, harus menjadi properti yang muncul dari desain berlapis, atau yang lain harus didorong oleh aturan bisnis yang diperlakukan oleh kode sebagai data. Saya hanya bercanda 50%.
Steve Jessop
86

Stackoverflow.SE dan Programmer.SE sebagian besar mendorong orang untuk mengikuti praktik terbaik seperti SOLID, bukan standar industri . Dan percaya atau tidak, standar industri de facto sering kali adalah arsitektur "bola besar lumpur" - serius.

Tetapi untuk menjawab pertanyaan Anda secara langsung: masalah dengan pola desain adalah sama seperti dengan warisan - banyak pengembang yang biasa-biasa saja menggunakannya secara berlebihan, yang memiliki risiko tertentu untuk membuat rekayasa ulang, sulit untuk mempertahankan kode. Tetapi jawaban untuk ini tentu bukan untuk menghindari atau melarang penggunaan pola desain (atau warisan) sepenuhnya, jawabannya adalah belajar menggunakan alat-alat ini dalam situasi di mana mereka masuk akal, dan hanya di sana. Dan ini sepenuhnya independen dari bekerja "gesit" atau tidak.

Doc Brown
sumber
Saya pikir kekhususan pernyataan Anda "masalah dengan pola desain adalah sama dengan warisan - banyak pengembang yang biasa-biasa saja menggunakannya" tidak perlu ... dengan semua aspek pengkodean, pengembang yang tidak terdidik dalam penggunaan yang tepat dari sesuatu mungkin dan sering akan menyalahgunakannya, dan menulis kode yang tidak optimal. Ini bisa dianggap aksioma pembangunan secara umum.
Jeremy Holovacs
1
@ JeremyHolovacs: tidak persis. Masalah yang saya lihat adalah bahwa bahkan pengembang yang berpendidikan terlalu sering menggunakan mereka. Saya telah melihat terlalu sering solusi di mana para dev yang berpengalaman mencoba untuk memperbaiki masalah menjadi sebuah pola yang "entah bagaimana" cocok, tetapi tidak baik.
Doc Brown
45
  1. Pola desain hanyalah nama yang digunakan untuk mengkomunikasikan ide. Saya sering menemukan diri saya melakukan hal-hal yang kemudian saya temukan yang memiliki nama. Dengan demikian, tidak ada "cara pola desain" yang bertentangan dengan "cara pola non-desain".

  2. Pola desain adalah pedoman. Sebagai segalanya, masing-masing dari mereka memiliki kelebihan dan kekurangan. Kuncinya adalah bukan untuk mempelajari pola dan menerapkannya di tempat yang cocok, tetapi untuk memahami ide pola, kelebihan dan kekurangan yang dimilikinya dan menggunakannya untuk mendapatkan inspirasi untuk solusi untuk masalah Anda.

  3. Setiap praktik dan pedoman terbaik dapat diabaikan jika ada alasan yang cukup baik. Alasan yang valid termasuk waktu pengembangan dan harapan dari aplikasi. Sebagai contoh, saya sadar bahwa itu buruk untuk nilai-nilai hardcode (contoh bodoh) tetapi untuk bukti konsep, keuntungan mungkin lebih besar daripada biaya (dalam hal ini, sebagian besar waktu pengembangan). Namun, jika keputusan seperti ini dibuat, itu mungkin menjadi bumerang dan pada titik tertentu mungkin diperlukan refactoring.

Paul92
sumber
5
RE: nomor 1, ya, sudah ada - Saya menemukan pola template. Aku hanya tidak melakukannya dulu. Atau yang seperti dulu.
Grimm The Opiner
29

Untuk menambahkan metafora lain ke dalam sup, pola desain adalah Clippy the Microsoft Office helper. "Kamu sepertinya melakukan hal yang sama pada banyak hal. Bisakah aku membantumu dengan menawarkan Iterator atau Pengunjung?"

Tulisan yang baik dari pola-pola tersebut akan menunjukkan kapan berguna untuk melakukan sesuatu dengan cara yang sama seperti yang telah dilakukan berkali-kali sebelumnya, kesalahan apa yang akan Anda buat saat pertama kali Anda mencobanya, dan apa cara umum yang ditemukan untuk menghindari kesalahan tersebut . Jadi Anda membaca pola desain (atau memeriksanya dari memori) dan kemudian melanjutkan pekerjaan Anda. Yang tidak bisa Anda lakukan, dapatkan dengan hanya menggunakan Clippy dan penyihir.

Di mana orang yang tidak berpengalaman bisa salah dan menulis kode yang tidak memperhitungkan kenyataan, adalah ketika mereka berpikir daftar pola desain mereka adalah daftar lengkap dari semua pendekatan yang mungkin untuk memecahkan masalah dalam perangkat lunak, dan mencoba untuk merancang kode dengan menghubungkan bersama desain pola sampai selesai. Taktik buruk lainnya yang diamati di alam liar adalah mengubah pola desain menjadi situasi yang tidak cocok, dengan dasar bahwa pola desain "adalah praktik terbaik". Tidak, itu mungkin atau mungkin bukan praktik terbaik untuk kelas masalah yang sebenarnya dipecahkannya , tetapi tentu saja bukan praktik terbaik untuk masalah yang gagal diselesaikan, atau untuk masalah yang diselesaikan hanya dengan memperkenalkan kompleksitas yang tidak perlu ketika ada solusi yang lebih sederhana .

Tentu saja juga mungkin bagi seseorang untuk menghindari suatu pola berdasarkan YAGNI, kemudian menyadari bahwa mereka memang membutuhkannya dan meraba-raba menuju solusi normal. Ini biasanya (tetapi tidak selalu) lebih buruk daripada menyadari persyaratan dari awal, dan itulah sebabnya bahkan dalam pengembangan tangkas itu frustasi ketika persyaratan yang benar-benar dapat diprediksi tidak ditemukan lebih awal. Saya tidak bisa menjadi satu-satunya programmer C ++ yang sangat terhibur bahwa Java pada awalnya menolak wadah generik sebagai sesuatu yang tidak perlu, kemudian melesatnya kembali nanti.

Jadi hampir pasti merupakan kesalahan untuk menghindari menulis Iterator pada prinsipnya karena Anda lebih suka menghindari pola desain.

Menambahkan bidang baru ke UI / database / lapisan Data membutuhkan 2-3 jam untuk dilakukan, sedangkan dalam kodenya diperlukan 30 menit.

Anda tidak dapat benar-benar memperdebatkan hal itu: dengan metrik ini desainnya jauh lebih baik daripada yang lain. Apakah itu karena ia menghindari pola desain masih dipertanyakan, saya pikir itu lebih mungkin karena ia menganggap masalah "dunia nyata" yang tepat ketika mendesainnya, dan dengan manfaat pengalaman lebih baik dalam pekerjaannya daripada seseorang yang dipersenjatai hanya dengan buku teks dan cita-cita tinggi.

Jadi dia mengenali bahwa pola apa pun yang mengharuskan Anda menyentuh banyak titik berbeda dalam kode untuk menambahkan bidang adalah pola yang buruk untuk pekerjaan itu, "membuatnya mudah untuk menambahkan bidang", dan dia tidak menggunakan pola itu. Arsitektur berlapis memang bisa menderita dalam hal itu, dan adalah salah untuk menggunakan pola desain tanpa menghargai kelemahannya.

Sebagai lawannya, berapa lama waktu yang dibutuhkan untuk menulis UI baru dalam desainnya, dan berapa lama waktu yang dibutuhkan dalam arsitektur berlapis? Jika proyek memanggilnya untuk terus-menerus membangun dan menggunakan UI baru di atas model data tetap, alih-alih terus-menerus menambahkan bidang, mudah-mudahan dia malah merancang untuk itu. Atau juga. Tetapi untuk semua manfaatnya, mengatakan "kita lincah" sayangnya tidak berarti Anda tidak perlu melakukan trade-off lagi!

Memilih dari menu pola desain tentu dapat menghentikan Anda memikirkan masalah yang paling penting. Tetapi mengenali ketika Anda sedang menulis Pengunjung, dan mendokumentasikan atau menamakannya "Pengunjung" untuk membantu pembaca mendapatkannya dengan cepat, tidak banyak menghalangi apa pun. Menulis "ini adalah Pengunjung" alih - alih mendokumentasikannya dengan benar adalah kesalahan mengerikan karena alasan yang diberikan dev senior Anda - programmer tidak akan memahaminya. Bahkan programmer yang tahu apa yang Pengunjung butuhkan lebih dari sekadar informasi, "ini adalah Pengunjung".

Steve Jessop
sumber
5
"Pola desain Clippy the Microsoft Office helper" Aku akan mengalami mimpi buruk malam ini.
MetalMikester
"Di mana orang yang tidak berpengalaman bisa salah [adalah ketika mereka] mencoba merancang kode dengan menghubungkan pola desain bersama sampai selesai." Dengar dengar. Saya berharap saya memiliki beberapa upvotes untuk diberikan. :)
Quuxplusone
Saya juga berharap saya memiliki beberapa upvotes untuk paragraf terakhir. Pola desain adalah kosa kata pemrograman: Anda akan menjadi penulis yang lebih baik dan lebih jelas jika Anda memiliki kosa kata yang besar. Saya bisa memberi tahu Pabrik dari Builder ketika saya melihatnya, tetapi saya tidak mendapatkannya dari membaca buku tentang pola desain, lebih dari saya belajar bagaimana cara membedakan tebing dari tebing dengan membaca kamus bahasa Inggris.
Quuxplusone
20

Rekan Anda tampaknya menderita sindrom NIH ("Tidak Diciptakan Di Sini").

Sangat masuk akal bahwa kodenya membuatnya lebih mudah untuk menambahkan bidang baru: Saya juga jauh lebih cepat untuk memperbarui kode saya sendiri daripada kode yang ditulis oleh orang lain. Tetapi kecepatan jangka pendek ini tidak mengatakan apa-apa tentang rawatan dan portabilitas kode. Saya akan memberinya keuntungan dari keraguan: Kode yang ada mungkin memang terstruktur dengan buruk jika mengikuti buku teks dengan buruk atau mengikuti resep yang baik dalam konteks yang salah.

Menghindari pola desain benar-benar mengejutkan. Dalam 30 tahun terakhir saya coding dan mengelola coders, pola desain membantu untuk menempatkan kata-kata pada hal-hal yang dilakukan secara naluriah, membantu sehingga lebih cepat memahami maksud, keuntungan, ketidaknyamanan, risiko, peluang dan pola terkait. Pola desain terbukti akselerator nyata untuk menguasai kompleksitas!

  • Mungkin kolega Anda benar-benar jauh lebih cerdas daripada kebanyakan dari kita dan dia mampu membayar biaya overhead dari menciptakan kembali pola tanpa penurunan produktivitas yang nyata?

  • Argumen bahwa "programmer tidak mengerti pola desain" terdengar seperti "Saya tidak bisa menjelaskan apa yang saya lakukan". Atau "Saya tidak ingin berdebat tentang desain saya sendiri". Saya benar-benar berpikir bahwa polaisasi dapat meningkatkan pemahaman secara keseluruhan, dan itu dapat memungkinkan kolega yang kurang senior untuk berbagi pendapat yang berharga. Tetapi mungkin kolega senior Anda ingin menghindari hal itu.

Pendekatan berlapis telah terbukti lebih unggul dari arsitektur lain di sebagian besar aplikasi perusahaan. Paket-paket terkemuka kelas dunia terstruktur di sekitar ide ini dan mengungguli arsitektur artisanal atas perintah besarnya. Martin Fowler menyajikan pendekatan ini dalam bukunya yang sangat bagus tentang "Pola arsitektur perusahaan". Oh! Maaf lagi: Ini tentang pola yang terbukti; tidak ada peluang dalam tampilan NIH kolega Anda ;-)

Christophe
sumber
Sindrom NIH, menarik, saya belum pernah mendengar ini sebelumnya. Jelas itu adalah masalah yang dihadapi sebagian besar pengusaha Amerika Utara dengan cara mengelola karyawan mereka!
bayar
@membayar Saya tidak yakin ini terbatas di Amerika Utara ;-) Selalu menggoda untuk mencari solusi yang sudah kami gunakan di masa lalu dengan beberapa keberhasilan. Ini zona nyaman. Tetapi seseorang harus selalu tetap terbuka terhadap ide-ide baru dan dialog yang konstruktif dengan kolega yang menantang. Lagi pula, " Anda bepergian lebih cepat sendirian, tetapi lebih jauh bersama-sama. "
Christophe
16

Wawasan utama yang dilewatkan banyak orang adalah desain perangkat lunak bersifat kontekstual. Itu ada untuk mencapai tujuan bisnis, dan tujuan yang berbeda mungkin memerlukan pendekatan yang berbeda. Dengan kata lain, tidak ada desain yang selalu terbaik, meskipun selalu ada desain terbaik.

Pola desain adalah solusi standar untuk masalah standar. Namun, jika Anda tidak memiliki masalah, menyelesaikannya adalah usaha yang sia-sia.

Perbedaan utama antara air terjun dan desain perangkat lunak yang gesit adalah ketika keputusan desain dibuat. Di air terjun, kami mengumpulkan semua persyaratan, mengidentifikasi pola desain mana yang kami butuhkan, dan baru kemudian mulai mengkode. Dalam arsitektur yang gesit, kami mengikuti prinsip YAGNI untuk menunda keputusan desain sampai saat bertanggung jawab terakhir, ketika kami tahu sebanyak mungkin tentang pilihan yang kami bisa.

Artinya, di air terjun, pola desain cenderung diterapkan jika kebutuhan mereka diantisipasi , gesit, ketika mereka benar - benar dibutuhkan . Akibatnya, proyek gesit cenderung menerapkan pola desain lebih jarang, karena tidak semua kebutuhan yang diantisipasi adalah aktual.

meriton
sumber
1
+1 untuk Design patterns are standard solutions to standard problems. Saya agak kecewa karena tidak melihat itu dalam jawaban yang lebih terangkat. Jadi, ini perlu terlebih dahulu untuk mengidentifikasi apakah masalah Anda Anda cocok dengan masalah standar, dan sangat sering, mereka akan menyelesaikannya.
Walfrat
8

Pola desain tidak benar-benar disebut pola desain karena mereka menentukan apa yang harus dilakukan. Pola desain adalah pola desain karena menggambarkan apa yang telah dilakukan sebelumnya . Beberapa pengembang atau pengembang merancang metode yang menyelesaikan tugas tertentu dengan baik, dan dapat menerapkannya pada situasi yang sama dengan hasil yang sama. Hanya itu saja. Banyak pola memiliki kekuatan dan kelemahan yang melekat, dan tergantung pada pengembang yang terdidik untuk mengevaluasi kebutuhan teknologi dan bisnis untuk menentukan pola yang sesuai untuk diterapkan.

Mengingat hal itu, kecuali Anda benar-benar berkomitmen untuk menulis kode 100% satu kali, di mana tidak ada konsep atau implementasi yang dapat digunakan dari satu use case ke yang berikutnya, Anda hampir pasti menggunakan setidaknya beberapa pola desain. Mereka mungkin tidak memiliki nama-nama umum yang mencolok seperti "Repositori" atau "Unit Kerja" atau bahkan "MVC", tetapi itu tidak membuat mereka "bukan pola desain".

Jeremy Holovacs
sumber
6

Saya biasanya suka berpikir tentang cara - katakan - "navigasi" menggunakan GPS. Saat mempelajari 'praktik terbaik' dan 'pola desain' - Anda belajar mengambil rute navigasi GPS. Tetapi ketika Anda tahu daerahnya, Anda akan sering belajar bahwa mengemudi di jalan samping akan membawa Anda melewati daerah yang bermasalah, membuat Anda di sana lebih cepat dan / atau lebih baik. Sama halnya dengan hal-hal ini - pengalaman membuat Anda dapat mendekonstruksi kotak alat Anda dan mengambil jalan pintas.

Mempelajari pola desain dan mempelajari "praktik terbaik" berarti Anda memperoleh pemahaman tentang ide di baliknya sehingga Anda dapat memilih dalam situasi tertentu. Karena situasi kehidupan nyata seringkali lebih kompleks dibandingkan dengan situasi teoritis - Anda akan sering mengalami kendala dan masalah yang tidak ditemukan dalam buku teks. Klien / Pelanggan menginginkan produk mereka cepat dan biasanya murah; Anda perlu bekerja dengan kode lawas; Anda perlu berinteraksi dengan alat pihak ketiga yang mungkin merupakan kotak hitam dan tidak efektif; dan segala macam hal. Situasi Anda spesifik - praktik dan pola terbaik lebih umum.

Salah satu alasan utama bahwa banyak orang di situs seperti SE akan memberikan jawaban 'praktik terbaik' dan jawaban 'pola desain' adalah karena mereka menjawab dalam solusi umum dan abstrak dan karenanya membantu menyediakan bahasa yang sama untuk menyelesaikan jenis masalah. Dan untuk membuat Anda belajar.

Jadi - tidak - pola desain tidak disukai di lingkungan pengembangan Agile; Namun pengembangan jarang bersifat umum dan abstrak agar sesuai dengan suatu pola dengan sempurna dan pengembang (berpengalaman) mengetahui hal ini.

Allan S. Hansen
sumber
5

Menambahkan bidang baru ke UI / database / lapisan Data membutuhkan 2-3 jam untuk dilakukan, sedangkan dalam kodenya diperlukan 30 menit.

Jika Anda ingin "mengoptimalkan" suatu desain, Anda perlu mengatakan apa yang ingin Anda optimalkan.

Sebagai contoh, sepeda balap adalah kendaraan yang dioptimalkan ... dan Boeing 747 juga merupakan kendaraan yang dioptimalkan ... tetapi mereka dioptimalkan untuk serangkaian persyaratan yang berbeda.

Ide pola "MVC", misalnya, mengoptimalkan untuk hal-hal seperti:

  • Tampilan berbeda dari model yang sama (tampilan tidak tergantung model)
  • Setiap lapisan dapat dikembangkan secara terpisah (misalnya oleh tim yang berbeda) dan diuji secara terpisah (tes unit) sebelum integrasi
  • dll.

Sedangkan kodenya mungkin mengoptimalkan untuk hal lain, misalnya:

  • Baris kode minimal
  • Mudah bagi satu orang untuk membuat perubahan yang mempengaruhi semua lapisan (dengan tidak memiliki lapisan yang benar-benar berbeda)
  • dll.

Deskripsi pola dimulai dengan deskripsi masalah yang ingin diselesaikan oleh pola. Jika dia berpikir itu "praktik terbaik" untuk tidak menggunakan pola tertentu, maka (dengan asumsi itu bukan pola bodoh, dengan asumsi itu adalah pola yang kadang-kadang berguna) Saya kira dia tidak memiliki / mengalami masalah khusus yang diklaim oleh pola itu untuk menyelesaikan, dan / atau dia mendapat masalah berbeda (lebih besar atau lebih mendesak, bersaing) yang dia coba optimalkan.

ChrisW
sumber
"dengan tidak memiliki lapisan yang benar-benar berbeda sama sekali" - atau, agar adil, dengan memiliki "perilaku default" yang dapat diterima yang menyebar melalui lapisan. Sebagai contoh, aplikasi admin SQL berbasis web adalah lapisan presentasi yang secara otomatis memperbarui sendiri ketika lapisan basis data berubah. Hanya saja, selain untuk penggunaan terbatas, mereka tidak benar-benar menyajikan data Anda seperti yang Anda inginkan disajikan kepada pengguna :-) Setengah jam tampaknya sangat cepat untuk menambahkan bidang baru, menunjukkan bahwa tidak ada UI yang signifikan untuk merancang di koneksi dengan bidang baru, berlapis atau lainnya.
Steve Jessop
4

Pola desain adalah alat. Seperti alat, ada dua cara untuk menggunakannya: cara yang benar, dan cara yang salah. Misalnya, jika saya memberi Anda obeng dan paku, dan meminta Anda untuk menggabungkan dua potong kayu, Anda harus meminta saya untuk palu. Palu digunakan untuk paku, sedangkan obeng digunakan untuk sekrup.

Terlalu sering, pola desain diiklankan sebagai One True Way, yang seringkali hanya benar ketika masalah tertentu muncul. Pengembang junior sering seperti anak-anak ketika mereka menemukan sesuatu yang baru untuk dimainkan; mereka ingin menerapkan pola desain itu untuk semuanya . Dan secara inheren tidak ada yang salah dengan itu, selama mereka akhirnya mengetahui bahwa Pola A berlaku untuk Masalah B, dan Pola C berlaku untuk Masalah D. Sama seperti Anda tidak menggunakan obeng untuk menggerakkan kuku, Anda tidak menggunakan alat khusus pola hanya karena itu ada; Anda menggunakan pola karena itu alat (dikenal) terbaik untuk pekerjaan itu.

Sisi lain dari pola adalah anti-pola. Hal-hal yang telah terbukti berulang kali menjadi buruk, biasanya dalam hal waktu eksekusi atau memori. Namun, baik pola dan anti-pola tidak ada gunanya bagi pengembang yang tidak mengerti mengapa mereka ada. Pengembang suka berpikir bahwa apa yang mereka lakukan adalah baru dan inventif, tetapi sebagian besar waktu, mereka tidak. Itu kemungkinan telah dipikirkan sebelumnya. Orang-orang sebelum mereka telah menciptakan pola karena pengalaman.

Tentu saja, pengembang junior sering kali muncul dengan cara baru dalam melakukan hal-hal lama, dan kadang-kadang cara itu lebih baik. Namun, terlalu sering berakhir dengan kasus efek Dunning-Kruger; pengembang cukup tahu untuk membuat program fungsional, tetapi tidak memahami keterbatasan mereka sendiri. Satu-satunya cara untuk melewati ini tampaknya melalui pengalaman, baik positif maupun negatif. Mereka mengabaikan pola karena mereka percaya diri mereka lebih unggul, tetapi tidak tahu bahwa, pada kenyataannya, 10.000 pengembang telah menggunakan desain tertentu, dan kemudian membuangnya karena itu sebenarnya buruk.

Agile mendukung "menyelesaikan sesuatu dengan responsif" dalam hal menyesuaikan dengan cepat dengan kebutuhan klien yang terus berubah. Itu tidak mendukung pola desain atau membenci mereka. Jika suatu pola adalah metode tercepat dan paling dapat diandalkan, maka pengembang harus menggunakannya. Jika suatu pola tertentu akan menghabiskan lebih banyak waktu daripada sekadar "menyelesaikannya," menggunakan sesuatu yang bukan-suatu pola kemungkinan baik-baik saja (dengan asumsi, tentu saja, bahwa kinerja tidak sangat terdegradasi, dll). Jika tidak ada pola yang diketahui dapat ditemukan, mendesain sendiri lebih disukai daripada memberi tahu klien "tidak." Klien, terutama klien yang membayar, biasanya benar.

Siapa pun yang mengklaim bahwa pola adalah The Way, atau mengklaim bahwa pola adalah The Bane Of Existence, salah. Pola adalah alat, yang dimaksudkan untuk diterapkan pada situasi tertentu, dan memiliki berbagai tingkat keberhasilan berdasarkan keadaan. Ini adalah sebuah Kebenaran, yang tidak bergantung pada apakah Anda memilih MVC atau tidak, jika Anda menggunakan Objek Transfer Data, atau tidak, dll. Yang penting adalah menerapkan kode dalam jangka waktu yang cukup singkat, yang berkinerja cukup baik bagi pengguna, dan cukup bebas dari bug logika.

Biasanya , pola akan memungkinkan bentuk desain yang koheren, dan akan tampil lebih baik daripada mengabaikan semua pola yang mendukung penulisan 100% ide asli, tetapi Anda tidak dapat menghindari semua pola. Misalnya, jika y = x + 5, apakah Anda benar-benar akan menulis y = x + (5 * 3 + 15/3) / 4, hanya untuk menghindari pola penulisan x + 5? Tidak, bukan kau. Anda akan menulis y = x + 5, dan beralih ke masalah berikutnya.

Orang-orang menggunakan pola setiap hari, dan itu tidak masalah . Yang paling penting adalah memiliki kode yang berfungsi secara logis, jarang macet, dan ramah pengguna. Tidak ada yang lebih penting dari itu.

phyrfox
sumber
Saya pikir peringatan dengan ini adalah situasi yang, berdasarkan pada pemahaman 'saat ini' Anda tentang masalah dan domain, Anda dapat membuat kelas baru atau mengikuti pola yang berlaku untuk situasi tersebut, tetapi kemudian pada hari berikutnya klien menginginkan Anda untuk membuat penyesuaian untuk mereka ke beberapa sisi kecil yang klien tidak akan inginkan dalam versi mereka. Mengkonsolidasikan basis kode yang melayani kebutuhan 2 lusin klien dan menghindari menyalin pasta sepertinya tidak mungkin tercapai. Saya baru saja mengalami ini hari ini ketika refactoring proses penggabungan surat lama.
Igneous01
2

Anda tidak dapat 'menghindari pola desain', kecuali saya kira dengan menghindari mendesain dua bagian sistem Anda dengan cara yang sama (yang saya tidak rekomendasikan dan saya ragu pengembang senior Anda melakukannya). Apa yang mungkin ia maksudkan adalah 'hindari penggunaan desain secara membabi buta hanya karena ia mematuhi pola desain'. Memikirkan apa yang Anda lakukan jelas merupakan 'praktik terbaik', dan satu universitas harus ada untuk mengajar; Sayangnya, itu tampaknya tidak terjadi.

Jonathan Cast
sumber
2

Pola desain tidak bertentangan dengan praktik gesit. Apa yang bertentangan dengan praktik gesit adalah menggunakan pola desain demi menggunakan pola desain, praktik umum di antara lulusan baru dan siswa untuk berpikir di sepanjang garis "bagaimana kita akan menyelesaikan masalah ini menggunakan pola pabrik".

Agile berarti memilih alat terbaik untuk pekerjaan itu, TIDAK berusaha membentuk pekerjaan agar sesuai dengan alat yang Anda pilih.
Dan tbh itulah yang terjadi SEMUA praktik pengembangan akal sehat (meskipun seringkali Anda tentu saja harus membuat kompromi karena pemilihan alat yang dapat Anda pilih biasanya dibatasi oleh standar perusahaan, pembatasan lisensi (seperti GPL dan terkadang alat sumber terbuka lainnya sering kali tidak dapat digunakan, terutama ketika membangun perangkat lunak untuk dijual kembali), dan hal-hal seperti itu.

Kolega / teman Anda mungkin keberatan dengan kode Anda bukan karena menggunakan pola desain semata, tetapi karena itu adalah konstruksi buatan yang dirancang untuk menunjukkan penggunaan pola tertentu ketika desain lain lebih baik (meskipun sering subjektif, saya telah (dan banyak dengan saya tidak diragukan lagi) telah melihat banyak contoh di mana penggunaan paksa dari pola desain tertentu menyebabkan kode jelek, sulit dipelihara, dan sangat tidak efisien).

jwenting
sumber