Saya pernah mendengar frasa dilemparkan ke seluruh penjuru dan bagi saya argumennya terdengar sangat gila (maaf jika saya sedang bermain di sini, ini bukan maksud saya), umumnya berbunyi seperti:
Anda tidak ingin membuat abstraksi sebelum Anda tahu apa masalahnya secara umum, jika tidak (1) Anda mungkin meletakkan sesuatu di abstraksi yang bukan milik Anda, atau (2) menghilangkan hal-hal penting.
(1) Bagi saya ini terdengar seperti programmer tidak cukup pragmatis, mereka telah membuat asumsi bahwa hal-hal akan ada di program akhir yang tidak, sehingga mereka bekerja dengan rendahnya level abstraksi, masalahnya tidak abstraksi prematur, itu konkret prematur.
(2) Menghilangkan hal-hal penting adalah satu hal, sangat mungkin ada sesuatu yang dihilangkan dari spek yang kemudian ternyata menjadi penting, solusi untuk ini bukan dengan menghasilkan sumber daya limbah dan limbah Anda sendiri ketika Anda mengetahui bahwa Anda Dugaan salah, itu untuk mendapatkan lebih banyak informasi dari klien.
Kita harus selalu bekerja dari abstraksi ke konkret karena ini adalah cara yang paling pragmatis dalam melakukan sesuatu, dan bukan sebaliknya.
Jika kita tidak melakukannya maka kita berisiko salah paham klien dan menciptakan hal-hal yang perlu diubah, tetapi jika kita hanya membangun abstraksi yang didefinisikan klien dalam bahasa mereka sendiri, kita tidak pernah mengenai risiko ini (setidaknya jauh dari kemungkinan mengambil suntikan dalam kegelapan dengan beberapa pertimbangan), ya itu mungkin klien berubah pikiran tentang detail, tetapi abstraksi yang mereka gunakan pada awalnya berkomunikasi apa yang mereka inginkan cenderung masih valid.
Berikut ini sebuah contoh, katakanlah klien ingin Anda membuat robot mengantongi item:
public abstract class BaggingRobot() {
private Collection<Item> items;
public abstract void bag(Item item);
}
Kami sedang membangun sesuatu dari abstraksi yang digunakan klien tanpa lebih detail dengan hal-hal yang tidak kami ketahui. Ini sangat fleksibel, saya telah melihat ini disebut "abstraksi prematur" ketika pada kenyataannya akan lebih prematur untuk mengasumsikan bagaimana bagging diimplementasikan, katakanlah setelah berdiskusi dengan klien mereka ingin lebih dari satu item dikantong sekaligus . Untuk memperbarui kelas saya, saya hanya perlu mengganti tanda tangan, tetapi untuk seseorang yang memulai dari bawah ke atas yang mungkin melibatkan perbaikan sistem yang besar.
Tidak ada yang namanya abstraksi prematur, hanya konkret prematur. Apa yang salah dengan pernyataan ini? Di mana kelemahan dalam alasan saya? Terima kasih.