문제

예를 들어, 메소드 정의 내에서 액세서와 뮤티터를 사용하거나 데이터에 직접 액세스합니까? 때때로, 항상 또는 로마에있을 때?

도움이 되었습니까?

해결책

클래스 내부에서도 항상 액세서를 사용하려고 노력하십시오. 공개 인터페이스를 통해서가 아니라 State에 직접 액세스하려는 유일한 시간은 어떤 이유로 든 액세서 방법에 포함 된 검증 또는 기타 논리를 우회 해야하는 경우입니다.

이제 당신이 당신이 하다 해당 논리를 우회해야합니다. 물러서서 디자인의 결함이 배신되는지 여부를 스스로에게 물어봐야합니다.

편집하다: 읽다 자동 대 명시 적 특성 에릭 립퍼트 (Eric Lippert)에 의해 그는이 문제를 탐구하고 사물을 매우 명확하게 설명합니다. C#에 관한 것이지만 구체적으로 OOP 이론은 보편적이고 견고합니다.

여기에 발췌가 있습니다.

자동으로 구현 된 속성에서 명시 적으로 구현 된 부동산으로의 변경에 동기를 부여한 이유가 부동산의 의미론을 변경하기 때문에 클래스 내에서 부동산에 액세스 할 때 원하는 시맨틱이 액세스 할 때 원하는 의미와 동일하거나 다른지 여부를 평가해야합니다. 클래스 외부의 재산.

해당 조사 결과가 "클래스 내에서,이 속성에 접근하는 원하는 의미는 외부에서 속성에 액세스하는 원하는 의미와 다릅니다"라면 편집이 버그를 소개했습니다. 버그를 수정해야합니다. 그들이 동일하다면, 당신의 편집은 버그를 소개하지 않았습니다. 구현을 동일하게 유지하십시오.

다른 팁

일반적으로, 나는 접근자/뮤지터를 선호합니다. 이렇게하면 클래스의 내부 구현을 변경할 수 있으며 클래스는 외부 사용자 (또는 내가 깨고 싶지 않은 기존 코드)로 동일한 방식으로 기능합니다.

액세서는 속성 특정 논리를 추가 할 수 있도록 설계되었습니다. 와 같은

int Degrees
{
    set
    {
        _degrees = value % 360;
    }
}

따라서, 당신은 항상 getter와 setter를 통해 해당 필드에 액세스하고 싶을 것입니다. 그리고 그 방식으로, 당신은 항상 값이 360보다 크지 않을 것이라고 확신 할 수 있습니다.

Andrew가 언급했듯이 검증을 건너 뛰어야한다면 기능 설계 또는 검증 설계에 결함이있을 수 있습니다.

액세서와 돌연변이터는 데이터의 일관성을 보장하도록 설계되었으므로 클래스 내에서도 검증되지 않은 데이터를 해당 필드에 주입 할 수있는 방법이 없도록 항상 노력해야합니다.

편집하다

이 질문도 참조하십시오.OO 디자인 : 내부적으로 공개 속성 또는 개인 분야를 사용하십니까?

나는 외부 세계와 공유하는 경향이 없으므로 수업의 '내부'를 공유하는 경향이 있으므로 데이터에 대한 내부 요구 (개인 메소드 제품)는 공개 인터페이스와 같은 종류의 작업을 수행하지 않는 경향이 있습니다.

개인 방법이 전화 할 액세서/뮤토터를 작성하는 것은 드문 일이지만, 나는 여기서 소수에 속한다고 생각합니다. 아마도 난 ~해야 한다 더 많은 일을하지만 나는 경향이 없습니다.

어쨌든, 그것은 내 [녹청은 2 센트입니다.

나는 종종 개인 자동 속성으로 시작한 다음 필요한 경우 리팩터로 시작합니다. 후원 필드가있는 속성에 리팩터를 리팩터링 한 다음 뒷이야기 필드를 "실제"상점, 예를 들어 ASP.NET 응용 프로그램의 예를 들어 뷰 스테이트로 바꾸십시오.

에서:

    private int[] Property { get; set; }

에게

    private int[] _property;
    private int[] Property
    {
        get { return _property; }
        set { _property = value; }
    }

에게

    private int[] _property;
    private int[] Property
    {
        get
        {
            if (_property == null)
            {
                _property = new int[8];
            }
            return _property;
        }
        set { _property = value; }
    }

에게

    private int[] Property
    {
        get
        {
            if (ViewState["PropertyKey"] == null)
            {
                ViewState["PropertyKey"] = new int[8];
            }
            return (int[]) ViewState["PropertyKey"];
        }
        set { ViewState["PropertyKey"] = value; }
    }

물론, 나는 Resharper를 사용하므로 게시하는 것보다 시간이 줄어 듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top