Apa alasan untuk membuat metode tertentu untuk tipe data statis?
Dalam C #, misalnya, ada metode statis untuk mengetahui apakah sebuah string null atau kosong , menemukan elemen dalam array, membersihkan array, dll. Namun ada metode instance untuk mengganti karakter dalam string, dan keduanya statis dan instance metode untuk menyalin elemen antar array.
Demikian pula, di Python ada fungsi untuk mendapatkan panjang daftar, untuk memfilter daftar, dll., Tetapi metode instan untuk menemukan indeks elemen dan untuk menyalin daftar.
Sebaliknya, dalam JavaScript, hampir semua operasi yang perlu saya lakukan pada tipe data bawaan akan dapat diakses melalui metode atau properti instance.
Jadi apa alasan untuk membuat hal-hal tertentu statis dan yang lainnya tidak?
EDIT : Agar jelas, saya memahami tujuan metode statis. Pertanyaan saya lebih ke arah mengapa metode tertentu ditulis sebagai statis padahal mereka bisa ditulis sebagai metode contoh. Seperti Find
untuk array dan Format
string di C #, filter
dan len
di Python.
Jawaban
EDIT : pertanyaannya telah disempurnakan jadi saya akan mempersempit jawaban saya, tetapi tinggalkan yang sebelumnya di bawah agar tidak membuat komentar menjadi tidak relevan.
Ada beberapa alasan untuk mengimplementasikan metode sebagai metode statis daripada metode instance, dengan bahasa atau kerangka kerja yang berbeda mungkin memiliki alasan yang berbeda:
Antarmuka publik objek adalah kontrak. Jika
Array
tipe Anda mengekspos sebuahSort
metode, setiap array mulai sekarang, apa pun tipe atau versi bahasanya perlu mendukungnya. Namun, jika anArray
hanyalah representasi data dalam memori dengan kontrak tipis, dan logika dipindahkan ke kelas sepertiArray.Sort
itu, ini memberi Anda lebih banyak fleksibilitas untuk memperluas atau mengubah perilaku Anda tanpa merusak kompatibilitas.Lihat kutipan ini dari Kode Bersih Bob Martin :
Objek mengekspos perilaku dan menyembunyikan data; Struktur data mengekspos data dan tidak memiliki perilaku yang signifikan "
Dalam kasus ini, List
kelas tersebut adalah kelas yang mengekspos perilaku - ia menyembunyikan datanya (Ini diimplementasikan sebagai larik yang dapat diubah ukurannya, tetapi itu adalah detail implementasi), tetapi memperlihatkan fungsionalitas. Sebuah int[]
, meskipun, adalah struktur data. Ini adalah int
blok yang dialokasikan secara berurutan . Ia memiliki Length
properti karena merupakan bagian dari datanya , tetapi tidak memiliki banyak perilakunya - perilakunya dipindahkan ke kelas yang mengoperasikannya.
- Ini mungkin pilihan gaya. Python bukanlah bahasa OO murni, dan mungkin tidak memiliki jaminan Java / C # "everything is an object", jadi ia memilih untuk menggunakan fungsi bahasa seperti
len()
itu yang dapat digunakan terlepas dari apakah parameternya adalah instance objek atau tidak.
Jawaban Sebelumnya
Alasan di balik metode statis di C # adalah memiliki metode yang terikat pada suatu tipe tetapi tidak pada sebuah instance . Ada beberapa alasan untuk itu:
- Metode yang dapat beroperasi pada sebuah instance dan
null
, sepertistring.IsNullOrEmpty
, secara alami tidak dapat menjadi metode instance - karena mungkin tidak ada sebuah instance. - Metode pabrik yang membuat sebuah instance, demikian pula, tidak memiliki instance untuk dipanggil. Misalnya,
WebRequest.Create()
metode statis seseorang yang tidak digunakan lagi mengembalikan instance baru dari jenis yang diturunkan dariWebRequest
. - Meskipun mudah untuk dilupakan, .NET memang memiliki penanganan yang berbeda untuk tipe integral asli (
int i =5
) dan tipe referensi kotak di sekitarnya (object boxed = 5
). Jika Anda memanggil metode pada tipe nilai (int i = 5; t.ToString();
), Anda dikenai biaya untuk mengotakkannya. Itulah mengapa beberapa operasi tidak didefinisikan sebagai metode pada objek, tetapi sebagai metode statis yang menerima nilai. Itulah mengapa operasi matematika sepertiMath.Abs
tidak didefinisikan sebagai metode pada tipe kotak, tetapi sebagai fungsi statis yang menerima dan mengembalikan nilai. - Terkadang metode statis digunakan untuk "mengkonfigurasi" suatu jenis, bukan satu contoh spesifik tetapi perilaku jenis tersebut dalam sistem. Misalnya,
[ServicePointManager.SetTcpKeepAlive()][1]
mengonfigurasi perilaku semua kelas yang menggunakan tumpukan HTTP bersama di .NET, sehingga Anda dapat mengonfigurasi semuanya melalui metode statis ini.
Metode statis sangat masuk akal
- ketika metode terkait dengan tipe tetapi tidak memerlukan contoh yang ada; atau
- ketika bahasa mendukung namespacing hanya melalui kelas.
C # hanya mendukung fungsi sebagai anggota kelas, jadi fungsi pembantu harus ditulis sebagai metode statis. Kelas C # Math
adalah contoh utama.
JavaScript tidak memiliki kelas, tetapi setiap variabel non-lokal dikaitkan dengan beberapa objek - di browser, sebagian besar API dapat diakses melalui window
objek. Namun, ada metode yang dapat diakses melalui objek seperti kelas, mis Array.isArray(x)
.
Python memiliki desain istimewa yang sebagian besar berorientasi objek, tetapi memiliki beberapa fungsi bawaan seperti len()
atau iter()
, sebagian besar karena alasan historis. Di bawah tenda, mereka menggunakan metode aktual, misalnya iter(x)
biasanya x.__iter__()
, dengan fallback untuk objek yang dapat diindeks seperti daftar.
Yang lebih menarik adalah metode yang static
bukan karena kebiasaan bahasanya, tetapi karena masuk akal. Metode seperti konstruktor atau pabrik adalah contoh klasik di mana kita tidak memiliki objek yang ada yang dapat kita panggil metode. Beberapa fungsi juga tidak beroperasi tepat pada satu objek, misalnya String.IsNullOrEmpty(x)
beroperasi pada nol atau satu objek. Ini tidak berfungsi sebagai metode, misalnya x.IsNullOrEmpty()
akan mengeluarkan pengecualian jika nol! The Array.isArray(x)
metode dalam JS adalah contoh besar lainnya: kita ingin menelepon isArray(x)
pada objek dari jenis apa pun, bukan hanya pada array. Jadi, metode instance tidak berfungsi kecuali itu adalah bagian dari prototipe setiap objek.