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
veyaself
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
veyathis
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:
- Metod Çağrısı: Belki de
qwerty=
isimli bir setter metodunu çağırmaya çalışıyor. - 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 defoo
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.