OK, saya telah belajar apa fungsi statis itu, tetapi saya masih tidak melihat mengapa mereka lebih berguna daripada fungsi anggota pribadi. Ini mungkin semacam pertanyaan newb-ish di sini, tetapi mengapa tidak mengganti semua fungsi anggota pribadi dengan fungsi statis saja?
static-methods
Dark Templar
sumber
sumber
static
karena membatasi fungsi ke ruang lingkup.private member
kita dapat dengan aman menganggap OP bertanya tentang konsep OO dan tidak memiliki petunjuk tentang ruang lingkup file statis.Jawaban:
Dengan asumsi bahwa Anda menggunakan OOP , gunakan fungsi statis ketika mereka tidak bergantung pada anggota kelas. Mereka masih bisa bersifat pribadi, tetapi dengan cara ini mereka dioptimalkan karena mereka tidak bergantung pada instance objek terkait.
Selain di atas, saya menemukan fungsi statis berguna ketika Anda tidak ingin membuat turunan objek hanya untuk menjalankan satu fungsi publik di atasnya. Ini terutama terjadi pada kelas pembantu yang berisi fungsi publik untuk melakukan pekerjaan yang berulang dan umum, tetapi tidak perlu mempertahankan keadaan apa pun di antara panggilan.
sumber
Mencoba penjelasan yang lebih sederhana daripada yang di atas (yang cukup bagus).
Objek adalah kode + data secara normal. Metode statis digunakan ketika Anda hanya memiliki bagian "kode" untuk menangani (tidak ada data / negara yang dikelola (kecuali anggota data statis)).
sumber
Karena mereka tidak memerlukan contoh dan dapat bersifat publik. Katakanlah Anda memerlukan fungsi untuk mendapatkan penyebut umum yang paling baik (GCD; sangat berguna untuk kelas pecahan; dan ya ini hanyalah contoh sederhana). Tidak ada gunanya membuat kelas objek yang tujuan utamanya adalah Anda dapat memiliki
this
pointer yang tidak Anda perlukan atau gunakangcd
. Jadi Anda menggunakan metode statis untuk itu, idealnya di kelas yang benar-benar menggunakan GCD (misalnya di kelas fraksi).Tentu jika hanya ada metode statis, Anda melakukan kesalahan OOP dan harus beralih ke benar-benar melakukan OOP atau menggunakan bahasa yang lebih sesuai dengan paradigma Anda.
sumber
stuff::Thing::Load(...)
vsstuff::LoadThing()
).Saya menggunakannya sebagai fungsi pembantu untuk tugas-tugas umum, contohnya adalah:
Sebagian besar file saya yang mengelompokkan fungsi statis memiliki Pembantu akhiran, yang berarti bahwa itulah yang mereka lakukan, membantu saya mendapatkan tempat yang lebih cepat.
sumber
Seperti apa metode statis itu:
Contoh kapan metode statis berguna:
Cukup gunakan di tempat yang sesuai saja.
Jika banyak data Anda berada di luar objek dan sedang dikerjakan melalui metode statis maka kode Anda tidak berorientasi objek dan mungkin menjadi sulit untuk dipelihara.
sumber
Statis dan privat sebenarnya ortogonal: suatu metode bisa statis, atau privat, atau tidak ada, atau keduanya.
Statis vs non-statis (alias 'metode contoh') menunjukkan apakah metode beroperasi pada kelas itu sendiri (statis) atau pada satu contoh tertentu (non-statis). Bergantung pada bahasa, Anda dapat memanggil metode statis melalui instance, tetapi Anda tidak pernah dapat mengakses instance melalui metode statis (yang juga menyiratkan bahwa Anda tidak dapat memanggil metode non-statis dari dalam metode statis, hanya karena Anda tidak memiliki
this
obyek). Gunakan metode statis untuk menerapkan perilaku yang secara konsep terkait dengan kelas, tetapi tidak 'mengikat' ke satu contoh tertentu. Skenario lain di mana Anda mungkin ingin menggunakan metode statis adalah ketika Anda memiliki fungsi yang beroperasi pada dua instance kelas, dan tidak ada operan yang berhak mendapatkan status istimewa - misalnya, dengan asumsi Anda memiliki kelasVector
, dan Anda ingin menerapkan penambahan; metode penambahan Anda bisa disebut sebagaia.Add(b)
, tetapiVector.Add(a, b)
mungkin lebih masuk akal.Pribadi vs. publik adalah tentang visibilitas metode. Metode pribadi hanya dapat diakses dari dalam ruang lingkup kelas sendiri, sementara metode publik dapat diakses dari mana saja. Penggunaan yang paling penting untuk ini adalah enkapsulasi: dengan hanya membuat metode dan properti tersebut publik yang benar-benar dibutuhkan oleh sisa kode untuk berkomunikasi dengan kelas Anda, Anda membatasi titik di mana kode luar dapat menimbulkan masalah, dan Anda mencegah masalah di dalam kelas Anda dari pendarahan ke sisa proyek.
Jadi, aturan praktis:
sumber
Saya menggunakan metode statis baik di C ++ dan C # untuk kelas Utility, kelas yang tidak memiliki data instan, hanya satu cara untuk menggabungkan kumpulan metode yang bermanfaat dan terkait.
sumber
Dengan asumsi Anda berbicara tentang C ++ (Anda tidak mengatakan) dan Anda memiliki istilah yang benar (yaitu tidak berarti fungsi / metode anggota):
Bahkan fungsi anggota pribadi masih harus dideklarasikan di header, yang berarti itu benar-benar menjadi bagian dari API dan ABI kelas, meskipun pengguna tidak dapat benar-benar memanggilnya. Jika Anda menambahkan, memodifikasi, atau menghapus fungsi anggota pribadi, Anda memaksa kompilasi ulang semua kelas dependen (header telah berubah, membuat tidak bisa tahu lebih baik) dan ketika Anda melakukannya di perpustakaan, Anda harus mempertimbangkan kompatibilitas untuk aplikasi menggunakan saya t.
Di sisi lain, fungsi statis dengan cakupan file tidak mendapatkan simbol publik, sehingga Anda dapat menambah, memodifikasi, atau menghapusnya sesuka Anda dan tidak ada yang melampaui satu unit kompilasi yang akan terpengaruh.
sumber
Biasanya Anda memerlukan main statis untuk bertindak sebagai titik masuk untuk program Anda. Itu bisa agak penting.
sumber
Fungsi statis (dan ada arti berbeda untuk istilah itu dalam bahasa yang berbeda), tidak memerlukan status apa pun yang dipertahankan di antara panggilan. Jika secara konseptual terkait erat dengan apa yang dilakukan kelas, jadikan itu fungsi kelas (seperti pada kelas bukan objek), atau jika tidak, jadikan itu fungsi global (atau tingkat modul, apa pun). Itu tidak termasuk pada suatu objek jika tidak memerlukan keadaan objek.
Jika Anda meneruskan status ke itu sepanjang waktu, itu sebenarnya bukan fungsi stateless, Anda hanya membuat fungsi stateful dengan sintaks stateless. Dalam hal itu, itu mungkin milik objek panggilan, atau mungkin refactoring untuk lebih menyelaraskan keadaan dan perilaku ditunjukkan.
sumber
"Kenapa tidak ganti semua fungsi anggota pribadi dengan fungsi statis saja?"
... karena anggota pribadi dapat mengakses data instan sementara hanya memungkinkannya terjadi dari panggilan yang dilakukan di dalam fungsi anggota lainnya. Fungsi statis bisa bersifat pribadi, tetapi tidak akan dapat mengubah atau merujuk ke turunan kelas kecuali turunan dilewatkan sebagai parameter.
sumber
Lucu juga belum ada yang bisa memberikan jawaban yang bagus. Saya tidak yakin yang ini juga. Anda mungkin harus menganggapnya sebagai petunjuk bahwa mereka harus digunakan sesedikit mungkin. Mereka lebih memilih prosedural daripada OOP.
Berikut beberapa contoh lainnya:
Dalam Obj-C, di mana mereka disebut metode kelas, mereka biasanya digunakan sebagai pembungkus alokasi di mana objek dimasukkan ke dalam kolam penghitungan referensi sebelum dikembalikan.
Contoh lain dari Obj-C adalah mendaftarkan kelas baru ke koleksi kelas. Katakanlah Anda memiliki satu set kelas yang masing-masing menangani satu jenis file. Saat Anda membuat kelas baru untuk tipe file baru, Anda bisa mendaftarkannya ke koleksi (variabel global) menggunakan metode statis di kelas yang menentukan jenis file.
Dalam C + + penggunaan lain yang bisa saya pikirkan adalah untuk menangkap kesalahan dengan lembut. Fungsi konstruktor Anda tidak dapat gagal, kecuali dengan melemparkan pengecualian. Anda bisa mengatur variabel instance kesalahan, tapi itu tidak selalu tepat. Sebagai gantinya Anda dapat melakukan bagian-bagian yang mungkin gagal dalam pembungkus statis dan kemudian mengalokasikan dan mengembalikan objek baru, atau NULL pada kegagalan.
sumber
Katakanlah Anda ingin menghitung sinus sesuatu.
Tanpa statis:
Dengan statis:
Tidak masuk akal untuk membuat
sin
non-statis. Ini stateless dan hanya memproses input.Fungsi statis tidak terikat pada objek tertentu. Mereka adalah fungsi "umum" yang independen dari keadaan internal objek.
sumber
x.sin()
. Jawaban Anda mengasumsikan bahwa dosa harus menjadi fungsi "Matematika", sedangkan itu jelas berfungsi ganda.Agak terlambat di sini tapi saya ingin mencoba membuat definisi yang tepat: fungsi statis adalah fungsi yang tidak atau tidak bisa mereferensikan properti instance / metode kelas yang mengandung.
Dalam beberapa bahasa, seperti C #, mungkin ada bidang atau properti statis di kelas statis, jadi tidak tepat untuk mengatakan mereka tidak digunakan untuk negara; fungsi statis mungkin menggunakan keadaan statis (global).
Pada dasarnya, intinya adalah: fungsi statis, seperti apa pun yang statis, berguna ketika masuk akal bagi mereka untuk selalu tersedia tanpa ketergantungan pada instance non-statis.
Fungsi pembantu, seperti fungsi matematika, adalah contoh yang sering ditempatkan, tetapi ada yang lain.
Jika kelas yang Anda buat mengharuskan data tidak dapat diubah, mungkin masuk akal untuk membuat fungsi statis yang mengambil instance dan memberikan instance baru karena instance tidak dapat (atau tidak seharusnya) diubah. Kelas string, misalnya, mungkin memiliki fungsi statis yang mengambil string (atau 2 atau lebih) dan meneruskan string baru.
Alasan lain mungkin karena ada kelas yang menyimpan keadaan global atau data dari beberapa jenis. Mungkin ada fungsi statis yang bekerja dengan properti atau bidang statis di kelas statis itu.
sumber
Saya ingin menunjukkan penggunaan lain dari f () statis.
http://www.parashift.com/c++-faq/named-ctor-idiom.html
Turun ke ini:
static
fungsi memungkinkan Anda untuk membuat "Named Constructors", yaitu Anda memberi nama fungsi statis Anda dengan nama yang sesuai dan didokumentasikan sendiri, dan fungsi statis ini memanggil salah satu konstruktor (karena konstruktor memiliki nama yang identik, dan Anda dapat memiliki Banyak dari mereka, sulit untuk membedakan antara mereka).sumber