Kapan memilih solusi umum daripada menyelesaikan kasus-kasus tertentu

18

Dalam pemrograman, kita sering dihadapkan pada pilihan: tutupi setiap use case yang dapat dipikirkan secara individual, atau pecahkan masalah umum:

XKCD - Masalah Umum

Jelas bahwa menyelesaikan masalah langsung lebih cepat, namun menciptakan solusi umum akan menghemat waktu di masa depan.

Bagaimana saya tahu kapan yang terbaik untuk mencoba dan menutupi daftar kasus yang terbatas, atau membuat sistem generik untuk mencakup semua kemungkinan?

Pureferret
sumber
4
Mengapa begitu banyak downvotes?
Pureferret
3
Sepertinya pertanyaan yang masuk akal bagi saya. Itu memang terlihat seperti Anda memiliki suntingan yang belum selesai; Anda mungkin ingin mengatasinya.
Stuart Marks
@gnat itu antara program / proyek yang berbeda. Saya bertanya tentang dalam proyek / skenario yang sama.
Pureferret
Terlalu kabur. Meliputi semua kasus adalah menyelesaikan masalah umum. Setelah itu, tinggal bagaimana Anda menulis kode.
Caleb

Jawaban:

29

Pertama, Anda melewatkan garam. Lalu Anda melewati lada. Kemudian Anda melewati keju parmesan parut. Pada titik ini, Anda memiliki cukup pengalaman untuk mulai mengembangkan sistem passing bumbu umum.

Ini bekerja dalam proyek perangkat lunak dengan cara yang sama: menggunakan sistem tujuan khusus yang Anda kembangkan sebagai langkah pembelajaran Anda untuk yang digeneralisasi, jadi ketika saatnya untuk memulai sistem tujuan umum Anda, Anda memiliki kepercayaan yang lebih baik pada apa yang Anda bangun, karena Anda memiliki beberapa sistem tujuan khusus di bawah ikat pinggang Anda.

dasblinkenlight
sumber
4
Ini jawaban yang bagus!
Pureferret
Dan inilah mengapa batu Agile.
Euforia
1
semacam yang terkait dengan en.wikipedia.org/wiki/Zero_one_infinity_rule
jk.
9

Bagaimana saya tahu kapan yang terbaik untuk mencoba dan menutupi daftar kasus yang terbatas, atau membuat sistem generik untuk mencakup semua kemungkinan?

Pengalaman.

Satu-satunya cara untuk mengetahui adalah dengan mencoba satu jalur sebelumnya, melihat bagaimana itu menggigit Anda di pantat (atau Anda telah membuang banyak waktu). Ulangi sampai Anda mendapatkan sedikit di pantat kurang.

Meski begitu, Anda tidak benar - benar tahu ; Anda hanya memiliki tebakan yang lebih baik.

Telastyn
sumber
3

Untuk membangun jawaban dari dasblinkenlight dan Paddy3118 , jika Anda tidak memiliki banyak kasus untuk diterapkan, maka Anda tidak perlu menggeneralisasi! Alasan kartun XKCD itu lucu adalah karena ia mencerca generalisasi prematur . Setelah diminta untuk memberikan garam, karakter yang tidak terlihat segera melompat ke "mengembangkan sistem untuk lulus bumbu yang sewenang-wenang" ketika semua karakter pertama yang diminta adalah garam. Ini adalah lelucon yang bagus untuk pengembang, karena saya pikir kita semua pernah melihat kasus generalisasi prematur.

Prinsip yang menentang generalisasi prematur adalah YAGNI (You Ain't Gonna Need It). Ada banyak materi tentang ini tersedia di web, tetapi pada dasarnya YAGNI menunjukkan sejumlah risiko dalam generalisasi tanpa manfaat dari beberapa kasus penggunaan aktual, termasuk kemungkinan bahwa beberapa kasus penggunaan mungkin tidak benar-benar muncul. Atau, lebih tepatnya, kurangnya kasus penggunaan yang sebenarnya mengharuskan seseorang untuk membuat asumsi tentang apa yang diperlukan di masa depan. Asumsi-asumsi ini dapat, dan seringkali salah,.

Stuart Marks
sumber
2

Tampaknya lebih mudah untuk menjadi generik dalam yang kecil, yaitu jangan membuat kelas untuk menangani tabel pencarian yang memetakan bilangan bulat ke string ketika Anda bisa membuat kelas kamus yang wajar yang menangani setiap jenis pasangan (di mana jenis pertama mendukung beberapa jenis perbandingan).

Dalam kehidupan sebelumnya, saya melakukan banyak proyek otomasi industri untuk permesinan yang menangani jaring material yang berkelanjutan. Baja, aluminium, kertas, plastik, .... Anda membuka gulungannya di satu ujung dan menggulungnya lagi di sisi lain setelah melakukan sesuatu yang berguna di tengah. Dalam satu industri Anda mulai di "gulungan hasil", bukan "unwinder". Jika Anda menggunakan terminologi yang salah, maka Anda idiot di mata klien bernilai jutaan dolar. Anda akan kagum pada betapa sedikit yang bisa diabstraksikan untuk digunakan kembali dari satu proyek ke proyek berikutnya. OTOH, orang bisa sering membuat kerangka kerja atau templat sebagai titik awal. Ini akan disesuaikan untuk pekerjaan yang sedang dilakukan, tetapi setidaknya memiliki manfaat belajar dari proyek sebelumnya. Dan semua orang di tim tahu dari mana kami memulai.

HABO
sumber
2

Lakukan sekali, lakukan dua kali, lakukan tiga kali, generalisasi.

davidk01
sumber
1

Satu, dua, banyak!

Pada kasus kedua Anda harus memikirkan generalisasi. Saat diminta untuk yang ketiga Anda harus menyediakannya dari kode umum dan menggunakan kasus pertama dan kedua yang sebelumnya diselesaikan secara individual sebagai kasus uji.

Paddy3118
sumber