Resharper suka menunjukkan beberapa fungsi per halaman asp.net yang bisa dibuat statis. Apakah itu membantu saya jika saya membuatnya statis? Haruskah saya membuatnya statis dan memindahkannya ke kelas utilitas?
c#
.net
refactoring
resharper
static-methods
dlamblin
sumber
sumber
Jawaban:
Metode statis versus metode Instance
10.2.5 Anggota statis dan instan dari Spesifikasi Bahasa C # menjelaskan perbedaannya. Secara umum, metode statis dapat memberikan peningkatan kinerja yang sangat kecil dibandingkan metode contoh, tetapi hanya dalam situasi yang agak ekstrem (lihat jawaban ini untuk detail lebih lanjut tentang itu).
Aturan CA1822 dalam status FxCop atau Analisis Kode:
Kelas Utilitas
Anda seharusnya tidak memindahkan mereka ke kelas utilitas kecuali jika hal itu masuk akal dalam desain Anda. Jika metode statis berhubungan dengan tipe tertentu, seperti
ToRadians(double degrees)
metode yang berhubungan dengan kelas yang mewakili sudut, masuk akal jika metode itu ada sebagai anggota statis dari tipe itu (catatan, ini adalah contoh berbelit-belit untuk keperluan demonstrasi).sumber
Kinerja, polusi namespace dll semua sekunder dalam pandangan saya. Tanyakan pada diri sendiri apa yang logis. Apakah metode ini beroperasi secara logis pada instance dari tipe, atau apakah itu terkait dengan tipe itu sendiri? Jika yang terakhir, buatlah metode statis. Hanya pindahkan ke kelas utilitas jika itu terkait dengan jenis yang tidak di bawah kendali Anda.
Kadang-kadang ada metode yang logis bertindak atas sebuah contoh tapi tidak terjadi untuk menggunakan negara contoh ini belum . Misalnya, jika Anda sedang membangun sistem file dan Anda akan mendapat konsep direktori, tetapi Anda belum mengimplementasikannya, Anda bisa menulis properti yang mengembalikan jenis objek sistem file, dan itu akan selalu hanya "file" - tetapi secara logis terkait dengan instance, dan karenanya harus menjadi metode instance. Ini juga penting jika Anda ingin membuat metode virtual - implementasi khusus Anda mungkin tidak memerlukan keadaan, tetapi kelas turunan mungkin. (Misalnya, menanyakan koleksi apakah hanya baca atau tidak - Anda mungkin belum menerapkan bentuk baca-saja dari koleksi itu, tetapi jelas merupakan properti dari koleksi itu sendiri, bukan jenisnya.)
sumber
Menandai metode seperti di
static
dalam kelas membuatnya jelas bahwa itu tidak menggunakan anggota instance, yang dapat membantu untuk mengetahui kapan membaca kode.Anda tidak perlu harus memindahkannya ke kelas lain kecuali itu dimaksudkan untuk dibagikan oleh kelas lain yang hanya terkait erat, konsep-bijaksana.
sumber
Saya yakin ini tidak terjadi dalam kasus Anda, tetapi satu "bau busuk" yang saya lihat dalam beberapa kode yang harus saya derita dengan mempertahankan menggunakan banyak metode statis.
Sayangnya, itu adalah metode statis yang mengasumsikan keadaan aplikasi tertentu. (mengapa yakin, kami hanya akan memiliki satu pengguna per aplikasi! Mengapa tidak memiliki kelas Pengguna melacaknya dalam variabel statis?) Mereka adalah cara termuliakan untuk mengakses variabel global. Mereka juga memiliki konstruktor statis (!), Yang hampir selalu merupakan ide yang buruk. (Saya tahu ada beberapa pengecualian yang masuk akal).
Namun, metode statis cukup berguna ketika mereka memfaktorkan domain-logika yang tidak benar-benar bergantung pada keadaan instance objek. Mereka dapat membuat kode Anda lebih mudah dibaca.
Pastikan Anda meletakkannya di tempat yang tepat. Apakah metode statis memanipulasi keadaan internal objek lain secara intrusi? Bisakah kasus yang baik dibuat bahwa perilaku mereka milik salah satu kelas itu? Jika Anda tidak memisahkan masalah dengan benar, Anda mungkin akan mengalami sakit kepala nanti.
sumber
Ini menarik dibaca:
http://thecuttingledge.com/?p=57
ReSharper sebenarnya tidak menyarankan Anda membuat metode Anda statis. Anda harus bertanya pada diri sendiri mengapa metode itu ada di kelas itu, berlawanan dengan, katakanlah, salah satu kelas yang muncul di tanda tangannya ...
tetapi di sini adalah apa yang dikatakan oleh resharper documentaion: http://confluence.jetbrains.net/display/ReSharper/Member+can+be+made+static
sumber
Hanya dengan menambahkan jawaban @Jason True , penting untuk menyadari bahwa hanya menempatkan 'statis' pada suatu metode tidak menjamin bahwa metode tersebut akan 'murni'. Ini akan stateless berkenaan dengan kelas di mana ia dideklarasikan, tetapi mungkin juga mengakses objek 'statis' lainnya yang memiliki status (konfigurasi aplikasi dll.), Ini mungkin tidak selalu menjadi hal yang buruk, tetapi salah satu alasan yang Saya pribadi cenderung lebih suka metode statis ketika saya bisa adalah bahwa jika mereka murni, Anda dapat menguji dan bernalar tentang mereka secara terpisah, tanpa harus khawatir tentang keadaan sekitarnya.
sumber
Anda harus melakukan apa yang paling mudah dibaca dan intuitif dalam skenario yang diberikan.
Argumen kinerja bukanlah argumen yang bagus kecuali dalam situasi paling ekstrem karena satu-satunya hal yang benar-benar terjadi adalah bahwa satu parameter tambahan (
this
) dimasukkan ke stack sebagai metode contoh.sumber
Untuk logika kompleks dalam sebuah kelas, saya telah menemukan metode statis privat berguna dalam menciptakan logika terisolasi, di mana input instance didefinisikan dengan jelas dalam metode signature dan tidak ada contoh efek samping yang dapat terjadi. Semua output harus melalui nilai balik atau parameter keluar / ref. Memecah logika kompleks menjadi blok kode efek samping bebas dapat meningkatkan keterbacaan kode dan kepercayaan tim pengembangan di dalamnya.
Di sisi lain dapat menyebabkan kelas tercemar oleh proliferasi metode utilitas. Seperti biasa, penamaan yang logis, dokumentasi, dan aplikasi yang konsisten dari konvensi pengkodean tim dapat mengatasi hal ini.
sumber
ReSharper tidak memeriksa logikanya. Hanya memeriksa apakah metode ini menggunakan anggota contoh. Jika metode ini pribadi dan hanya dipanggil oleh (mungkin hanya satu) metode instance ini adalah tanda untuk membiarkannya metode instance.
sumber
Jika fungsi dibagikan di banyak halaman, Anda juga bisa menempatkannya di kelas halaman dasar, dan kemudian memiliki semua halaman asp.net menggunakan fungsi yang diwarisi darinya (dan fungsinya juga masih bisa statis).
sumber
Membuat metode statis berarti Anda dapat memanggil metode dari luar kelas tanpa terlebih dahulu membuat instance dari kelas itu. Ini membantu saat bekerja dengan objek atau add-on vendor pihak ketiga. Bayangkan jika Anda harus terlebih dahulu membuat objek Konsol "con" sebelum memanggil con.Writeline ();
sumber
Ini membantu untuk mengendalikan polusi namespace.
sumber
Class.a_core_function( .. )
vsa_core_function( .. )
Just my tuppence: Menambahkan semua metode statis bersama ke kelas utilitas memungkinkan Anda untuk menambahkan
untuk pernyataan Anda menggunakan, yang membuat kode lebih cepat untuk mengetik dan lebih mudah dibaca. Sebagai contoh, saya memiliki sejumlah besar apa yang akan disebut "variabel global" dalam beberapa kode yang saya warisi. Daripada membuat variabel global dalam kelas yang merupakan kelas instan, saya mengatur semuanya sebagai properti statis dari kelas global. Itu melakukan pekerjaan, jika berantakan, dan saya bisa mereferensikan properti dengan nama karena saya memiliki namespace statis yang sudah direferensikan.
Saya tidak tahu apakah ini praktik yang baik atau tidak. Saya harus belajar banyak tentang C # 4/5 dan begitu banyak kode warisan untuk refactor sehingga saya hanya mencoba untuk membiarkan tips Roselyn membimbing saya.
Joey
sumber
Saya harap, Anda sudah memahami perbedaan antara metode statis dan contoh. Juga, bisa ada jawaban panjang dan pendek. Jawaban panjang sudah disediakan oleh orang lain.
Jawaban singkat saya: Ya, Anda dapat mengubahnya menjadi metode statis jika Resharper menyarankan. Tidak ada salahnya melakukannya. Alih-alih, dengan membuat metode ini statis, Anda sebenarnya menjaga metode tersebut sehingga, jika tidak perlu Anda tidak memasukkan anggota instance ke metode itu. Dengan cara itu, Anda dapat mencapai prinsip OOP " Minimalkan aksesibilitas kelas dan anggota ".
Ketika ReSharper menyarankan bahwa metode instance dapat dikonversi ke metode statis, itu sebenarnya memberitahu Anda, "Kenapa ... metode ini duduk di kelas ini karena tidak benar-benar menggunakan salah satu dari keadaannya?" Jadi, ini memberi Anda makanan untuk dipikirkan. Kemudian, Andalah yang dapat menyadari perlunya memindahkan metode itu ke kelas utilitas statis atau tidak. Menurut prinsip-prinsip SOLID, sebuah kelas seharusnya hanya memiliki satu tanggung jawab inti. Jadi, Anda bisa melakukan pembersihan kelas yang lebih baik dengan cara itu. Terkadang, Anda memang membutuhkan beberapa metode pembantu bahkan di kelas instan Anda. Jika itu masalahnya, Anda dapat menyimpannya dalam #region helper.
sumber