Saya melakukan diskusi yang menarik hari ini dengan pengembang lain tentang cara mendekati kelas dengan metode yang menerima string dan string output.
Bayangkan sesuatu seperti yang berikut ini yang sepenuhnya dibuat untuk tujuan contoh
public string GetStringPart(string input)
{
//Some input validation which is removed for clarity
if(input.Length > 5)
return input.Substring(0,1);
if(input.Substring(0,1) == "B")
return input.Substring(0,3);
return string.empty;
}
Sebuah fungsi yang memiliki beberapa logika berdasarkan input stringnya ditambahkan ke proyek menggunakan DI dan memiliki Container DI di tempat. Apakah Anda menambahkan kelas baru ini dengan antarmuka dan menyuntikkannya di tempat yang diperlukan, atau akankah Anda menjadikannya kelas statis? Apa pro dan kontra dari masing-masing? Mengapa Anda (atau tidak) ingin membuat ini digunakan dengan injeksi konstruktor daripada hanya diakses ketika diperlukan di mana saja.
Jawaban:
Tidak ada alasan mengapa ini perlu disuntikkan. Ini hanya sebuah fungsi, tidak memiliki dependensi, jadi panggil saja. Bahkan bisa statis jika Anda ingin terlihat murni. Seseorang dapat menulis unit test melawan ini tanpa kesulitan. Jika digunakan di kelas lain, tes unit masih bisa ditulis.
Tidak perlu untuk abstrak fungsi tanpa ketergantungan, itu berlebihan.
Jika ini menjadi lebih kompleks maka mungkin melewati antarmuka ke konstruktor atau metode dijamin. Tapi, saya tidak akan menyusuri jalan itu kecuali saya memiliki
GetStringPart
logika yang kompleks berdasarkan lokasi, dll.sumber
Inilah sebabnya
Jika Anda menggunakan metode statis tidak akan ada cara untuk mengubah perilaku
GetStringPart
tanpa menghancurkan perilaku lama atau mencemari dengan logika kondisional. Memang benar statika adalah global jahat yang menyamar tetapi fakta bahwa mereka menonaktifkan polimorfisme adalah keluhan utama saya tentang mereka. Metode statis bukan kelas satu dalam bahasa OOP. Dengan memberikan metode objek untuk hidup, bahkan satu tanpa keadaan, kita membuat metode portabel. Perilakunya dapat ditularkan seperti nilai variabel.Di sini saya membayangkan sebuah sistem yang perlu berperilaku sedikit berbeda ketika dikerahkan di Eropa kemudian ketika dikerahkan di AS. Alih-alih memaksa kedua sistem untuk memuat kode yang hanya dibutuhkan oleh yang lain, kita dapat mengubah perilaku dengan mengontrol objek parsing pesanan apa yang diinjeksikan ke klien. Ini memungkinkan kami untuk menahan penyebaran detail kawasan. Itu juga membuatnya mudah untuk menambahkan OrderParserCanada tanpa harus menyentuh parser yang ada.
Jika itu tidak ada artinya bagi Anda, maka sebenarnya tidak ada argumen yang bagus untuk ini.
BTW,
GetStringPart
adalah nama yang mengerikan.sumber
static getStringPartEU()
? Contoh Anda hanya masuk akal jika ada metode lain di kelas itu yang juga memerlukan perawatan khusus UE dan harus diperlakukan sebagai satu unit.