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 UsefulThings
tüm yöntemleri getiriyor UsefulThings
. Bu durumda sadece istiyorum format_text
ve açıkça istemiyorum get_file
ve 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
Usefulthings
ve 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_text
o 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 ApplicationHelper
bir 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; end
ve kullanmak istiyorsunuz add1
ama add2
sı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#included
geri aramayı kullanarak her zaman otomatik olarak diğerini içermesiniinclude
sağlayabilirsiniz. Tek başına yararlı olduğu içinformat_text
yöntem kendi modülüne taşınabilir. Bu, yönetimi biraz daha az külfetli yapar.