Arka fon:
Birkaç örnek yöntemleri bildiren bir modül var
module UsefulThings
def get_file; ...
def delete_file; ...
def format_text(x); ...
end
Ve bu yöntemlerden bazılarını bir sınıftan çağırmak istiyorum. Normalde bunu ruby'de nasıl yaparsınız:
class UsefulWorker
include UsefulThings
def do_work
format_text("abc")
...
end
end
Sorun
include UsefulThingstüm yöntemleri getiriyor UsefulThings. Bu durumda sadece istiyorum format_textve açıkça istemiyorum get_fileve delete_file.
Bunun için birkaç olası çözüm görüyorum:
- Bir şekilde yöntemi herhangi bir yere dahil etmeden doğrudan modüle çağırınız
- Bunun nasıl yapılacağını / yapıp yapamayacağını bilmiyorum. (Dolayısıyla bu soru)
- Bir şekilde dahil
Usefulthingsve sadece bazı yöntemlerini getirmek- Bunun nasıl yapılacağını / yapıp yapamayacağını da bilmiyorum
- Bir proxy sınıfı oluşturun, buna ekleyin
UsefulThings, ardındanformat_texto proxy örneğine temsilci seçin- Bu işe yarar, ancak anonim proxy sınıfları bir saldırıdır. Yuck.
- Modülü 2 veya daha fazla küçük modüle ayırın
- Bu da işe yarayabilir ve muhtemelen aklıma gelen en iyi çözümdür, ancak düzinelerce ve düzinelerce modülün çoğalmasıyla sonuçlanacağımdan kaçınmayı tercih ederim - bunu yönetmek külfetli olurdu
Tek bir modülde neden pek çok ilgisiz fonksiyon var? Bu var ApplicationHelperbir herhangi bir şey başka bir yerde ait değil belirli yeterince için atık alanı olarak ekibimiz de-facto karar verdi uygulamayı, raylar gelen. Her yerde kullanılan çoğunlukla bağımsız yarar yöntemleri. Ayrı yardımcılara bölebilirdim, ama her biri 1 yöntemle 30 tane olurdu ... bu verimsiz görünüyor
module UT; def add1; self+1; end; def add2; self+2; end; endve kullanmak istiyorsunuz add1ama add2sınıfta değil Fixnum. Bunun için modül işlevlerine sahip olmak nasıl yardımcı olur? Bir şey mi kaçırıyorum?
Module#includedgeri aramayı kullanarak her zaman otomatik olarak diğerini içermesiniincludesağlayabilirsiniz. Tek başına yararlı olduğu içinformat_textyöntem kendi modülüne taşınabilir. Bu, yönetimi biraz daha az külfetli yapar.