Apakah boleh memiliki dependensi di dalam kelas yang bisa ditukar?

8

Katakanlah saya memiliki model-domain dan saya ingin membaca dan menyimpannya dari setiap lapisan kegigihan - sekarang ini mungkin file json tetapi di masa depan itu bisa berupa xml atau database (yang mungkin juga berubah dalam jenisnya ).

Untuk menghasilkan model-domain dari lapisan ketekunan, saya punya implementasi Antarmuka sederhana yang, katakanlah, berisi a getAll()dan saveAll()metode. Jika saya ingin beralih ke jenis kegigihan lainnya maka saya dapat dengan mudah mengubah implementasi antarmuka. Namun, di dalam implementasi saya akan menggunakan solusi yang sama sekali berbeda untuk membaca dan menyimpan data sehingga saya harus menggunakan objek yang berbeda dari perpustakaan lain untuk menangani data.

Katakanlah saya menggunakan serializer Json di implementasi pertama, saya kemudian akan instantiate contoh serializer itu dalam implementasi saya secara langsung. Ini kemudian akan mengarah pada implementasi saya secara langsung tergantung pada serializer itu, saya tidak pernah bisa memberikan yang lain. Tapi ini tidak akan mungkin, karena tidak ada antarmuka universal untuk serializers (atau apa pun jenis kegigihan). Jadi jika saya ingin menggunakan serializer yang berbeda, satu-satunya hal yang dapat saya lakukan adalah menulis implementasi yang benar-benar baru alih-alih hanya meneruskan yang lain dari luar.

Jadi tidak apa-apa untuk dependensi kode keras dalam kasus ini? Atau ada pilihan yang lebih baik?

Philip Feldmann
sumber

Jawaban:

4

Dengan merujuk pada jawaban saya untuk pertanyaan baru-baru ini , kuncinya di sini adalah untuk memisahkan antarmuka lapisan kegigihan Anda dari setiap implementasi lapisan kegigihan, menggunakan pola tangga.

Ketergantungan pada serializer Json kemudian menjadi detail implementasi dari paket persistensi Json. Sisa aplikasi tidak perlu tahu apa-apa tentang hal itu, juga tidak menanggung beban ketergantungan itu karena hanya mengakses paket persistensi melalui antarmuka, yang ada dalam paket lain.

Jika Anda kemudian menambahkan paket kegigihan basis data, ia hanya mengimplementasikan antarmuka-antarmuka itu dan mis. Dependensi ORM-nya juga disembunyikan sebagai detail implementasi.

David Arno
sumber
2

Anda tidak dapat menghapus semua dependensi dari kode Anda; akhirnya Anda harus bergantung pada sesuatu , jika tidak, Anda hanya akan berakhir dengan satu objek dewa raksasa yang melakukan semuanya sendiri.

Sebagai aturan umum, Anda ingin setiap kelas bergantung pada objek yang akan lebih stabil daripada diri mereka sendiri; dan Anda ingin hubungan yang tidak stabil menggunakan injeksi ketergantungan untuk memungkinkan pengujian yang lebih mudah dan lebih banyak fleksibilitas.

Seberapa besar kemungkinan serializer JSON akan berubah? Apakah lebih atau kurang stabil daripada kode yang Anda tulis?

Jika kemungkinan Anda akan mengganti serializer lebih dari satu kali dengan implementasi yang berbeda, maka mungkin Anda bisa membuat proxy atau objek pembungkus di sekitar serializer itu sendiri. Dengan begitu, Anda dapat mengontrol antarmuka yang Anda miliki dengan serializer, dan hanya bergantung pada pustaka eksternal di satu tempat.

Yang mengatakan, saya pribadi belum menemukan alasan untuk mengganti serializer JSON (dengan serializer berbeda), jadi saya tidak akan terlalu khawatir tentang memiliki ketergantungan langsung padanya. Serializer hampir selalu memiliki antarmuka yang lebih stabil daripada apa pun dalam aplikasi saya sendiri, dan metode yang saya butuhkan sangat sederhana dan sedikit sehingga tidak ada alasan bagi mereka untuk berubah.

Sepertinya Anda tidak khawatir secara khusus tentang serializer itu sendiri berubah - dari apa yang Anda jelaskan, Anda khawatir tentang perubahan persyaratan luar ke sistem persistensi yang sama sekali berbeda - dalam hal ini, implementasi layer kegigihan Anda akan sepenuhnya ditulis ulang. lagi pula, dan menggunakan injeksi ketergantungan atau proxy tidak akan membantu Anda.

Selama antarmuka antara lapisan kegigihan Anda dan model domain Anda tetap sama, dan Anda mengejek lapisan kegigihan itu saat Anda menguji model domain Anda, saya tidak melihat masalah dengan bergantung pada antarmuka spesifik pustaka JSON. Ketergantungan itu murah untuk diuji, dan perpustakaan JSON itu sendiri tidak mungkin berubah.

Jen
sumber