Prinsip-prinsip SOLID vs YAGNI

43

Kapan prinsip-prinsip SOLID menjadi YAGNI?

Sebagai pemrogram, kami membuat pertukaran sepanjang waktu, antara kerumitan, pemeliharaan, waktu untuk membangun, dan sebagainya. Di antara yang lain, dua pedoman paling cerdas untuk membuat pilihan ada dalam pikiran saya prinsip-prinsip SOLID dan YAGNI. Jika Anda tidak membutuhkannya; jangan membangunnya, dan jaga kebersihannya.

Sekarang misalnya, ketika saya menonton seri dimecast pada SOLID , saya melihatnya dimulai sebagai program yang cukup sederhana, dan berakhir sebagai yang cukup kompleks (ujung ya kompleksitas juga di mata yang melihatnya), tetapi masih membuat saya bertanya-tanya: kapan prinsip SOLID berubah menjadi sesuatu yang tidak Anda butuhkan? Semua prinsip yang solid adalah cara kerja yang memungkinkan penggunaan untuk membuat perubahan di tahap selanjutnya. Tetapi bagaimana jika masalah yang harus dipecahkan adalah masalah yang cukup sederhana dan ini adalah aplikasi yang dapat dibuang, lalu bagaimana? Atau apakah prinsip-prinsip SOLID sesuatu yang selalu berlaku?

Seperti yang ditanyakan dalam komentar:

KeesDijk
sumber
Bukankah seharusnya judulnya juga SOLID principle vs YAGNI?
Wolf
2
@ Wolf: Ini adalah jamak "SOLID (Tanggung jawab tunggal, terbuka-tertutup, substitusi Liskov, Segregasi antarmuka dan inversi Ketergantungan) adalah akronim mnemonik yang diperkenalkan oleh Michael Feathers untuk 'lima prinsip pertama' yang dinamai oleh Robert C. Martin pada awal 2000-an yang mewakili lima prinsip dasar pemrograman dan desain berorientasi objek. "
logc

Jawaban:

55

Selalu sulit untuk menilai pendekatan berdasarkan screencast, karena masalah yang dipilih untuk demo biasanya sangat kecil sehingga menerapkan prinsip-prinsip seperti SOLID dengan cepat membuatnya tampak seperti solusi yang sepenuhnya direkayasa.

Saya akan mengatakan prinsip-prinsip SOLID hampir selalu berguna. Setelah Anda menjadi mahir dengan mereka, menggunakannya tidak tampak seperti sesuatu yang harus Anda pikirkan secara sengaja. Itu menjadi alami. Saya telah melihat banyak sekali aplikasi sekali pakai menjadi lebih dari itu, jadi saya sekarang takut mengatakan bahwa saya akan membuang sesuatu, karena Anda tidak pernah tahu.

Pendekatan yang biasanya saya ambil adalah bahwa jika saya sedang menulis aplikasi sederhana untuk tugas tertentu, saya kadang-kadang akan melupakan prinsip-prinsip nama besar demi beberapa baris kode yang berfungsi. Jika saya menemukan bahwa saya kembali ke aplikasi itu untuk membuat perubahan lebih lanjut, saya akan meluangkan waktu untuk membuatnya SOLID (setidaknya agak, karena penerapan prinsip 100% jarang layak).

Dalam aplikasi yang lebih besar, saya memulai dari yang kecil dan seiring perkembangan program, saya menerapkan prinsip-prinsip SOLID jika memungkinkan. Dengan cara ini saya tidak mencoba untuk mendesain semuanya di muka sampai akhir. Bagi saya, itu adalah sweet spot tempat YAGNI dan SOLID hidup berdampingan.

