17. Modüller

Ruby'de modüller sınıflara benzer özellikler gösterirler:

  • Modülün örneği yoktur.
  • Modülün alt sınıfı yoktur.
  • Modül module ... end şeklinde tanımlanır.

Aslında modülün "Module" sınıfı, sınıfın "Class" sınıfının süper sınıfıdır. Anladınız mı? Hayır? O zaman devam edelim.

Modüller iki türlü kullanılır. Bir tanesi ilişkili yöntemleri ve sabitleri merkezi bir yerde toplar. Ruby'nin standart kitaplığındaki Math modülü böyle bir rol oynar:

ruby> Math.sqrt(2)
   1.4142135623730951
ruby> Math::PI
   3.141592653589793

:: işleci Ruby yorumlayıcısına bir sabit için hangi modülü yükleyeceğini söyler. (örneğin Math için bir anlam ihtiva eden birşey PI için başka bir anlama gelebilir). Eğer bir yöntem ya da sabitin, :: kullanmadan doğrudan modüle başvurmasını istiyorsak bu modülü include ile ekleyebiliriz.

ruby> include Math
   Object
ruby> sqrt(2)
   1.4142135623730951
ruby> PI
   3.141592653589793

Diğer bir kullanım da karışım (mixin) olarak adlandırılır. Bazı nesneye yönelik yazılım geliştirme dili, C++ da dahil, birden fazla süper sınıftan miras almamızı sağlayan çoklu miras kavramına izin verir. Bunun gerçek dünyadaki örneği çalar saatler olabilir. Çalar saatleri hem saat sınıfına hem de alarm sınıfına sokabilirsiniz.

Ruby gerçek çoklu mirası doğrudan desteklemez ancak karışım tekniği iyi bir seçenektir. Modüllerin örneklenemeyeceğini ve alt sınıflanamayacağını hatırlayın, ancak bir modülü bir sınıf tanımlamasının içine include ile eklersek bu yöntemi sınıfa 'karıştırmış' ya da eklemiş oluruz.

Karışım stratejisi, ek olarak sınıfımıza hangi özellikleri istediğimizi belirtmenin başka bir yoludur. Örneğin eğer bir sınıfın çalışan bir each yöntemi varsa- bunu Enumerable standart kütüphanesine eklemek size sort ve find yöntemlerini bedavaya getirir.

Modüllerin bu kullanımı işlevel bir çoklu miras kullanımı sağlarken, aynı zamanda basit bir ağaç yapısıyla sınıf akrabalıklarını temsil eder, böylece dil gerçeklenimini basitleştirir (benzer bir dil gerçeklenimi Java tasarımcıları tarafından da yapılmıştı).