2008-08-13 5 views
4

Objective-C (그러나 장기 C/++) 프로그래머에게는 새로운 것이므로 변수에 대한 명명 규칙에 대한 조언이나 권장 사항을 찾고 있습니다.인스턴스/매개 변수 값의 이름은 어떻게 지정합니까?

내 개인적인 취향 기능 내에서 선명도 모두 인스턴스 변수의 접두사를 이용하고 함수 매개 변수의 음영을 방지하는 것입니다. 그러나 나는 접두어를 배제한 속성의 팬이다. (너무 잘 작동하지 않고 사기성이있는 속성 이름 앞에 접두어가 붙지 않는다면). 마찬가지로 "self.variable"규칙을 사용할 수도 있지만 모든 속성을 만들면 가능합니다.

그래서 예/함수 변수에 대한 선호 명명 스타일 무엇이 아래 코드를 부여? 귀찮지 않으면 함수 매개 변수의 그림자를 어떻게 처리합니까?

@interface GridItem : NSObject 
{ 
    CGRect _rect; 
    ... 
} 
@end 

-(void) initFromRect:(CGRect)rect 
{ 
    _rect = rect; 
    ... 
} 

건배! C와 C++ 모두 구현에서 사용하기 위해 특정 밑줄 접두사를 예약하기 때문에

답변

15

대부분의 Cocoa 프로젝트는 밑줄을 IBOutlet 인스턴스 변수 접두사로 사용하고 IBOutlet 인스턴스 변수에는 접두어를 사용하지 않습니다.

IBOutlet 인스턴스 변수에 언더 바를 사용하지 않는 이유는 nib 파일을로드 할 때 연결된 콘센트에 대한 setter 메서드가 있으면 해당 setter가 호출된다는 것입니다. 그러나이 메커니즘 하지 사용 키 - 값 코딩, 예를 들어 이름이 언더 (_myField)로 시작하는 세터의 이름은하지 않는 정확히 콘센트처럼 설정할 수 없습니다 것 (그래서 함께 IBOutlet을한다 set_myField:)이며 비표준이며 총체적입니다.

또한 self.myProp과 같은 속성을 사용하면 이 아니라이라는 인스턴스 변수에 액세스하는 것과 같은 점에 유의하십시오. [self myProp]과 같이 대괄호 표기법을 사용하는 경우와 마찬가지로 속성을 사용할 때 메시지를 보내려면입니다. 모든 속성은 getter와 setter를 한 줄로 지정하는 간결한 구문을 제공하며 구현을 종합 할 수 있습니다. 실제로 메시지 발송 메커니즘을 단락시키지 않습니다. 인스턴스 변수에 직접 액세스하지만 접두사를 접두어로 붙이려면 self 을 포인터로 처리해야합니다. self->myProp은 실제로 C 스타일 필드 액세스입니다.

마지막으로 코코아 코드를 작성할 때 헝가리 표기법을 사용하지 말고 "f"와 "m_"과 같은 다른 접두어를 사용하지 마십시오. 코드를 "이해하지 못하는"사람이 작성한 것으로 표시합니다. 다른 코코아 개발자들에 의해 의심받을 수 있습니다.

일반적으로 Coding Guidelines for Cocoa 문서의 조언 (Apple Developer Connection)을 따르십시오. 다른 개발자는 코드를 선택하고 이해할 수 있으며 런타임 내성 검사를 사용하는 모든 Cocoa 기능과 잘 작동합니다. 반면,

// EmployeeWindowController.h 
#import <AppKit/NSWindowController.h> 

@interface EmployeeWindowController : NSWindowController { 
@private 
    // model object this window is presenting 
    Employee *_employee; 

    // outlets connected to views in the window 
    IBOutlet NSTextField *nameField; 
    IBOutlet NSTextField *titleField; 
} 

- (id)initWithEmployee:(Employee *)employee; 

@property(readwrite, retain) Employee *employee; 

@end 

