문제

클래스 내부에 개인 필드가 있고 해당 필드를 공용 속성에 노출하는 경우 클래스 내부에서 어떤 필드를 사용해야 합니까?

아래에는 제가 알아내려고 하는 내용에 대한 예가 있습니다.Private Field _Counter 또는 Property Counter를 조작해야 합니까?

공개 수업 테스트

Private _Counter As Integer

Public Property Counter() As Integer
    Get
        Return _Counter
    End Get
    Set(ByVal value As Integer)
        _Counter = value
    End Set
End Property

Private Sub Dosomething()

    'What is the best practice?
    'Direct access to private field or property?

    'On SET
    _Counter += 1
    'OR
    Me.Counter += 1

    'On Get
    Console.WriteLine(_Counter)
    Console.WriteLine(Me.Counter)

End Sub

수업 종료

도움을 주셔서 미리 감사드립니다.에듀

도움이 되었습니까?

해결책

내 생각에, 내부적으로 공개 액세서를 사용하는 것은 과도한 캡슐화입니다. 코드가 흐려집니다. 이러한 접근 방식을 사용하면 더 복잡한 논리를 포함 할 수있는 액세서를 호출하므로 작업 코드를 분석하기가 더 어렵습니다.

내 프로그래밍 경험에서, 나는 그것이 많은 도움이 될 상황이 거의 없었습니다. 대신, 나는 필드를 직접 접근하는 것을 선호하며, 실제로 필요한 경우에만 사적인 공개 액세서 및 기타 기능 모두에서 사용할 수있는 액세서. 이론적 근거는 공개 액세서에 특별한 논리를 첨부해야한다면 논리가 내부 액세스에 대해 동일하지 않을 가능성이 있다는 것입니다.

또한 대부분의 최신 IDE (Eclipse와 같은)는 개인 필드에 대한 모든 참조를 즉시 확인하고 직접 액세스 대신 함수를 사용하도록 코드를 리팩토링 할 수 있습니다.

다른 팁

IMO 당신은 사용해야합니다 부동산 액세서 언제든지 가능할 때. 이것은 당신이 어떤 것에 대해 걱정할 필요가 없기 때문입니다. 내부 논리 부동산이있을 때 사용할 수 있습니다.

이런 일이 어디에서 발생하는지의 좋은 예는 LINQ DataContext의 코드에 있습니다.

이것 좀 봐...

[Column(Storage="_ReviewType", DbType="TinyInt NOT NULL")]
public byte ReviewType
{
    get
    {
        return this._ReviewType;
    }
    set
    {
        if ((this._ReviewType != value))
        {
            this.OnReviewTypeChanging(value);
            this.SendPropertyChanging();
            this._ReviewType = value;
            this.SendPropertyChanged("ReviewType");
            this.OnReviewTypeChanged();
        }
    }
}

'세터'에있는 모든 논리를 주목하십니까?

그렇기 때문에 필드 인 IMO 대신 속성을 호출하는 연습을 시작하는 것이 중요합니다.

답과 제안에 감사드립니다.

여기서 모든 제안을 고려한 후 다른 연구를 고려한 후 개인 분야 대 평가자에 대한이 상황이 개인적인 선택에 더 가깝다는 인상입니다. 따라서 기본적으로 가장 중요한 것은 당신이 무엇을 선택하든 일관성이 있다는 것입니다.

그것은 말했다; 내 개인적인 규칙은 이것에 기대고 있습니다.

  1. 개인 필드에 직접 액세스하십시오.

  2. 액세서리에 액세스하는 경우 키워드를 사용하십시오. 가독성을 향상시키기 위해

  3. 액세서는 개인 액세스에도 적용되는 중요한 논리 논리를 구현하는 경우에만 사용하십시오. 이렇게하면 액세서를 사용하는 경우 "다른 것"이 있기 때문입니다.

  4. 보호 된 필드를 사용하지 마십시오. 파생 클래스는 항상 액세서를 사용해야하며 필드에 직접 접근하지 않아야합니다.

