SORU
25 HAZİRAN 2009, PERŞEMBE


Nasıl Ruby global değişken veya sabit değerler kullanıyor musunuz?

Görünüşe göre bir program var:

$offset = Point.new(100, 200);

def draw(point)
  pointNew = $offset   point;
  drawAbsolute(point)
end

draw(Point.new(3, 4));

$offset kullanmak biraz garip geliyor.

Ben herhangi bir fonksiyon dışında bir şey tanımlarsanız C, global bir değişken otomatik olarak. Neden Ruby $offset ancak offset olmak zorunda mı ve hala küresel olacak? Eğer offset, Daha sonra ise bir yerel değil mi? Ama yerel çok genel bir duygu çünkü nerede.

Yukarıdaki kod yazmak için daha iyi bir yolu var mı? $offset kullanımı ilk başta biraz çirkin görünebilir.


Güncelleme: bu class bir tanımı içinde mahsup koyabilirim, ama eğer iki veya daha fazla sınıflar için bir şey olsa bile ne bu sürekli? Bu durumda ben hala $offset tanımlamak gerekir?

CEVAP
26 HAZİRAN 2009, Cuma


Ruby'de değişken kapsamı, bir dereceye kadar mühür tarafından kontrol edilir. Değişkenleri $ genel, @ değişkenler, @@ sınıf değişkenleri anlamı örnek ve isimleri büyük harfle başlayarak sabitler. Diğer tüm değişkenler yerli. Bir sınıf veya yöntem açtığınızda, yeni bir kapsam ve yerli bir önceki kapsamındaki mevcut değil.

Ben genellikle global değişkenler oluşturma önlemek için tercih. Temizleyici olarak görüyorum genel olarak aynı amaca ulaşmak için iki teknik vardır:

  1. Bir modülde bir sabit oluşturmak. Bu durumda, modül Foo mahsup ve Offset, o zaman tüm sınıfları Foo::Offset erişebilecek bir sabit oluşturmak için gereken tüm sınıfları koyabilirsiniz.

  2. Değeri erişmek için bir yöntem tanımlamak. Bu yöntem genel olarak tanımlayabilirsiniz, fakat yine de, daha iyi bir modül veya sınıf içinde saklanması için olduğunu düşünüyorum. Bu şekilde veri nerede mevcut olduğunu ve hatta eğer gerekiyorsa bunu değiştirebilirsiniz, ama bu program ve verilerin sahiplik yapısını daha net olacak. Bu nesneye yönelik tasarım ilkeleri doğrultusunda daha fazla.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bratayley

    Bratayley

    30 Aralık 2010
  • Jason Rosolowski

    Jason Rosolo

    25 EKİM 2006
  • PaysNatalAu's channel

    PaysNatalAu'

    11 Aralık 2010