SORU
18 Aralık 2010, CUMARTESİ


Neden Objective-C metot adı son bölümünü bir argüman birden fazla parça var (zaman) almak gerekir?

Objective-C, son bileşeni bir argüman almaz nereye yöntem isimleri bildirebilirsiniz. Örneğin, aşağıdaki yasal değildir.

-(void)take:(id)theMoney andRun;
-(void)take:(id)yourMedicine andDontComplain;

Neden Objective-C bu şekilde tasarlanmıştır? Kimse kurtulmak için bir ihtiyaç gördüm ki sadece Smalltalk bir obje mi?

Bu sınırlama Smalltalk mesaj çağırma etrafında sınırlayıcı yok, son bileşenin en son bağımsız değişken için tekli bir mesaj olarak yorumlanabilir beri Smalltalk mantıklıdır. Örneğin, BillyAndBobby take:'$100' andRun BillyAndBobby take:('$100' andRun) olarak ayrıştırılmış olur. Bu köşeli parantez gerekli olan Objective-C önemli değil.

Destek parametresiz seçici bileşenleri olmazdı kazanmak bizi çok her zamanki yollarından bir dildir ölçülen, yöntem adı bir programcı alır (örneğin runWith: yerine take:andRun) etkilemez işlevsel semantik bir program, ne de etkileyiciliğini dili. Nitekim, parametresiz bileşenleri ile bir program alfa olmadan eşdeğerdir. Bu nedenle böyle bir özellik gerekli (Objective-C belirtilen sebep oldu tabii tasarımcılar; herkes Brad Cox ve Tom Love biliyor mu? değil Devlet bu cevaplar ilgilenmiyorum Buradalar mı?) ya da bu özelliği gerekli değil çok yöntem adları nasıl yazıldığını söylüyorlar. Birincil yararı okunabilirlik ve writability okunabilirlik, sadece... bildiğiniz gibi), daha yakından benzer bir yöntem adlarını yazabilirsin anlamına geliyor doğal dil cümleleri. Seviyor -(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)theApplication (Matt Gallagher puan on "Cocoa With Love" biraz kafa karıştırıcı zaman bırakın biçimsel parametre olabilir adlı -(BOOL)application:(NSApplication*)theApplication shouldTerminateAfterLastWindowClosed, böylece yerleştirme parametresi hemen yanında uygun bir isim.

Apple'ın Objective-C çalışma zamanı (örneğin) seçiciler bu tür, neden derleyici değil mi? yani işleme yapabilecek. Neden yöntem adları onlara da destek değil mi?

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface Potrzebie : NSObject
-(void)take:(id)thing;
@end

@implementation Potrzebie
 (void)initialize {
    SEL take_andRun = NSSelectorFromString(@"take:andRun");
    IMP take_ = class_getMethodImplementation(self, @selector(take:));
    if (take_) {
        if (NO == class_addMethod(self, take_andRun, take_, "@@:@")) {
            NSLog(@"Couldn't add selector '%@' to class %s.", 
                  NSStringFromSelector(take_andRun), 
                  class_getName(self));
        }
    } else {
        NSLog(@"Couldn't find method 'take:'.");
    }
}

-(void)take:(id)thing {
    NSLog(@"-take: (actually %@) %@",NSStringFromSelector(_cmd), thing);
}
@end

int main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Potrzebie *axolotl=[[Potrzebie alloc] init];
    [axolotl take:@"paradichloroaminobenzaldehyde"];
    [axolotl performSelector:NSSelectorFromString(@"take:andRun") 
                  withObject:@"$100"];
    [axolotl release];

    [pool release];
    return 0;
}

CEVAP
19 Aralık 2010, Pazar


Bu Brad Cox. Benim orijinal cevap bu soru yanlış. ReallyFast hızlı mesajlaşma, sözdizimsel şeker bir tür değil tetiklemek için kodlanmış bir uzantısı olduğunu düşündüm. Gerçek cevabı Smalltalk onun çözümleyici (farz) belirsizlik ile başa çıkamadı çünkü, belki de destek vermedi. OC köşeli ayraç kaldırma herhangi bir belirsizlik olsa da, ben sadece Smalltalk anahtar kelime yapısı çıkışlı düşünmedim.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • adrianisen

    adrianisen

    25 Kasım 2009
  • Dellbear816

    Dellbear816

    4 Mart 2008
  • rekjavicxxx

    rekjavicxxx

    28 EKİM 2007