Pracując nad nad projektem open source, natknąłem następującej deklaracji funkcji C i realizacja:obiektywne metody C Klasa vs C Funkcje
// FSNData.h
NSString *stringForMimeType(MimeType type);
@interface FSNData : NSObject
// All the expected objective-c property and instance method declarations
@end
// FSNData.m
#import "FSNData.h"
// where 'type' is an enum
// this does work as expected
NSString *stringForMimeType(MimeType type) {
switch (type) {
case MimeType_image_jpeg: return @"image/jpeg";
case MimeType_image_png: return @"image/png";
default:
NSLog(@"ERROR: FSNData: unknown MimeType: %d", type);
// do not return "application/octet-stream"; instead, let the recipient guess
// http://en.wikipedia.org/wiki/Internet_media_type
return nil;
}
}
@implementation
// all properties and methods defined in FSData.h implemented as expected
@end
Ten przykład może łatwo być ponownie napisany jako metody poziomu klasy z każdy problem. Tak czy inaczej, użycie paragrafu stringFormMimeType()
wymaga importowania pliku nagłówkowego FSNData
.
Patrząc na the Apple docs, stwierdza tylko:
Ponieważ Objective-C opiera się na fundamencie ANSI C, można swobodnie intermix prosty kod C z kodem Objective-C. Co więcej, twój kod może wywoływać funkcje zdefiniowane w programowych interfejsach innych niż Cocoa, takich jak jako interfejsów biblioteki BSD w/usr/include.
Nie ma wzmianki o tym, kiedy funkcje C powinny preferować metody Celu C.
Jedyną korzyścią jaką widzę w tym momencie jest to, że wywołanie powyższej funkcji, w przeciwieństwie do metody klasy, niektóre wywołania środowiska wykonawczego Objective-C będą pomijane. W typowym przypadku użycia FSNData
nie dałoby to zauważalnego zwiększenia wydajności dla użytkownika (prawdopodobnie nawet dla programistów) *.
Jakie są korzyści (inne niż styl kodowania) dla faworyzowania funkcji C w stosunku do metody klasy?
* FSNData
jest używana jako część biblioteki FSNetworking, więc wątpię, że w trakcie cyklu życia każdej aplikacji wykonano by tysiące operacji sieciowych.
Styl, struktura programu (wyraźnie wiążąca metodę z klasą) i odrobina (bardzo słaba) kontroli dostępu to wszystko, co mogę wymyślić. (Ale widzę, że @ipmcc wspomina o dziedziczeniu i jest tam również kilka rzeczy.) –
Preferuję metodę klasy, ponieważ metody Objective-C oferują nazwany parametr, którego funkcje C nie są – onmyway133
@ onmyway133 Starałem się trzymać z daleka z osobistych preferencji (tj. ** innych niż styl kodowania **) i szukania przyczyn technicznych. –