Adam Lear
sumber
Ini adalah apa yang saya pikirkan juga. Sebagai komentar saya tidak menilai oleh screencast, saya hanya berpikir itu adalah contoh yang bagus tentang bagaimana perangkat lunak dapat tumbuh ketika menerapkan SOLID.
KeesDijk
Poin bagus. Setiap demonstrasi akan condong untuk menunjukkan atau memperburuk masalah yang dihadapi. Pada dasarnya, ini adalah ide keseluruhan untuk mengambil ide sampai pada kesimpulan sepenuhnya untuk membuktikannya sebagai kesalahan. Premis itu sendiri bisa disalahgunakan.
Berin Loritsch
YAGNI and SOLID coexistkesimpulan yang bagus. Meskipun itu mungkin menjadi titik awal yang baik
Wolf
Tampaknya mungkin diperlukan firasat kadang-kadang. Anda harus tahu di mana Anda mungkin mulai melihat banyak perubahan untuk mengetahui di mana level abstraksi Anda dibandingkan dengan pipa ledeng berhenti dan mulai.
johnny
19

Pikirkan masalah yang dihadapi terlebih dahulu dan terutama. Jika Anda secara membuta menerapkan prinsip-prinsip YAGNI atau SOLID, Anda dapat melukai diri sendiri nantinya. Sesuatu yang saya harap kita semua bisa mengerti adalah bahwa tidak ada pendekatan desain "satu" yang cocok untuk semua masalah. Anda dapat melihat bukti bahwa ketika sebuah toko menjual topi yang diiklankan sebagai "satu ukuran cocok untuk semua", tetapi itu tidak sesuai dengan kepala Anda. Itu terlalu besar atau terlalu kecil.

Alih-alih, lebih baik untuk memahami prinsip dan masalah yang berusaha diatasi oleh SOLID; serta prinsip dan masalah yang YAGNI coba atasi. Anda akan menemukan bahwa yang satu berkaitan dengan arsitektur aplikasi Anda dan yang lainnya berkaitan dengan proses pengembangan secara keseluruhan. Meskipun ada beberapa kasus yang tumpang tindih, mereka merupakan masalah yang sangat berbeda.

YAGNI (Anda Tidak Akan Membutuhkannya [akronim Amerika kuno]) berkaitan dengan menghemat waktu pengembang dengan menambahkan fondasi beton bertulang baja kembali ke jembatan yang hanya dimaksudkan untuk menjangkau anak sungai selebar 3 kaki ketika jembatan kayu yang lebih sederhana akan melakukan hal yang sama. baik. Jika kita membentang sungai selebar satu mil dan perlu mendukung beberapa trailer traktor, tentu saja kita akan membutuhkan pekerjaan pondasi ekstra. Intinya, YAGNI memberitahu Anda untuk melihat gambar yang lebih besar dan desain untuk kebutuhan saat ini . Ini menangani masalah membuat sesuatu terlalu rumit karena kami mengantisipasi sejumlah kebutuhan potensial yang belum diidentifikasi oleh pelanggan.

PADAT berkaitan dengan bagaimana kita memastikan potongan-potongan jembatan cocok bersama dengan benar, dan dapat dipertahankan dari waktu ke waktu. Anda dapat menerapkan prinsip SOLID pada jembatan kayu serta jembatan beton bertulang baja.

Singkatnya, kedua konsep ini tidak harus bertentangan satu sama lain. Ketika Anda menemukan sebuah situasi di mana Anda percaya bahwa mereka ada, inilah saatnya untuk melihat gambaran besarnya. Bergantung pada kesimpulan Anda, Anda mungkin memutuskan untuk menghilangkan sebagian dari prinsip-prinsip SOLID atau Anda mungkin memutuskan bahwa Anda benar-benar membutuhkannya.

