권장 26: 액세스 방법은 양호한 클래스 인터페이스의 필수 구성 부분이다

3492 단어
액세스 방법(또는 간단하게 "액세스 장치"라고 부른다)은 실례 변수의 값을 가져오거나 설정하는 것을 책임진다.그들은 양호한 클래스 인터페이스를 설계하는 필수적인 구성 부분으로 대상 속성으로 통하는 문턱에 해당하며 대상 속성의 접근 채널을 제공하고 대상 실례 데이터에 대한 봉인을 강제한다.
명명 규범의 원인도 있고 이런 명명 규범으로 인해 클래스는 키 값 인코딩의 약정을 따를 수 있기 때문에 접근 방법은 반드시 지정된 형식으로 명명해야 한다.실례 변수 값을 되돌려주는 방법(때로는 Getter라고도 부른다)은 실례 변수 이름을 간단하게 사용한다.실례 변수에 대한 가치 설정 방법(setter라고도 부른다)에 대해 그 이름은'set'으로 시작하고 그 뒤에는 실례 변수의 이름(자모 대문자)이 뒤따른다.예를 들어, "color"라는 인스턴스 변수가 있으면 Getter 및 setter 메서드의 선언은 다음과 같습니다.
- (NSColor *)color;
- (void)setColor :(UIColor *)aColor;

만약 실례 변수의 형식이 C의 수치 형식, 예를 들어 int나float라면 접근 방법의 실현은 매우 간단할 것이다.아래와 같다
- (float)currentRate {
       return currentRate;
}
- (void)setCurrentRate:(float)newRate {
   currentRate = newRate;
}

만약 실례 변수가 대상을 보존한다면 상황은 약간의 차이가 있을 것이다.실례 변수이기 때문에 이 대상들은 오래 지속되어야 하기 때문에 값을 부여할 때 창설, 복사, 유지를 해야 합니다.setter 방법은 실례 변수의 값을 바꿀 때 지속성을 확보해야 할 뿐만 아니라 원래의 값도 정확하게 처리해야 한다. Getter 방법은 실례 변수의 값을 요청한 대상에게 전달하는 것이다.
두 가지 액세스 방법의 작업은 메모리 관리에 있어 코코아 대상 소유권 정책에서 유래한 두 가지 은밀한 가정이 있다.
방법 (예: Getter 접근 방법) 이 되돌아오는 대상은 이 방법을 호출하는 대상의 역할 영역에서 정상입니다.다시 말하면 대상이 이 작용 영역 내에서 방출되거나 수정되지 않도록 해야 한다.
호출 대상이 어떤 방법 (예: 접근 방법) 에서 대상을 받았을 때, 이전에 표시된 것을 유지하거나 복제하지 않는 한 방출해서는 안 된다.이 두 가지 가정을 기억하고, NSString이라는 실례 변수의 Getter와setter 접근 방법의 두 가지 가능성을 살펴봅시다.
- (NSString *)title {
      return title;
}
- (void) setTitle:(NSString *)newTitle{
     if (title != newTitle){
            [title autorelease];
            title = [newTitle copy];
     } 
}

Getter 방법은 실례 변수의 인용을 간단하게 되돌려주는 것일 뿐입니다.그에 비해 setter 방법은 좀 더 바쁘다. 전송 값이 현재 값과 다르다는 것을 확인한 후, 자동으로 현재 값을 방출하고, 새로운 값을 실례 변수에 복사한다. (대상에게 autorelease 메시지를 보내는 것이 release 메시지를 보내는 것보다 안전하다.)그러나 이런 방식은 여전히 잠재적인 위험이 있다. 만약 고객이 Getter로 되돌아오는 대상을 사용하고 있는 동시에 setter 방법으로 오래된 NSString 대상을 자동으로 방출하고 그 대상이 이후에 곧 방출되고 소각된다면 어떤 결과가 나올까?고객이 실례 변수에 대한 인용은 더 이상 정당하지 않을 것이다.
다음 코드는 Getter 방법에서 실례 변수의 값을 유지하고 자동으로 방출함으로써 이 문제를 해결합니다. 코드는 다음과 같습니다.
- (NSString *)title {
       return [[title retain] autorelease];
}
- (void)setTitle:(NSString *)newTitle{
      if (title != newTitle){
             [title release];
             title = [newTitle copy];
      }
}

위의 두 가지 setter 방법의 실현에서 새로운 NSS 타일 당신의 실례 변수는 복제를 통해 얻을 수 있는 것이지 유지를 통해 얻을 수 있는 것이 아니다.왜 유지하는 방식을 사용하는 것이 불편합니까?일반적인 규칙은 값을 부여하는 실례 변수의 대상이 하나의 값 대상일 때, 즉 이 대상이 문자열, 날짜, 숫자 또는 조합 기록 같은 생각을 대표할 때 복제해야 한다는 것이다.관심 있는 것은 이 속성의 값을 보존하는 것입니다. 그 값이 잠재적인 프로그램에 의해 수정되기를 원하지 않습니다.다시 말하면 자신이 이 대상의 복제를 갖고 싶다는 것이다.그러나 NSView 또는 NSWindow 객체와 같은 솔리드 객체를 저장하고 액세스하는 경우에는 유지되어야 합니다.실체 대상의 집합도가 높고 관계가 더욱 복잡하며 복제하면 비용이 더 많이 든다.하나의 대상이 값 대상인지 실체 대상인지 확인하는 방법 중 하나는 관심 대상의 값인지 대상의 자체인지 파악하는 것이다.객체의 값에 관심이 있는 경우 해당 객체는 값 객체일 수 있습니다.복제해야 합니다. 물론입니다. (우리는 이 대상이 NSCopying 프로토콜을 따른다고 가정합니다.)
setter 방법에서 실례 대상을 유지해야 하는지 복제해야 하는지를 확인하는 또 다른 방법은 실례 변수가 속성인지 관계인지 확인하는 것이다.이것은 응용 프로그램 데이터를 나타내는 모델 대상에 있어서 특히 정확하다.속성과 값 대상은 기본적으로 같다.이것은 자신이 봉인된 대상의 정의 특징, 예를 들어 대상의 색깔이나 제목을 나타낸다.다른 한편, 관계는 단지 대상 자체와 한 개 이상의 다른 대상 간의 관계를 가리킨다.일반적으로 setter 방법에서는 속성을 복제하고 관계를 유지한다.그러나 관계에는 하나의 기수가 있는데, 일대일일 수도 있고, 일대일 수도 있다.한 쌍의 많은 대상은 일반적으로 기하학적 대상으로 나타난다. 예를 들어 NSArray나 NSSet의 실례는 setter 방법에서 더 많은 작업을 해야 할 수도 있다.단순한 실례 대상을 유지하는 것이 아니라
포인트 ######
(1) 접근 방법은 대상 속성으로 통하는 문턱으로 대상 속성의 접근 채널을 제공하고 대상 실례 데이터에 대한 봉인을 강제하여 실례 데이터가 파괴되는 것을 방지한다.(2) 방법이 되돌아오는 대상은 대상이 이 작용역에서 방출되거나 수정되지 않도록 해야 한다.(3) 호출 대상이 어떤 방법(예를 들어 접근 방법)에서 대상을 받았을 때 이전에 표시된 것을 유지하지 않는 한 정렬해서 방출해서는 안 된다.(또는 복사)

좋은 웹페이지 즐겨찾기