Saya punya pertanyaan dua bagian
Praktek terbaik
- Saya memiliki algoritme yang melakukan beberapa operasi pada struktur data menggunakan antarmuka publik
- Saat ini merupakan modul dengan berbagai metode statis, semuanya bersifat pribadi kecuali untuk satu metode antarmuka publik.
- Ada satu variabel contoh yang perlu dibagikan di antara semua metode.
Ini adalah opsi yang saya lihat, mana yang terbaik ?:
- Modul dengan metode statis ('modul' dalam ruby)
- Kelas dengan metode statis
- Modul mixin untuk dimasukkan ke dalam struktur data
- Refactor bagian dari algoritme yang memodifikasi struktur data tersebut (sangat kecil) dan buat campuran tersebut yang memanggil metode statis dari modul algoritme
Bagian teknis
Apakah ada cara untuk membuat metode Modul pribadi ?
module Thing
def self.pub; puts "Public method"; end
private
def self.priv; puts "Private method"; end
end
Di private
dalam tampaknya tidak berpengaruh apa-apa , saya masih bisa menelepon Thing.priv
tanpa masalah.
ruby
private-methods
access-specifier
Daniel Beardsley
sumber
sumber
private
hanya mempengaruhi metode instance, bukan metode kelas. gunakanprivate_class_method
sebagai gantinya:module Thing; def self.pub; end; private_class_method :pub; end
Jawaban:
Saya pikir cara terbaik (dan sebagian besar bagaimana libs yang ada ditulis) untuk melakukan ini adalah dengan membuat kelas dalam modul yang berhubungan dengan semua logika, dan modul hanya menyediakan metode yang mudah digunakan, misalnya
sumber
perform
bukanlah metode yang seharusnya menjadi privat di sini, metode privat adalah metode privat diTranslator
kelas (contoh @ ucron tidak memiliki apapun, yang sangat disayangkan).GTranslate.translate
hanya metode yang nyaman karenaGTranslate::Translator#perform
, tidak ada keuntungan nyata yang menyembunyikannya, jika memungkinkan.self.translate
mendeklarasikan metode kelas / modul.GTranslate::Translator.new.perform(text)
- berbelit-belit, tapi tidak pribadi!Ada juga
Module.private_class_method
, yang bisa dibilang lebih mengungkapkan niat.Untuk kode dalam pertanyaan:
Ruby 2.1 atau yang lebih baru:
sumber
private
?sumber
include Writer
pilihan!Anda dapat menggunakan metode "termasuk" untuk melakukan hal-hal mewah ketika modul dicampur. Ini tentang apa yang Anda inginkan, menurut saya:
sumber
included do |base| [...] end
sebagai ganti defSayangnya,
private
hanya berlaku untuk metode instance. Cara umum untuk mendapatkan metode "statis" pribadi di kelas adalah dengan melakukan sesuatu seperti:Memang saya belum bermain-main dengan melakukan ini di modul.
sumber
.foo
metode kelas privat: "private; def self.foo ()"private
danprivate_class_method
dimiliki olehModule
notClass
. Kode ini bekerja dengan cara dan merupakan alternatif untuk menggunakanprivate_class_method
.Cara yang bagus adalah seperti ini
sumber
Bagaimana dengan menyimpan metode sebagai lambda dalam variabel / konstanta kelas?
Untuk pengujian:
UPD: pembaruan besar dari kode ini setelah 6 tahun menunjukkan cara yang lebih bersih untuk mendeklarasikan metode pribadi
d
Di sini kita melihat bahwa:
1)
@@L
tidak dapat diakses dari luar tetapi dapat diakses dari hampir semua tempat2)
class << self ; private ; def
berhasil membuat metoded
tidak dapat diakses dari luar dan dari dalam denganself.
tetapi bukan tanpa itu - ini aneh3)
private ; self.
danprivate ; class << self
jangan menjadikan metode pribadi - keduanya dapat diakses keduanya dengan dan tanpaself.
sumber
Proc
, sedangkan metode adalah tipeMethod
.Buat modul atau kelas pribadi
Konstanta tidak pernah bersifat pribadi. Namun, dimungkinkan untuk membuat modul atau kelas tanpa menetapkannya ke konstanta.
Jadi alternatifnya
:private_class_method
adalah membuat modul atau kelas privat dan mendefinisikan metode publik di dalamnya.Pemakaian:
Lihat dokumen untuk Module.new dan Class.new .
sumber
.self
definisi dalam metode, memasukkannya ke dalam kelas lain, dan menggunakannya sebagai instance_methods dari kelas yang disertakan. Apakah Anda tahu jika ada cara untuk membuatnya berhasil?Metode ini tidak akan mengizinkan berbagi data dengan metode privat kecuali Anda secara eksplisit meneruskan data dengan parameter metode.
sumber