Berin Loritsch
sumber
Ya, setuju .. tidak ada pendekatan peluru perak yang cocok untuk setiap skenario.
EL Yusubov
Anda make sure the pieces of the bridge fit togetheradalah jauh tidak jelas seperti can be maintained over time.
Wolf
Pada dasarnya, SOLID adalah apa yang akan memungkinkan Anda untuk mengubah jembatan kayu itu menjadi jembatan baja sepanjang 1 mil yang mampu mendukung peleton lapis baja tanpa melakukan penulisan ulang penuh atau dengan hanya menempel pada retasan setelah retasan.
sara
@ Kai, itu premis palsu. Jika Anda membutuhkan jembatan yang membentang 1 mil, maka Anda merancang jembatan yang membentang 1 mil. Jika Anda membutuhkan jembatan yang membentang 5 kaki, Anda membangun jembatan yang membentang 5 kaki. Jangan salah paham, prinsip SOLID sangat membantu, tetapi butuh lebih banyak pemahaman dari mereka untuk mengetahui prinsip mana yang tidak perlu untuk masalah yang dihadapi. 9 kali dari 10, tambahan itu tidak pernah dibutuhkan.
Berin Loritsch
@BerinLoritsch itulah sebabnya saya setuju bahwa jika Anda membutuhkan 5 kaki, Anda membangun 5 kaki, tetapi Anda TIDAK membangun 5 kaki dengan membuang beberapa 2x4s ke tanah. Anda melakukan apa yang Anda butuhkan, dan Anda melakukannya dengan baik. (Meskipun analoginya agak berantakan)
Sara
9

Prinsip-prinsip SOLID tidak diperlukan ketika itu adalah aplikasi yang dibuang; kalau tidak mereka selalu dibutuhkan.

SOLID dan YAGNI tidak berselisih: Desain kelas yang baik membuat aplikasi lebih mudah dirawat. YAGNI hanya menyatakan bahwa Anda seharusnya tidak menambahkan kemampuan aplikasi Anda untuk menjadi monster yang dapat dikonfigurasi yang dapat melakukan segalanya di bawah matahari - kecuali jika benar-benar membutuhkannya.

Perbedaan antara kelas mobil yang memiliki batas yang jelas (SOLID) dan kelas mobil yang memiliki kemampuan untuk sembuh sendiri (YAGNI) sebelum pelanggan memintanya.

George Stocker
sumber
1
Bukankah ini tercampur aduk? Bagaimana dengan ini: Terapkan prinsip SOLID dengan benar untuk menangani kerumitan mobil yang dapat menyembuhkan diri sendiri, atau terapkan YAGNI selama mobil Anda masih sangat sederhana sehingga tidak akan pernah rusak (atau - sebagai alternatif - begitu ciak sehingga mereka dapat dibuang begitu saja) .
Wolf
2
@ Serigala prinsip SOLID tidak mengatakan APA yang harus Anda lakukan, hanya BAGAIMANA. jika Anda sudah memutuskan bahwa Anda menginginkan mobil yang dapat menyembuhkan sendiri, maka Anda dapat menerapkan prinsip-prinsip SOLID pada kode itu. SOLID tidak mengatakan apakah mobil penyembuhan sendiri adalah ide yang baik. Di situlah YAGNI masuk
sara
Seringkali aplikasi yang dibuang tidak.
Tulains Córdova
"Menyembuhkan diri" itu bagus. "Sebelum pelanggan memintanya," juga baik karena saya pikir seluruh ide, jika Anda mendengarkan Paman Bob, adalah untuk tempat-tempat yang menghasilkan keuntungan dan mengantisipasi kebutuhan pelanggan dan memiliki bisnis yang layak yang dapat merespons kebutuhan. karena mereka berubah. Banyak orang merasa kesal pada Paman Bob karena dia tidak mendapatkan hak untuk pemrograman, tetapi dia mengatakan kepada Anda, sebagian besar waktu, mengapa penting untuk menggunakan SOLID, bukan hanya bagaimana.
johnny
"Prinsip-prinsip SOLID tidak diperlukan ketika itu adalah aplikasi yang dibuang" . Saya pikir prinsip-prinsip SOLID adalah kebiasaan yang baik, jadi meskipun itu adalah aplikasi membuang, Anda melatih diri sendiri ketika Anda perlu menulis aplikasi besar, sehingga bisa ada manfaat mengikuti prinsip-prinsip SOLID.
icc97
4

