Apakah metode statis pribadi di C # menyakiti apa pun?

10

Saya membuat metode validasi pribadi untuk validasi tertentu yang terjadi beberapa kali di kelas saya (saya tidak bisa menyimpan data yang divalidasi karena berbagai alasan). Sekarang, ReSharper menyarankan bahwa fungsi tersebut dapat dibuat statis. Saya sedikit enggan melakukannya karena masalah yang diketahui dengan metode statis. Ini akan menjadi metode statis pribadi . Pertanyaan saya adalah, dapatkah metode statis privat menyebabkan masalah kopling dan pengujian serupa seperti metode statis publik? Apakah ini praktik yang buruk? Saya kira tidak, tapi saya tidak yakin apakah ada jebakan di sini.

Tamás Szelei
sumber
10
Apa "masalah yang diketahui" dengan metode statis?
Robert Harvey
3
@ Id: Benar. Metode statis yang ditulis dengan benar seharusnya tidak menyentuh API atau status eksternal. Memanipulasi keadaan internal yang dienkapsulasi dalam sebuah kelas tampaknya sangat oke bagi saya, dan metode ini tidak perlu diuji unit, karena pengujian unit menguji perilaku eksternal kelas.
Robert Harvey
1
Metode statis cenderung mengubah keadaan global dan mereka juga membunuh warisan (setiap kali Anda ingin memperluas fungsionalitas, Anda harus memodifikasi kode panggilan karena Anda tidak dapat menimpa metode dalam kelas turunan). Anda terikat pada implementasi yang satu itu. Metode statis tidak dapat diejek yang membuatnya sangat sulit untuk unit-test. Mereka menyembunyikan ketergantungan . Saya yakin masih ada lagi. Bukan hanya untuk menghindari mereka secara membabi buta, saya meminta untuk membuat keputusan.
Tamás Szelei
2
@ Tamás Metode statis hanya mengubah keadaan global jika Anda menulisnya seperti itu, yang tidak pernah saya lakukan. Secara umum, saya hanya menggunakan metode statis di kelas utilitas, metode yang mengambil satu atau lebih objek dan mengembalikan objek tanpa efek samping. Metode semacam ini tidak memiliki masalah yang Anda gambarkan.
Robert Harvey
1
@ TamásSzelei Bagaimana mereka cenderung mengubah keadaan global? Mereka bahkan tidak dapat menemukan keadaan global kecuali Anda meneruskannya ke parameter.
CodesInChaos

Jawaban:

16

Saya akan berpikir: "Apakah saya perlu menguji ini?"

Jika metode Anda bersifat pribadi, artinya Anda tidak ingin menguji logika dalam metode itu sendiri, maka sejauh menyangkut testabilitas dan rawatan, kelas Anda adalah kotak hitam, bagaimanapun juga, cara kerja kelas Anda adalah bisnisnya. dan itu sendiri. Refactoring juga tidak akan terpengaruh, yang juga harus dipertimbangkan.

Jadi, menurut saya: Tidak, membuat metode "privat" "privat statis" tidak akan memiliki konsekuensi jangka panjang apa pun.

Ed James
sumber
17

Metode statis pribadi adalah hal termudah yang mungkin, dari sudut pandang saya.

DataIn -> Metode -> DataOut

Tidak ada ketergantungan pada objek eksternal, tidak ada efek samping. Mengapa Anda menganggapnya buruk?

Coder
sumber
Terima kasih. Saya menjelaskan kekhawatiran saya di komentar di bawah pertanyaan.
Tamás Szelei
2
Apa yang Anda gambarkan hanya benar untuk metode statis tidak tergantung pada variabel anggota statis - itulah yang dapat membuat perbedaan antara metode statis "baik" dan "buruk".
Doc Brown
2

Menguji kelas yang menggunakan metode statis publik bisa sulit, karena itu (terutama) tidak mudah untuk mematikan / memalsukan / mengejek metode statis. Metode instance, di sisi lain, dapat dipermainkan dengan mudah, terutama jika virtual atau memenuhi antarmuka.

Namun, saya tidak dapat melihat alasan untuk tidak menggunakan metode statis pribadi. Memang, ada sedikit manfaat kinerja, karena Anda tidak perlu instance kelas untuk menempati memori.

Di sisi lain apa pun yang statis adalah sedikit bau kode. Apakah ini sebenarnya "kelas pembantu"? Mungkinkah metodenya bisa lebih berguna berada di salah satu kelas yang dilewati sebagai parameter? Jawaban atas pertanyaan-pertanyaan itu seringkali "baik-baik saja sebagai statis" tetapi perlu diingat.

Jeremy McGee
sumber
Kelas yang berisi metode statis sudah menempati memori. Ketakutan Anda terhadap statickata kunci tampaknya tidak berdasar.
Robert Harvey