Objective C programlanırken insanlar const çok kullanıyor mu?


Yanıtlar:


21

Objective-C nesnelerinin çalışma şekli nedeniyle, constbir yaptırımdan vazgeçer ve programcı için bir gösterim olmaya başlar. Bu programı düşünün:

int f(const int x) {
    return ++x;
}

int main(int argc, char *argv[]) {
    @autoreleasepool {
        int x = 3;
        NSLog(@"%d", f(x));
    }
    return 0;
}

Bu aslında burada derlenmeyecek (clang kullanıyorum): derleyici ilkel C tipini değiştirme girişimini tespit edebilir ve bir hata yayar. Ama şimdi bu programla karşılaştırın:

NSMutableString *f2(const NSMutableString * const x) {
    [x appendString: @" world!"];
    return x;
}

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSMutableString *x = [@"Hello" mutableCopy];
        NSLog(@"%@", f2(x));
    }
    return 0;
}

İşlev sabit bir nesneye sabit bir işaretçi geçirilmesine rağmen, nesneyi değiştirmek hala mümkündür.

Nesne yönelimli programlamada, bir nesnenin sabit doğasını zorlamanın en iyi yolu, o nesneyi değişmez yapmaktır - yani durumunu değiştirebilecek herhangi bir yöntem sunmamaktır. Yukarıdaki işlevin NSStringbunun yerine bir argüman aldığını NSMutableStringve @"Hello"değişebilir bir kopya yerine değişmez kelimeyi geçtiğimi düşünün . Artık, makul bir şekilde, içeri giren nesneyi mutasyona uğratma şansı yoktur [*]. Objective-C'nin diğer OO dillerinden farklı olarak constya da finalnesne referanslarından farklı olarak herhangi bir zorlama yolu yoktur .

Karşılaştırma için, constC ++ 'da tamamen farklı çalışır. Bir alırsanız constbir C ++ nesneye başvuru, sadece çağrı izin var consto nesne üzerinde üye fonksiyonları. Bu işlevler const, herhangi bir değişiklik yapmadan veya yalnızca mutablesınıf tasarımcısı tarafından açıkça işaretlenmiş üye değişkenleri değiştirerek nesnenin -ness'ini korur . Öyleyse MutableString, C ++ 'da NSMutableStringObjective-C'ye eşdeğer bir tipim olduğunu hayal edin . Yukarıdaki örneğimin eşdeğeri şöyle görünecektir:

MutableString& f3(const MutableString& x) {
  x.appendString(" world!");
  return x;
}

Bu kesinlikle derlenmeyecektir: appendString()bir constişlem olmamasına ek olarak , işlev constniteleyiciyi a gerektiren tür referansından kaldırır const_cast.

[*] Bunu yapmanın bir şekilde çarpıtılmış bir yolu olmasını bekliyorum, ama şimdi bir programcının "akıllı" şeyler yaparak sabote etmeye çalışan alemlerine giriyoruz.


Teşekkürler. Yani const değiştirici ile modifikasyonu önlemenin bir yolu yoktur.
user4951

Sağ. Derleyici hala constdekorasyona anlamlı davranır , böylece uyarıları bastırmak için takma adlar veya dökümler gibi bükülmeler alırsınız, ancak bu bükülmeler sonucunda programın davranışında bir değişiklik olmaz.

5
Ben consthala bir nesneye işaretçi asla farklı bir nesneyi işaret etmek için atanmış belirtmek için Amaç C yararlı olabilir inanıyorum . Yani NSString * const xsizinle xher zaman aynı dize olacağını ve farklı bir dize olacağını biliyorum .
tboyce12

3

Amaç C'ye gelince - programlamıyorum, bu yüzden soruyu cevaplayamıyorum. Yine de cevaplayabileceğim soru " constObjective C'de programlama yaparken insanlar çok mu kullanmalı?" - bu kesin bir "Evet".

Constness temelde programları daha güvenilir ve bakım yapılabilir hale getirmek için kullanılan bir yazılım güvenliği özelliğidir. Birçok programcı, consts'nin değerini gerçekten takdir etmeden büyür , bir güne kadar kötü bir şey olur ve "Ah ha" anı vardır - "Ah, bunun constiçin kullanılır". Sabit olmayan bir program yazmak tamamen mümkündür, böyle bir programı güvenilir kılmak neredeyse imkansızdır.

Birçok kod örneği gerçekte program değildir, sadece belirli bir özelliği göstermek için tasarlanmış parçacıklardır. Örneğin yapmaya constçalıştığı noktadan uzaklaştığı için kullanmazlar. Gördüğünüz diğer kod türü, öğrendikleri örneklere veya sabitleri bilen ve bunları kullanmak için çok tembel olan örneklere dayanan deneyimsiz programcılar tarafından yazılan koddur.


0

Objektif-c'yi uzun zamandır kullanmadım.

Ancak, merak ediyorum neden hiç kimse bu yönü söylemiyor.

Objective-c'nin sabitle ilgili başka bir şeyi var. mutability

Örneğin, Nstring * sabit bir dizeyi işaret edecektir. Değiştirebileceğiniz bir dize istiyorsanız, NMutableString veya bunun gibi bir şey kullanırsınız. Bu NMutableString, insanların dizeyi değiştirmesine izin veren ek yöntemler sağlayacaktır.

Şimdi, işaretçinin kendisinin sabit olmasını istiyorsanız ne olur? Çok büyük bir projeyi kodlarken asla endişelenmem gerekmiyor.

Bence bu yüzden.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.