2014-01-16 2 views
1

빠른 질문 :속성 또는 속성이 아닌가요? 의미에 대한

내가 선호하는 프로토콜을 쓰는 경우 :

// (a) 
@protocol MyProtocol 

@property (nonatomic, copy) NSSet *things; 

@end 

대는

// (b) 
@protocol MyProtocol 

- (NSSet *)things; 
- (void)setThings:(NSSet *)things; 

@end 

(a)는 청소기 코드이지만 의미를 가지 구현 클래스는 things을위한 ivar를 가질 것이고 이것은 나의 프로젝트에서는 그렇지 않다. 내 유스 케이스 때문에 things도 KVO가 될 수 없습니다. 또한 구현 클래스가 copythings이 될 것임을 암시합니다. 모든 경우에 해당하지 않습니다.

(b)는 더 정확한 코드입니다 (KVO를 할 수 있는지/할 수 없는지에 대해 매우 명시 적입니다.)하지만 조금 복잡합니다.

의견이 있으십니까?

+0

(b) "messier"는 어떻습니까? – rmaddy

+1

변형 a에는 copy 속성이 있습니다. getter 및 setter 메서드로 간단히 처리하는 것이 더 간단하지 않습니까? –

+0

구현에서 모든 것을 복사한다고 가정 했으므로 구현에 따라 완전히 다른 방식으로 저장하고 표시 할 수 있습니다. – deanWombourne

답변

0

프로토콜은 메시징 계약 [1]을 정의합니다. 데이터를 저장하기위한 것이 아닙니다. Apple 문서에 따르면 클래스 확장에 속성을 추가하기로되어 있습니다 (카테고리에 속성을 추가 할 수 있지만 컴파일러는 ivar을 합성하지 않습니다) [2]. 당신은 내가 Objective-C 언어의 문서화 된 사용과 일치하도록 다음 두 가지 방법 중 하나를 사용하는 것이 무엇을하려고에 따라 :

  1. 당신은 (클래스의 소스 코드가있는 경우 당신이 만든 하나) 다음 클래스 확장을 사용합니다.

  2. 소스 코드 하위 클래스가없는 경우 개체.당신이 정말로 그것을 다른 방법으로 사용 옵션 (B)를 수행해야하는 경우

말했다되고. 그것은 더 핵심이고 더 정확한 클리너 코드입니다!

다른 문제가있는 question입니다.

행운을 빕니다

3

나는 (a) 아마도 프로토콜에 적합하지 않지만 비 프로토콜 인터페이스에 가장 적합하다고 대답하고 있습니다.

나는 @property으로 갈 것입니다. 프로퍼티가 구현되는 방법은 구현 세부 사항이며 외부에서는 고려하지 않습니다.

속성 만있는 v1 구현을 고려하십시오. v2에서는 내부가 변경되고 setter 또는 getter가 메서드로 변경됩니다. 완전히 합리적이며, 속성이 좋고, 변경을 허용하는 이유 중 하나는 구현 세부 사항을 숨기는 것입니다.

다음 버전에서는 메서드를 제거하고 속성으로 바꿀 필요가있는 반대 개념을 고려하십시오. 첫 번째 인스턴스의 속성이 매우 잘 구현된다는 구현 세부 사항에 대해서도 설명합니다.

마지막으로이 경우에는 메서드 구현시 변경 될 수있는 개체가 처리되는 방식에 대한 명시적인 정보를 제공하는 copy 특성이 있습니다.

+0

당신은 속성과 함께 도트 구문을 사용하게됩니다. – ansible

+2

@otible 도트 표기법도 메소드와 함께 사용할 수 있습니다. 올바른 형식이 아니며 자동 완성 기능이 제대로 작동하지 않습니다. 당신은'NSMutableString.alloc.init'을 할 수 있습니다. – zaph

+0

'copy'와 같은 구현 세부 사항을 정의하는 것이 프로토콜의 일이 아닌가요? 나는 복사본을 옵션 (a)에 대한 부정적인 점으로 생각합니다! 내 애플 리케이션에서,이 구현의 일부 구현 _''dots'. – deanWombourne

0

'a'가 잘못되었다고 생각합니다. 프로토콜을 채택한 클래스 MyProtocol은 비 원자 및 규칙의 규칙을 따르지 않습니다.

내게는 프로토콜 내부에 속성을 추가하는 것이 매우 이상합니다. 그것은 객체 지향 프로그래밍의 패러다임에 반대하고 있습니다. 대표자는 정보를 제공하지 않고 행동을 취합니다.

그래서 'a'와 'b'사례는 사용하지 말고 다시 프로그래밍 아키텍처에 대해 생각해보십시오.

+0

좋은 점 WRT 프로토콜 - 질문했습니다. – zaph

관련 문제