Mengambil contoh aplikasi Ruby on Rails sederhana. Itu menciptakan Logger
objek selama proses pemuatan aplikasi:
# in environment.rb
config.logger = Logger.new(<STDOUT | file | whatever>)
# and in our application we use this object
logger.warn "This process is taking too long to process. Optimization needed."
Pertanyaan saya adalah, mengapa kita tidak menggunakan metode kelas (atau metode statis) untuk login? Bukankah Logger.warn
skala Logger.new.warn
? Atau setidaknya Logger.warn
terlihat intuitif Logger.new.warn
.
Bahkan jika Logger.new
objek tunggal, keuntungan apa yang ditawarkannya?
sumber
Logger.new adalah pabrik yang akan membawa hasil yang akan digunakan (nama kelas / file).
Dalam file konfigurasi, Anda dapat memutuskan level apa yang akan di-log untuk tidak masuk sama sekali untuk bagian-bagian program tanpa harus mengkompilasi ulang proyek.
Dengan demikian Anda dapat menonaktifkan semua kecuali pencatatan tingkat tinggi (kesalahan) untuk rilis build dan hanya mengaktifkan level terendah untuk bagian yang Anda debug.
sumber
Doa metode statis harus dihindari sedapat mungkin. Ini adalah alternatif kuno untuk Injeksi Ketergantungan yang tepat, dan bukan sesuatu yang Anda temukan bermanfaat dalam basis kode yang lebih besar.
Pertimbangkan testabilitas, misalnya. Logging yang dijalankan secara statis menempatkan Subjek Di Bawah Tes mengendalikan kelas logging mana yang digunakan - tidak ada Inversi Kontrol. Tidak ada kemungkinan untuk menyuntikkan benda tiruan atau jenis palsu di sini. Dengan menyuntikkan logger ke SUT, Anda akan menemukan bahwa Anda memiliki opsi untuk mengejek logger dan menyuntikkannya.
Manfaat menggunakan DI dibandingkan jenis pemanggilan metode statis yang dibahas tentu saja melampaui testabilitas. Pertimbangkan apa yang akan terjadi jika Anda ingin memiliki dua logger berbeda di sistem Anda, dan opsi untuk mengubah perilaku aplikasi melalui konfigurasi grafik objek saja, tanpa mengedit kode yang ada.
Secara keseluruhan, saya sarankan Anda mencoba pendekatan DI, sehingga Anda tidak menemukan kode Anda tidak dapat diuji dan sulit digunakan nantinya.
sumber