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

[Effective Objective-C] #38 많이 사용하는 블록 타입은 typedef 를 이용해 타입을 생성하라

by 돼지왕 왕돼지 2017. 10. 2.
반응형

 [Effective Objective-C] #38 많이 사용하는 블록 타입은 typedef 를 이용해 타입을 생성하라


출처 : Effective Objective-C

Alias, API, block type, IDE, inherent, naming convention, prefix, refactoring, type definition, typedef, [Effective Objective-C] #38 많이 사용하는 블록 타입은 typedef 를 이용해 타입을 생성하라, 가독성, 내재 타입, 리펙터링, 변수 이름, 별명, 블록, 블록 변수 정의, 블록 타입 숨기기, 시그너처, 타입 생성, 타입 정의


-

블록은 내재 타입(inherent)이다.

블록은 적절한 타입의 변수에 할당될 수 있다.



-

블록의 타입은 다음과 같이 생겼다.

return_type (^block_name) (paramters)


블록 변수(block-variable) 정의는 변수 이름을 맨 오른쪽에 두는 다른 타입들과 달리 변수 이름을 가운데 둔다.

이로 인해 블록 타입 정의 문법을 기억하고 읽기가 매우 어려워진다.

그렇기 때문에 자주 사용되는 블록 타입을 위한 타입 정의를 만드는 것은 좋은 생각이다.

특히 다른 사람들이 사용하는 API 일 때 유용하다.

이와 같이 이름 뒤에 블록 타입을 숨겨 코드 가독성과 블록이 하는 일을 쉽게 파악할 수 있게 한다.



-

C 의 기능인 타입 정의 (type definition)를 이용해 복잡한 블록 타입을 숨길 수 있다.

typedef 키워드를 이용해 특정 타입에 읽기 쉬운 별명(alias)을 붙일 수 있다.

typedef int (^EOCSomeBlock) (BOOL flag, int value);


가운데 있는 ^ 으로 시작하는 블록 변수 이름이 바로 새로운 타입 이름이다.

이는 시스템에 EOCSomeBlock 이라는 새로운 타입을 추가한다.

이제 복잡한 타입으로 변수를 생성하는 대신 이 새로운 타입을 이용해 간단히 변수를 생성할 수 있다.

EOCSomeBlock block = ^(BOOL flag, int value){

     // 구현

};



-

typedef 를 통해 타입 정의를 하면 읽기 쉬워지고, 어떤 파라미터가 있는지 간단히 이해할 수 있게 된다.

괜찮은 최신 IDE 는 이를 더 사용하기 쉽게 하기 위해 자동으로 타입 정의를 확장해준다.

타입 정의를 사용하면 블록 타입 시그너처를 변경하는 리펙터링을 할 때도 유용하다.

파라미터를 추가로 받도록 변경할 때 간단히 타입 정의만 수정하면 된다.



-

타입 정의는 그것을 사용하는 클래스에 정의하는 것이 일반적으로 가장 좋다.

타입 정의를 사용하는 클래스에 새로운 타입의 이름을 접두어로 붙이는 데 신중해지기 때문이다.

이는 블록 사용을 명확하게 만든다.

다수의 타입 정의가 동일한 블록 시그너처 타입으로 생성되면 어떻게 될까?

문제 없다.

타입은 적은 것보다 많은 것이 좋다.



-

시그너처가 가진 타입 이름과 파라미터 이름 같은 정보로 개발자는 이 타입이 어떻게 사용되는지 쉽게 파악할 수 있다.




기억할 점


-

타입 정의를 사용해 블록 변수를 쉽게 사용할 수 있게 만들라.


-

새로운 타입을 만들 때 다른 타입의 이름과 겹치지 않게 하기 위해 이름 짓기 규칙을 따르라.


-

블록 시그너처가 같은 타입 여러 개를 정의하는 것을 두려워하지 말라.

블록 시그너처를 한 군데만 변경해서 특정 블록 타입을 전부 리팩터링할 수 있길 원할 것이다.





반응형

댓글