Programlamaya Visual / Real Basic ile başladığımı, sonra Java'ya geçtiğimi söyleyerek başlayayım, yani nokta sözdizimine oldukça alıştım. Ancak, sonunda Objective-C'ye geçip parantezlere alıştığımda, sonra Objective-C 2.0'ın ve nokta sözdiziminin tanıtımını gördüğümde, bundan gerçekten hoşlanmadığımı fark ettim. (diğer diller için sorun değil, çünkü böyle dönüyorlar).
Objective-C'de nokta sözdizimine sahip üç ana etkim var:
Sığır Eti # 1: Neden hata aldığınızı belirsizleştirir. Örneğin, şu satırım varsa:
something.frame.origin.x = 42;
Sonra bir derleyici hatası alacağım çünkü something
bir nesnedir ve bir nesnenin yapılarını bir ifadenin değeri olarak kullanamazsınız. Ancak, eğer varsa:
something.frame.origin.x = 42;
Çünkü O zaman bu derler gayet, something
bir NSRect üyesine sahip olan bir yapı kendisi olduğunu ve olabilir bir lvalue olarak kullanabilirsiniz.
Bu kodu benimsiyor olsaydım, ne something
olduğunu anlamaya çalışmak için biraz zaman harcamam gerekirdi . Bir yapı mı? Bu bir nesne mi? Bununla birlikte, köşeli parantez sözdizimini kullandığımızda çok daha nettir:
[something setFrame:newFrame];
Bu durumda, something
bir nesne olup olmadığı kesinlikle bir belirsizlik yoktur . Belirsizliğin girişi benim sığır etim # 1.
Sığır # 2: C'de, nokta sözdizimi yöntemler çağırmak yerine yapıların üyelerine erişmek için kullanılır. Programcılar bir nesnenin setFoo:
ve foo
yöntemlerini geçersiz kılabilir , ancak yine de onlara aracılığıyla erişebilirler something.foo
. Aklımda, nokta sözdizimini kullanan ifadeler gördüğümde, bunların bir ivar'a basit bir atama olmasını bekliyorum. Bu her zaman böyle değildir. Bir dizi ve bir tablo görünümüne aracılık eden bir denetleyici nesnesi düşünün. Eğer myController.contentArray = newArray;
ararsam, eski diziyi yeni diziyle değiştirmesini beklerdim. Ancak, orijinal programcı setContentArray:
yalnızca diziyi ayarlamakla kalmayıp, aynı zamanda tablo görünümünü de yeniden yüklemeyi geçersiz kılmış olabilir. Çizgiden, bu davranışa dair bir gösterge yok. Eğer görseydim[myController setContentArray:newArray];
, sonra "Aha, bir yöntem. Ne yaptığını bildiğimden emin olmak için bu yöntemin tanımını görmem gerekiyor." diye düşünürdüm.
Bence Beef # 2 ile ilgili özetim, nokta sözdiziminin anlamını özel kodla geçersiz kılabileceğinizdir.
Sığır eti # 3: Kötü göründüğünü düşünüyorum. Bir Objective-C programcısı olarak, sözdizimini parantez içine almaya tamamen alıştım, bu yüzden güzel parantezlerin satırlarını ve satırlarını okumak ve görmek ve sonra foo.name = newName; foo.size = newSize;
vb. İle aniden kırılmak benim için biraz rahatsız edici. Bazı şeylerin nokta sözdizimi (C yapıları) gerektirdiğinin farkındayım, ama onları tek kullandığım zaman bu.
Elbette, kendiniz için kod yazıyorsanız, rahat ettiğiniz şeyi kullanın. Ancak açık kaynak oluşturmayı planladığınız bir kod yazıyorsanız veya sonsuza kadar korumayı beklemediğiniz bir şey yazıyorsanız, o zaman köşeli parantez sözdizimini kullanmayı şiddetle tavsiye ederim. Bu, elbette, sadece benim fikrim.
Nokta sözdizimine karşı son blog yayını: http://weblog.bignerdranch.com/?p=83
Yukarıdaki gönderiye yanıt verin: http://eschatologist.net/blog/?p=226 (nokta sözdizimi lehine orijinal makale ile: http://eschatologist.net/blog/?p=160 )