Ruby Setter’larının Sınıf İçinde Neden self. Nitelendirmesine İhtiyacı Var?

Programlama dilleri dünyasında, her dilin kodun nasıl yapılandırılacağı ve yürütüleceğini belirleyen kendi sözdizimi ve kuralları vardır. Dinamik ve nesne yönelimli bir programlama dili olan Ruby, setter metotları konusunda benzersiz bir özellik taşır. Özellikle, Ruby setter’ları—ister attr_accessor kullanılarak oluşturulsun, ister manuel olarak tanımlansın—sınıfın içinden erişim sağlarken self. nitelendirmesinin kullanılmasını gerektirir. Bu yazı, bu gereksinimin arkasındaki nedenleri incelemekte ve Ruby programlaması üzerindeki etkilerini keşfetmektedir.

Sorun: Setter Metodu Belirsizliği

Ruby sınıfı yazarken, örnek yöntemlerin herhangi bir nitelendirme olmadan çağrılabileceğini, ancak setter’ların farklı bir durum sunduğunu fark edebilirsiniz. Metot nitelendirmesiyle ilgili ana noktaları anlamak için bir an duralım:

  • C# ve Java gibi bazı programlama dilleri, metod çağrıları için this veya self gerektirmediğinden, sözdizimsel yapıları birçok durumda daha basit hale gelir.
  • Perl ve JavaScript gibi diğer diller ise tüm metotlar için tutarlı bir şekilde self veya this kullanımını zorunlu kılar.
  • Ruby ise bu durumun ortasında bir yerde yer alır—sadece setter metotları self. nitelendirmesini zorunlu kılar, bu da potansiyel karışıklıklara yol açar.

Ruby’de Bir Örnek

Bu davranışı vurgulamak için, aşağıdaki Ruby sınıfını ele alalım:

class A
  def qwerty; @q; end                   # manuel getter
  def qwerty=(value); @q = value; end   # manuel setter
  def asdf; self.qwerty = 4; end        # "self." gereklidir
  def xxx; asdf; end                    # "self." gerekmez
  def dump; puts "qwerty = #{qwerty}"; end
end

a = A.new
a.xxx
a.dump

asdf metodundaki self.qwerty = 4 ifadesinden self‘i çıkardığınızda, Ruby hata verecek ve istenen setter metodunu tanımlayamadığını belirtecektir. Bu durum, belirsizliğin ortaya çıktığı yerlerde setter metotları için self. belirlemesinin gerekliliğini öne çıkarmaktadır.

Gereksinimleri Anlamak

Neden self.?

Ruby’de self. gereksinimi, belirsizlikle başa çıkmak için önemlidir. qwerty = 4 gibi bir ifade yazdığınızda, Ruby iki olasılık arasında ayrım yapmalıdır:

  1. Metod Çağrısı: Belki de qwerty= isimli bir setter metodunu çağırmaya çalışıyor.
  2. Yerel Değişken Ataması: Belki de qwerty isimli yeni bir yerel değişken tanımlıyor.

Bu belirsizliği akıllıca çözebilmek için her atama, o isimde bir metodun var olup olmadığını kontrol etmek zorunda kalır. Ancak bu durum, performans ve çalışma zamanı verimliliğini etkileyebilir.

C# ile Karşılaştırma

Buna karşılık, C# this nitelendirmesi olmadan setter’ların çağrılmasına izin verecek bir model kullanmaktadır. Örneğin:

public class A {
  public int qwerty { get; set; }
  public void asdf() { qwerty = 4; } // C# setter'ları "this." olmadan çalışır.
}

Bu sözdizimi tasarımı, kodu basit hale getirirken kendi karmaşıklıklarını da beraberinde getirir. C#’ta, değişken ve metod isimleri derleyici tarafından bağlamsal olarak anlaşılır, bu da Ruby’deki bazı belirsizlikleri ortadan kaldırır.

Ruby’de Ne Zaman self. Gereklidir?

Setter metodları dışında, Ruby’de self. gereksinimi olan birkaç durum daha vardır, bu durumlar arasında metod çağrıları ile değişken atamaları arasında ayrım yapmak gereklidir:

  • Bir yerel değişkenin aynı adı taşıdığı durum: Eğer hem foo adında bir metod hem de foo adında bir değişken varsa, foo çağrısı metodu çalıştırırken, foo = value yerel değişken atamasını başlatır.
  • Açık hale getirmek istediğinizde: self. kullanımı, okuyuculara bir metodu çağırmak istediğinizi, yerel bir değişken atamak değil, net bir şekilde belirtme amacını da taşır.

Sonuç

Ruby setter’ları için self. nitelendirmesine olan ihtiyaç, programlama dili tasarımı ve belirsizlik çözümü konularında ilginç bir tartışma başlatır. Bu incelikleri anlamak, sadece daha iyi Ruby kodu yazmanıza yardımcı olmakla kalmaz, aynı zamanda farklı dillerin benzer yapıları nasıl ele aldıklarını da anlamanızı derinleştirir. Ek bir karakter yazma zorunluluğu getirse de, metod çağrılarında açıklık ve niyet oluşturur, bu da Ruby’nin tasarım felsefesinin temel ilkelerindendir. Bu nedenle, bir sonraki sefer Ruby kodu yazarken, self.‘in sadece bir gereklilik değil, aynı zamanda belirsizliği önlemek ve kod okunabilirliğini artırmak için bir anahtar olduğunu unutmayın.