본문 바로가기
프로그래밍 놀이터/iOS

[Effective Objective-C] #24 카테고리를 사용해 클래스를 관리 가능한 다수의 조각으로 나누라

by 돼지왕 왕돼지 2017. 9. 7.
반응형

 [Effective Objective-C] #24 카테고리를 사용해 클래스를 관리 가능한 다수의 조각으로 나누라


출처 : Effective Objective-C

+, backtrace, Category, header import, naming convention, Private, private category, private 메서드 카테고리, self-documenting, [Effective Objective-C] #24 카테고리를 사용해 클래스를 관리 가능한 다수의 조각으로 나누라, 디버거 백트레이스, 디버깅, 분리, 심벌, 작은 조각, 카테고리, 클래스 기능 분리


-

클래스의 수많은 메서드를 파일 하나에 구현하면 비대해지기 쉽다.

오브젝티브-C 카테고리를 이용해 클래스를 매우 효과적인 논리 구성 단위들로 나눌 수 있다.

이렇게 하면 개발뿐 아니라 디버깅에도 도움이 된다.



-

@interface EOCPerson : NSObject


@property (nonatomic, copy, readonly) NSString *firstName;

@property (nonatomic, copy, readonly) NSString* lastName;

@property (nonatomic, strong, readonly) NSArray *friends;


- (id)initWithFirstName:(NSString*)firstName andLastName:(NSString*)lastName;


@end


@interface EOCPerson (Friendship)

- (void)addFriend:(EOCPerson*)person;

- (void)removeFriend:(EOCPerson*)person;

-(BOOL)isFriendsWith(EOCPerson*)person;

@end


@interface EOCPerson (Work)

- (void)performDaysWork;

- (void)takeVacationFromWork;

@end


@interface EOCPerson (Play)

- (void)goToTheCinema;

- (void)goToSportsGame;

@end


위와 같이 클래스 내의 관련 있는 메서드들끼리 모아 구분할 수 있다.

이 기능이 바로 카테고리(category)이다.


프로퍼티와 초기화 메서드 같은 클래스 필수 구현은 메인 부분에 정의되었다.

추가적인 메서드 집합은 관련된 것끼리 모아 카테고리로 나누었다.


여전히 인터페이스 파일 하나와 구현 파일 하나에 전체 클래스가 정의될 수 있다.

그러나 카테고리가 커지고 많아지면 단일 구현 파일은 쉽게 관리하기 어려운 상태가 된다.

그렇게 된다면 카테고리를 각각의 독립적인 파일로 단일 파일에서 분리하면 된다.


EOCPerson+Friendship (.h/.m)

EOCPerson+Work (.h/.m)

EOCPerson+Play (.h/.m)



-

거대한 파일 하나를 다수의 작은 코드 조각(카테고리)로 나누었을 때 주의해야 할 것이 있는데

카테고리의 메서드가 필요한 코드에서 반드시 EOCPerson.h 헤더 파일과 함께 카테고리의 헤더 파일도 포함(import) 해야 한다.

불편해 보일 수 있지만 작은 카테고리 파일들로 클래스를 나누면 관리하기 훨씬 쉬울 것이다.



-

크기가 크지 않은 클래스도 기능별로 카테고리로 나누면 유용할 수 있다.



-

클래스 하나를 여러 카테고리로 나누면 또 다른 유용한 점이 있는데 바로 디버깅이다.

카테고리 이름은 카테고리의 모든 메서드의 심벌로 추가된다.

예를 들어 addFriend: 메서드는 다음 심벌 이름을 가진다.

-[EOCPerson(Friendship) addFriend:]


디버거의 백트레이스에서 다음과 같이 보일 것이다.

frame #2: 0x0001c50 Test’ - [EOCPerson(Friendship) addFirned:]+ 32 at main.m:46


백트레이스에 있는 카테고리 이름은 메서드와 관련된 클래스의 기능 영역을 찾는 데 매우 유용하다.

특히 그 메서드가 private 일 때는 더 유용하다.



-

private 메서드들을 카테고리로 만들어 모아두면 유용하다.

그 카테고리 메서드는 보통은 외부에 노출되지 않고 클래스나 프레임워크 내부에서만 사용된다.

사용자가 그런 메서드를 찾는다면(아마도 백트레이스를 읽다가) private 이라는 이름을 보고 그 메서드를 직접 사용하면 안 된다는 사실을 쉽게 알 수 있을 것이다

어떤 면에서는 자체로 문서가 되는 (self-documenting) 메서드가 된다.



-

private 카테고리의 아이디어는 다른 개발자와 공유할 라이브러리를 만들 때도 도움이 된다.

때때로 일부 메서드는 퍼블릭 API 에 포함되어서는 안 된다.

그러나 라이브러리 내에서 유용하게 사용될 때가 있다.

이럴 때 Private 카테고리를 만드는 것은 좋은 선택이다.

카테고리의 헤더는 라이브러리 내 메서드가 사용되는 곳이라면 어느 곳이든지 포함될 수 있기 때문이다.

카테고리 헤더가 라이브러리 배포본으로 배포되지 않는다면, 라이브러리 사용자는 private 메서드의 존재를 알 방법이 없다.





기억할 점


카테고리를 사용해 클래스 구현 파일을 다수의 관리하기 좋은 조각으로 나누라.


private 이라는 카테고리를 만들어 private 메서드의 자세한 구현을 숨기라.




반응형

댓글