TL; DR: itu tergantung pada apa yang Anda coba selesaikan.
Saya sudah melakukan percakapan yang sama dengan kakek saya tentang ini, sementara kami berbicara tentang bagaimana Fungsi dan Aksi di C # mengagumkan. Kakek saya adalah programmer timer yang sangat tua, yang sudah ada di sekitar kode sumber sejak perangkat lunak dijalankan pada komputer yang mengambil seluruh ruangan.
Dia mengubah teknologi beberapa kali dalam hidupnya. Dia menulis kode dalam C, COBOL, Pascal, BASIC, Fortran, Smalltalk, Jawa dan akhirnya memulai C # sebagai hobi. Saya belajar bagaimana memprogram dengan dia, duduk di pangkuannya sementara saya hanyalah seorang pemuja, mengukir baris kode pertama saya pada editor biru dari SideKick IBM. Pada saat saya berusia 20 tahun, saya sudah menghabiskan lebih banyak waktu coding daripada bermain di luar.
Itu sedikit ingatan saya, jadi maafkan saya jika saya tidak benar-benar praktis saat menceritakan kembali. Saya agak suka saat-saat itu.
Itu yang dia katakan kepada saya:
"Haruskah kita pergi untuk generalisasi masalah, atau menyelesaikannya dalam lingkup spesifik, apakah Anda bertanya? Nah, itu ... pertanyaan."
Kakek terdiam sejenak untuk memikirkannya sejenak, sambil memperbaiki posisi kacamatanya di wajahnya. Dia memainkan game match-3 di komputernya, sambil mendengarkan LP Deep Purple di sound system lamanya.
"Yah, itu akan tergantung pada masalah apa yang Anda coba selesaikan", katanya kepada saya. "Sangat menggoda untuk percaya bahwa ada satu solusi suci untuk semua pilihan desain yang ada, tetapi tidak ada. Arsitektur Perangkat Lunak seperti keju, Anda tahu."
"... Keju, Kakek?"
"Tidak masalah apa yang kamu pikirkan tentang favoritmu, akan selalu ada seseorang yang berpikir itu bau".
Aku mengerjap dalam kebingungan sejenak, tetapi sebelum aku bisa mengatakan apa pun, kakek melanjutkan.
"Ketika kamu sedang membangun mobil, bagaimana kamu memilih bahan untuk bagian?"
"Aku ... kurasa itu tergantung pada biaya yang terlibat dan apa yang harus dilakukan bagian itu, kurasa."
"Itu tergantung pada masalah yang coba dipecahkan oleh bagian itu. Anda tidak akan membuat ban yang terbuat dari baja, atau kaca depan yang terbuat dari kulit. Anda memilih bahan yang paling baik memecahkan masalah yang Anda miliki. Sekarang, apa itu solusi generik? Atau yang spesifik? Untuk masalah apa, untuk kasus penggunaan apa? Haruskah Anda menggunakan pendekatan fungsional penuh, untuk memberikan fleksibilitas maksimum untuk kode yang hanya akan digunakan sekali? Haruskah Anda menulis kode yang sangat khusus dan rapuh untuk bagian dari sistem Anda yang akan melihat banyak dan banyak kegunaan, dan mungkin banyak perubahan? Pilihan desain seperti itu seperti bahan yang Anda pilih untuk bagian dalam mobil atau bentuk bata Lego yang Anda pilih untuk membangun rumah kecil . Apa batu bata Lego yang terbaik? "
Programmer tua itu meraih model kereta Lego kecil yang ada di meja sebelum melanjutkan.
"Kamu hanya bisa menjawab itu jika kamu tahu untuk apa kamu membutuhkan batu bata itu. Bagaimana kamu akan tahu jika solusi spesifik lebih baik daripada yang umum, atau sebaliknya, jika kamu bahkan tidak tahu masalah apa yang sedang kamu alami mencoba menyelesaikan? Anda tidak dapat melihat melewati pilihan yang tidak Anda mengerti. "
"..Apakah kamu baru saja mengutip The Matrix? "
"Apa?"
"Tidak apa-apa, teruskan."
"Yah, misalkan Anda mencoba membangun sesuatu ke Sistem Faktur Nasional. Anda tahu bagaimana API jahat itu dan tiga puluh ribu baris file XML terlihat seperti dari dalam. Bagaimana solusi 'generik' untuk membuat file itu bahkan akan terlihat seperti? File ini penuh dengan parameter opsional, penuh dengan kasus-kasus yang hanya boleh menggunakan cabang bisnis yang sangat spesifik. Untuk sebagian besar kasus, Anda dapat mengabaikannya dengan aman. Anda tidak perlu membuat sistem faktur generik jika satu-satunya hal yang Anda inginkan "Saya akan pernah menjual sepatu. Cukup buat sistem untuk menjual sepatu dan jadikan itu sistem faktur penjualan sepatu terkutuk terbaik di luar sana. Sekarang, jika Anda harus membuat sistem faktur untuk semua jenis klien, pada aplikasi yang lebih luas - dijual kembali sebagai sistem penjualan generik yang independen,misalnya - sekarang menarik untuk menerapkan opsi-opsi yang hanya digunakan untuk Gas, makanan atau alkohol.Sekarang itu adalah kasus penggunaan yang mungkin. Sebelum mereka hanya beberapa hipotetis Jangan gunakan kasus, dan Anda tidak ingin menerapkan Jangan gunakan kasus. Jangan gunakan adalah adik laki-laki dari Tidak perlu . "
Kakek menempatkan kereta lego kembali pada tempatnya dan kembali ke pertandingan-3.
"Jadi, untuk dapat memilih solusi generik atau spesifik untuk masalah tertentu, pertama-tama Anda harus memahami apa masalahnya. Jika tidak, Anda hanya menebak, dan menebak adalah pekerjaan manajer, bukan programmer. semuanya dalam IT, itu tergantung. "
Jadi, begitulah. "Tergantung". Itu mungkin ekspresi dua kata yang paling kuat ketika berpikir tentang desain perangkat lunak.