Tidak ada yang selalu berlaku! Jangan Biarkan Astronot Arsitektur Menakutkan Anda! Yang penting adalah mencoba dan memahami masalah apa yang sedang dicoba diatasi oleh prinsip-prinsip ini sehingga Anda dapat membuat keputusan berdasarkan informasi tentang penerapannya.

Baru-baru ini saya berusaha memahami kapan saya harus menggunakan Prinsip Tanggung Jawab Tunggal ( inilah yang saya kemukakan.)

Semoga ini membantu!

Brandon
sumber
2

Ada kutipan yang dikaitkan dengan Einstein (mungkin variasi yang asli ):

"Semuanya harus dibuat sesederhana mungkin, tetapi tidak sederhana."

Dan itu kurang lebih pendekatan yang saya ambil ketika dihadapkan dengan tradeoff SOLID vs YAGNI: menerapkannya sebagai alternatif, karena Anda tidak pernah tahu apakah suatu program kode 'membuang-buang' atau tidak. Jadi, tambahkan saja lapisan kotoran yang berfungsi, lalu poleskan ke antarmuka yang lebih bersih ... dan ulangi sampai Anda bertemu ke tingkat entropi yang tepat. Semoga.

logc
sumber
Poin bagus: you never know if a program is 'throw-away' code- yah, saya pikir ide alternatifnya tidak terlalu bagus.
Wolf
@ Wolf: ya, saya memperluas urutan langkah yang menurut saya terbaik (dirangkum dalam slogan 'Pertama memungkinkan, lalu buatlah indah, lalu buat cepat'), tapi kemudian saya berpikir ... YAGNI :)
logc
1

Ada banyak cara untuk merancang program untuk masalah yang diberikan; SOLID adalah upaya untuk mengidentifikasi sifat-sifat desain yang baik. Penggunaan SOLID yang benar seharusnya menghasilkan program yang lebih mudah untuk dipikirkan dan dimodifikasi.

YAGNI dan KISS prihatin dengan cakupan fitur. Suatu program yang memecahkan lebih banyak jenis masalah lebih kompleks dan abstrak. Jika Anda tidak membutuhkan generalisasi itu, Anda telah menghabiskan waktu dan upaya membuat kode yang lebih sulit untuk dipahami dan dipelihara tetapi tidak menawarkan nilai tambah.

Program yang dirancang dengan baik tidak selalu berfokus hanya pada fitur yang dibutuhkan saja. Program yang hanya berfokus pada fitur yang dibutuhkan belum tentu dirancang dengan baik. Tidak ada trade-off, hanya dua sumbu ortogonal di ruang pengambilan keputusan. Program yang ideal bersifat modular dan hanya memiliki fitur-fitur penting.

Doval
sumber
0

Saya pikir Anda harus memulai YAGNI dan kapan pun ada kebutuhan, PADAMKAN itu.

Apa yang saya maksud adalah SOLID ada sehingga ketika Anda menambahkan kelas baru Anda tidak perlu refactor, cukup beralih implementasi (misalnya), baik menurut saya, tulis kode Anda sederhana, dan ketika Anda melihat bahwa Anda mengubah barang - ubahlah dengan SOLID (yaitu refactoring yang ditakuti SOLID seharusnya menyelamatkan Anda - tidak begitu buruk ketika Anda baru memulai).

Anda tidak membuang-buang waktu karena Anda harus tetap melakukan pekerjaan (di awal) dan di mana pun diperlukan, kode Anda bagus dan rapi.

Saya kira Anda bisa menyebutnya evaluasi malas SOLID.

Binyamin
sumber
Hm, saya melihat maksud Anda tentang posting yang berlebihan, saya akan menghapusnya tetapi sepertinya saya tidak memiliki hak untuk melakukannya (atau saya tidak melihat tombolnya). Either way saya akan mengeditnya menjadi lebih jelas.
Binyamin