Saran-saran yang saling bertentangan yang Anda baca semuanya masuk akal dengan cara tertentu, tetapi mereka semua membuat asumsi (berbeda) atau kalimat ambigu. Ini adalah salah satu dari jenis "mengatakan hal yang sama dengan kata-kata yang berbeda".
suatu metode hanya boleh statis jika tidak mengubah keadaan
Perhatikan ambiguitas "modifikasi suatu negara". Contoh berikut melanggar aturan ini (secara harfiah), tetapi ia mempertahankan semangat (figuratif) dari aturan tersebut:
public static void SetUserNameToBob(User u)
{
u.Name = "Bob";
}
Ini mengubah keadaan User
objek, sehingga sebenarnya "memodifikasi keadaan".
Namun, metode ini tidak bergantung pada keadaan internal tertentu untuk memutuskan aliran logisnya sendiri (misalnya u.Name = currentlySelectedDefaultName()
akan menjadi pelanggaran karena nama yang dipilih adalah keadaan yang dipilih). Dan saya pikir itulah yang dimaksud: tidak ada keadaan internal yang dimodifikasi.
[suatu metode hanya boleh statis jika] hasilnya hanya bergantung pada parameter yang disediakan untuk itu
Lihatlah item sebelumnya, yang ini cukup banyak mengatakan hal yang sama. Artinya adalah ini:
public static string currentlySelectedDefaultName;
public static void SetUserNameToBob(User u)
{
u.Name = currentlySelectedDefaultName;
}
tidak boleh statis, karena nama "default saat ini" adalah keadaan, dan oleh karena itu seharusnya tidak menjadi variabel global / metode.
Pikirkan apa yang terjadi jika dua utas terpisah berjalan: salah satunya ingin default ke "Bob", yang lain ingin default ke "Jim". Mereka akan berakhir memperebutkan nilai, yang bertanggung jawab untuk menciptakan masalah debugging yang besar dan perilaku yang tidak terduga.
Namun, jika setiap utas memiliki DefaultNameSetter
objeknya sendiri , maka mereka tidak berebut sumber daya yang sama.
Namun, jawaban yang paling banyak dipilih dalam posting ini menyatakan bahwa metode statis harus digunakan kapan pun memungkinkan.
Ini semacam menegakkan aturan dengan mencoba / gagal. Bisakah kita atur metode ini menjadi statis?
- Ya
=>
Bagus! Biarkan seperti itu!
- Tidak
=>
Ini membuktikan bahwa kode mengandalkan nilai non-statis di suatu tempat dan karenanya tidak boleh dibuat statis.
Mengutip Jeff Goldblum di Jurassic Park secara tidak langsung , Anda tidak boleh berdebat perlunya melakukan sesuatu hanya dengan membuktikan bahwa itu bisa dilakukan.
Sekali lagi, pendekatan itu tidak selalu (atau selalu) salah, tetapi secara membabi buta mengasumsikan bahwa metode-metode yang telah ditulis sebagai negara-agnostik mungkin secara logis, yang memang tidak demikian.
Bahkan jika Anda berlangganan pendekatan metodologis ini, Anda masih bisa menerapkannya ketika sebuah proyek tidak lagi dalam pengembangan. Jika proyek masih dalam pengembangan, metode saat ini dapat menjadi penampung untuk implementasi di masa depan. Mungkin dimungkinkan untuk membuat Foo()
statis hari ini, tetapi tidak besok, jika logika yang bergantung pada negara belum diimplementasikan.
Banyak jawaban dalam posting ini mengatakan bahwa seseorang harus melakukan apa pun yang paling masuk akal.
Yah, mereka tidak salah; tetapi bukankah ini hanya ungkapan ulang kecil dari mengatakan "lakukan hal yang benar"? Itu bukan saran yang sangat membantu, kecuali Anda sudah tahu kapan harus menggunakan statika dan kapan harus menghindarinya. Ini tangkapan 22.
Jadi kapan sebaiknya Anda menggunakan statika?
Seperti yang telah Anda perhatikan, tidak semua orang setuju dengan aturan tersebut, atau setidaknya tentang bagaimana cara mengucapkan aturan tersebut. Saya akan menambahkan upaya lain di sini, tetapi perlu diketahui bahwa ini secara efektif membuat standar lain :
Ingatlah itu.
Statika adalah kebenaran universal.
Itulah tujuan dari namespace global: hal-hal yang benar di seluruh lapisan aplikasi.
Ada argumen lereng yang licin di sini. Beberapa contoh:
var myConfigKey = ConfigurationManager.AppSettings["myConfigKey"];
Ini adalah contoh yang sangat jelas. Konfigurasi aplikasi secara inheren menyiratkan bahwa konfigurasi bersifat global untuk aplikasi, dan oleh karena itu diperlukan metode statistik.
bool datesOverlap = DateHelper.HasOverlap(myDateA_Start, myDateA_End, myDateB_Start, myDateB_End);
Metode ini secara universal benar. Tidak peduli tanggal mana yang Anda bandingkan. Metode ini tidak peduli tentang arti tanggal. Apakah itu tanggal kerja, tanggal kontrak, ... tidak masalah dengan algoritma metode.
Perhatikan kesamaan semantik antara kontekstual dan didorong oleh negara . Kedua jenis mengacu pada keadaan "tidak universal". Ini membuktikan bahwa perbedaan kontekstual karena itu tergantung pada negara dan tidak cocok untuk dibuat statis.
var newPersonObject = Person.Create();
Ini adalah kebenaran universal. Proses pembuatan yang sama digunakan di seluruh aplikasi.
Namun, garis ini bisa kabur:
var newManager = Person.CreateManager();
var newJanitor = Person.CreateJanitor();
Dari perspektif teknis, tidak ada yang berubah. Manajer (dan petugas kebersihan) dibuat dengan cara yang sama di seluruh aplikasi. Namun, ini secara halus telah menciptakan negara (manajer / petugas kebersihan), yang perlahan tapi pasti mengurangi betapa universal kebenaran sebenarnya.
Bisakah itu dilakukan? Dari sudut pandang teknis; ya .
Haruskah itu dilakukan? Itu masalah apakah Anda memperdebatkan prinsip murni, atau mempertimbangkan bahwa kompromi perlu dilakukan agar tidak sia-sia berjuang untuk kesempurnaan logis. Jadi saya akan mengatakan jika itu tidak menciptakan masalah yang lebih besar daripada masalah yang ingin dipecahkan .
Ketika opsi berkembang (manajer, petugas kebersihan, akuntan, tenaga penjualan, ...), masalah bertambah. Untuk masalah yang cukup besar, pola pabrik diinginkan.
Jika Anda hanya memiliki dua opsi dan Anda tidak memiliki alasan untuk mencurigai bahwa daftar opsi akan bertambah, Anda dapat berdebat bahwa metode pembuatan statis sudah mencukupi. Beberapa mungkin tidak setuju, dan saya juga mengerti maksud mereka. Tetapi saya cenderung praktis dan tidak terlalu perfeksionis dalam pendekatan saya.