// EmployeeWindowController.m 
#import "EmployeeWindowController.h" 

@implementation EmployeeWindowController 

@synthesize employee = _employee; 

- (id)initWithEmployee:(Employee *)employee { 
    if (self = [super initWithWindowNibName:@"Employee"]) { 
     _employee = [employee retain]; 
    } 
    return self; 
} 

- (void)dealloc { 
    [_employee release]; 

    [super dealloc]; 
} 

- (void)windowDidLoad { 
    // populates the window's controls, not necessary if using bindings 
    [nameField setStringValue:self.employee.name]; 
    [titleField setStringValue:self.employee.title]; 
} 

@end 

당신은 내 -init-dealloc 방법으로 직접 Employee를 참조하는 인스턴스 변수를 사용하고 있음을 볼 수 있습니다 : 여기

는 윈도우 컨트롤러 클래스 내 규칙을 사용하여 어떻게 보이는지이다 다른 메소드에서이 속성을 사용하고 있습니다. 이것은 일반적으로 속성이있는 좋은 패턴입니다. 이니셜 라이저의 속성 인 기본 인스턴스 변수 인 -dealloc과 속성의 getter 및 setter 만 터치하면됩니다.

+1

Apple의 UITextView 접두어는 ivars에 m_을 붙입니다. –

+0

... 그리고? 그건 좋은 생각이 아니야. :) –

1

나는 어떤 식별자에 대한 접두어로 밑줄을 사용하여 좋아하지 않는다.

나는 못생긴 "self.variable"을 사용하여 생각합니다.

는 일반적으로 I 인스턴스 변수 (즉, 더 프리픽스도없는 접미사) 꾸밈 식별자를 사용한다. 클래스가 복잡하여 인스턴스 변수를 기억할 수 없으면 문제가 발생합니다. 예를 들어 인스턴스 변수의 이름으로 "rect"를 사용하고 매개 변수 이름으로 "newRect"또는 "aRect"를 사용합니다.

2

개인적 I 함수 및 변수 낙타 케이싱을 사용하여 코코아 명명 규칙을 따르며, (물론 선두 NS)없이 오브젝트 이름 낙타 케이싱 대문자.

형식 접두사를 사용하면 코드를 작성하지 않은 사람이 코드를 더 불투명하게 만듭니다 (모든 사람은 항상 다른 접두사를 사용하기 때문에). 현대 IDE에서는 형식을 알아내는 것이 그렇게 어렵지 않습니다.

1

Andrew : 실제로 인스턴스 변수 접두사를 전혀 사용하지 않는 많은 코코아 개발자가 있습니다. Smalltalk 세계에서도 매우 일반적입니다. (실제로 스몰 토크에서는 인스턴스 변수에 접두어를 사용하는 것이 거의 들리지 않습니다.)

인스턴스 변수의 접두어는 Java로 가져온 다음 C#으로 가져온 C++ - ism으로 항상 저를 강타했습니다. Objective-C 세계는 C++ 세계와 거의 평행했기 때문에 Java와 C# 세계가 후계자이기 때문에 다른 개발자들 사이에이 "문화적"차이점을 알 수 있습니다.

2

속성 소개와 함께 클래스 인스턴스 변수에 "_"접두어를 붙일 필요가 없습니다. 클래스 외부에서 액세스 할 변수에 속성을 통해 액세스하거나 클래스의 사용자 정의 메서드를 사용하여 값에 영향을주는 간단한 규칙 (헤더 파일에 설명되어 있음)을 설정할 수 있습니다. 이 말은 "_"이 붙어있는 이름보다 훨씬 깨끗합니다. 또한 값을 올바르게 캡슐화하여 변경 방법을 제어 할 수 있습니다.

3

귀하의 ivars에 밑줄 접두어를 사용할 수 있으며 여전히 귀하의 속성에 밑줄이 아닌 이름을 사용할 수 있습니다. 합성 접근을 위해, 단지 이렇게 :