당신이 무슨 생각을하는지 제게 알려주세요.

사이드 노트 :

그 후 나는 우리가 클래스 레벨 필드에 대한 새로운 범위를 놓치고 있다고 생각합니다. 이 필드가 Getter/Setter에서만 액세스 할 수있는 "제한"과 같은 키워드. 이렇게하면 항상 개인 필드에 직접 액세스 할 수 있지만, 특정 필드에 특정 필드에 액세서리를 액세스 할 수 있는지 확인 해야하는 경우 개인을 제한된 것으로 변경합니다. ( "제한된, 제한된 읽기 및 제한적 저하"는 어떻습니까?)

가능할 때마다 속성을 사용하는 것이 좋습니다. 이를 통해 향후 유연성을 제공하여 속성이 반환/세트를 수정하지 않고 개인 변수를 사용하는 모든 위치를 찾을 수 없습니다.

세터에서 구체적으로 무언가를하지 않기 때문에 개인 필드를 사용하십시오.

또한 속성 세터를 제거하는 것이 좋습니다. 이런 식으로 카운터 상태를 주어진 방법 Dosomething ()에 의해 설정하도록합니다.

상황에 따라, 클래스에서 필드의 직접 수정을 개인적으로 또는 또는 또는 시맨틱을 수정과 관련시키는 일부 방법을 통해 허용하는 것이 바람직 할 수 있습니다. 이런 식으로 특정 방식으로 만 수정되었음을 확신 할 수 있기 때문에이 클래스와 그 특정 값에 대해 추론하기가 더 쉬워집니다. 더욱이, 어느 시점에서, 증분 및 INT와 같은 조치는 추가로 필요한 결과를 가져올 수 있으며,이 시점에서 방법을 통해 접근을 노출시키는 것이 더 합리적 일 수있다.

언제나 코드가 우회하지 않음을 알면서 나중에 getter 또는 setter에 논리를 추가 할 경우 안전하기 때문에 SAFE가 있기 때문에 Property Accessor를 사용하십시오.

필드로 직접 이동할 때 속성 접근자를 호출하는 데 따른 성능 오버헤드가 걱정된다면 그렇게 하지 마세요.대부분의 컴파일러는 이러한 종류의 작업을 인라인하여 사실상 동일한 성능을 제공합니다.적어도 나노초의 추가 시간이 필요할 가능성은 거의 없습니다. ~할 것 같다 현장에 직접 가서 이득을 얻습니다.

a) 모든 코드에서 매우 일관성을 유지하여 유지 관리가 더 용이하고 b) 여기에서 다른 사람들이 지적한 이점을 얻을 수 있기 때문에 속성 접근자를 고수하는 것이 좋습니다.

또한 저는 보통 Me. (또는 this.) 키워드. 범위 문제가 있는 경우는 제외됩니다(식별자를 신중하게 선택하여 문제를 방지하려고 노력함).내 함수와 하위 항목이 너무 길어서 로컬(스택 기반) 변수로 작업하는지 아니면 클래스 멤버로 작업하는지 확실하지 않기 때문에 혼동하지 않습니다.쉽게 말할 수 없을 정도로 길어지면 리팩토링합니다.

원래 포스터가 정확히 정확합니다.

1) 개인 필드에 직접 액세스하십시오.

  • 리팩토링이 더 쉬워집니다.

2) 액세서에 액세스하는 경우 키워드를 사용하십시오. 가독성을 향상시키기 위해

  • 명시 적으로 나열된 범위는 독자의 생각이 적습니다

3) 액세서가 개인 액세스에도 적용되는 중요한 논리 논리를 구현하는 경우에만 사용하십시오. 이런 식으로 당신은 액세서를 사용하고 있다면“다른 무언가가 있기 때문”이라는 것을 알고 있습니다.

  • 이것이 규칙 #1을 위반하는 유일한 이유입니다.

4) 보호 된 필드 사용을 피하십시오. 파생 클래스는 항상 액세서를 사용해야하며 필드에 직접 접근하지 않아야합니다.

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