Saya sedang mengerjakan alat kecil sebagai proyek mainan untuk menunjukkan perbedaan antara dua direktori, menunjukkan file / direktori mana yang ditambahkan, dihapus, dimodifikasi, dll.
Saya mencoba mewakili perubahan ini hanya sebagai objek 'ChangeItem', tanpa membedakan apakah itu file atau direktori. Namun, itu menciptakan banyak masalah, misalnya bagaimana menampilkannya di pohon, cara mengetahui siapa orang tua seorang anak, dll. Dan itu juga sangat tidak intuitif.
Saya kemudian membagi perubahan antara perubahan direktori dan perubahan file. Itu segera membuatnya sangat mudah untuk kode dan untuk memahami apa yang sedang terjadi. Sekarang lebih mudah untuk memilih semua file dalam direktori, dll.
Pertanyaan saya adalah, bagaimana orang bisa tahu apakah akan menggunakan abstraksi atau untuk lebih spesifik dalam kode mereka? Bagaimana Anda bisa tahu jika Anda memiliki terlalu banyak atau terlalu sedikit abstraksi?
Anda menulis kode abstrak saat Anda menulis pustaka, dan harus menggeneralisasi fungsionalitasnya sehingga akan berfungsi dalam berbagai kondisi.
Tetapi menulis perpustakaan dengan cara ini sulit. Dalam aplikasi normal (katakanlah, lini aplikasi bisnis), generalisasi semacam ini dianggap sebagai bentuk "optimisasi prematur," umumnya ditandai sebagai "Anda tidak akan membutuhkannya" (YAGNI).
Ada titik kritis di mana kode berulang menuntut solusi yang lebih umum dirancang. Tetapi biasanya jenis refactoring untuk menghilangkan redundansi ini jauh lebih sederhana daripada menulis perpustakaan umum.
Pada akhirnya, kompleksitas tambahan yang diperlukan untuk mengimplementasikan solusi abstrak harus dibenarkan oleh fleksibilitas yang mereka tawarkan.
sumber
Aturan praktis yang saya ikuti, yang cukup umum, adalah Anda tidak boleh mencoba untuk mengabstraksikan sesuatu sampai Anda menemukan diri Anda menulisnya untuk ketiga kalinya.
Pertama kali Anda benar-benar tidak memahami domain masalah dan akhirnya akan merancang-ulang semua bagian yang salah. Kedua kalinya Anda diposisikan dengan sempurna untuk membangun solusi ideal untuk masalah terakhir Anda. Ketiga kalinya Anda akhirnya dalam posisi yang baik untuk membuat abstraksi yang tepat yang akan membantu Anda dalam hal-hal yang perlu diubah, dan tidak menghalangi Anda untuk menyelesaikan hal-hal sederhana.
sumber
if (cond) { //use one object} else {// use the other object }
, khususnya. ketika itu adalah set keputusan biner.Dengan membaca pertanyaan saya akan mengatakan bahwa Anda bisa abstrak dan spesifik. Apakah hanya masalah konteks, gunakan representasi paling abstrak yang mungkin dalam setiap konteks.
Untuk aplikasi mainan spesifik Anda,
ChangeItem
adalah representasi perubahan yang paling abstrak. Kemudian Anda menjadi lebih spesifik denganDirectoryChangeItem
danFileChangeItem
, melalui warisan. Anda dapat menggunakan pola komposit untuk memodelkan pohon. Saat Anda ingin menampilkannya, Anda bisa menggunakan representasi spesifik dan ketika men-traversenya Anda bisa menggunakan representasi abstrak.Dan untuk memberikan jawaban konkret untuk pertanyaan: sespesifik mungkin sampai Anda merasa bahwa Anda membutuhkan lapisan lain di bawahnya.
sumber
Biasanya abstraksi berguna untuk memerangi hal-hal seperti Complexity, Entropy, untuk membuat kode Anda menjadi Cybernetic, dan bahkan pada tingkat keterbacaan yang rendah. Saya akan hardcode pertama - HANYA jika abstraksi tidak jelas di muka. Sebagian besar abstraksi terjadi ketika lebih dari satu implementasi memiliki pola yang sama.
Pikirkan abstraksi sebagai kongruensi atau kesatuan dari 2 set atau lebih. Ambil Diagram Venn sebagai model sederhana: Bagian di mana lingkaran tumpang tindih, atau dengan kata lain, Set menggabungkan.
Jika saya memiliki dua set: A: {a, b, c, d, e} dan B: {d, e, f, g, h}. Titik di mana saya akan mulai mencari abstrak adalah kesatuan A + B; {d, e} adalah tempat abstrak. Demikian pula, jika mereka yang berada dalam perbedaan A & B (AB atau BA) saling isomorfik, artinya biayanya yang rendah untuk membuat a, b atau c dari f, g atau h (dan sebaliknya), maka saya akan tetap abstraksi di belakang pikiran saya.
sumber