@synthesize foo = _foo; 

이것은 the_foo 바르를 사용하여 foo는 속성을 합성하는 컴파일러를 알려줍니다.

사용자가 직접 접근자를 작성하는 경우 구현시 밑줄 ivar을 사용하고 비 언더 바 메서드 이름을 그대로 사용하십시오.

1

내 스타일은 발전소의 일에서 하이브리드 정말 취한 조치입니다 :

내가 "에서"와 기능/메소드의 매개 변수에 대한 자세한 내용은 "밖으로"이다 사용하는 가장 유용한 접두사. 이렇게하면 매개 변수가 한눈에 무엇인지 알 수 있고 실제로 메서드 매개 변수와 인스턴스 변수 간의 충돌을 방지하는 데 도움이됩니다. 매개 변수 "테이블"이 동일한 이름의 인스턴스 변수와 몇 번 충돌했는지 보았습니다. 예컨대 :

- (void)doSomethingWith:(id)inSomeObject error:(NSError **)outError; 
다음

내가 인스턴스 변수와 속성 이름을 맨손으로 이름을 사용 : 그럼 내가 사용

"은"지역 변수의 접두사로 : theTable, theURL 등다시 이것은 지역 변수와 인스턴스 변수를 구별하는 데 도움이됩니다.

다음 PowerPlant 스타일에 따라 몇 가지 다른 접두어를 사용합니다. 상수는 k, 열거 형은 E, 전역은 g, 정적은 s입니다.

저는 12 년 동안이 스타일을 사용해 왔습니다.

+0

k, E, g, s에 대해서는 확신하지 못했습니다.하지만 추가 및 삭제하는 아이디어가 마음에 들었습니다. –

8

저는 IBAutlets에도 밑줄을 사용한다는 것을 인정하지만 밑줄의 ivar 접두사와 관련하여 Chris Hanson의 조언을 따릅니다. 그러나 최근에 IBOutlet 선언을 행으로 이동하기 시작했습니다 (@mmalc's suggestion). 이점은 모든 내 ivars에 이제 밑줄이 있고 표준 KVC 설정자가 호출된다는 것입니다 (즉, setNameField:). 또한 콘센트 빌더에는 콘센트 이름에 밑줄이 없습니다.

@interface EmployeeWindowController : NSWindowController { 
@private 
    // model object this window is presenting 
    Employee *_employee; 

    // outlets connected to views in the window 
    NSTextField *_nameField; 
    NSTextField *_titleField; 
} 

- (id)initWithEmployee:(Employee *)employee; 

@property(readwrite, retain) Employee *employee; 
@property(nonatomic, retain) IBOutlet NSTextField *nameField; 
@property(nonatomic, retain) IBOutlet NSTextField *titleField; 

@end 
+1

이것은 실제로 IBOutlet에 대한 IB의 지원 덕분에 지금하고있는 일입니다. :) –

1

내가 인스턴스 변수에 밑줄 접두사를 사용하여 좋아하는 동안, 나는 때문에 모든 중복 @synthesize 라인 (아주 DRY 아니다) 작성 혐오. 이 작업을 돕고 코드 중복을 줄이기 위해 매크로를 만들었습니다. 따라서, 대신 :

@synthesize employee = _employee; 

나는이 쓰기 :

ddsynthesize(employee); 

그것은 오른쪽에 밑줄을 추가 토큰 붙여 넣기를 사용하여 간단한 매크로입니다 :

#define ddsynthesize(_X_) @synthesize _X_ = _##_X_ 

유일한 단점 Xcode의 리펙토링 도구를 혼란스럽게 할 것이며, 리팩토링으로 속성의 이름을 바꾸면 이름이 변경되지 않습니다.

1

여기에 언급 된 내용과 함께 핵심 가치 준수 준수 이름에 대한 코코아 문서를 읽으십시오. 엄격하게이 패턴을 따르면 장기적으로 크게 도움이 될 것입니다.

관련 문제