클래스는 언제 자체 getters/setters 대 멤버에 직접 액세스해야합니까?

StackOverflow https://stackoverflow.com/questions/586087

  •  06-09-2019
  •  | 
  •  

문제

Eclipse에서 세터와 getter를 생성 할 때 옵션 중 하나는 클래스 멤버에 직접 액세스하지 않고 클래스 내의 게터와 세터를 사용하는 것입니다. 이 수준의 클래스 내부 캡슐화가 유용합니까, 아니면 한 걸음 더 멀리 좋은 아이디어를 얻고 있습니까?

잘 속는 사람: 클래스 내에서 또는 클래스 외부에서 액세서 속성을 사용해야합니까?

도움이 되었습니까?

해결책

잠재적 인 부작용이 발생하기를 원한다면 좋은 생각이라고 생각합니다 - 검증, 로깅 등 (C#에서는 변수와 속성을 선언하고 변수에 대한 액세스는 속성을 통한 것입니다.)

때때로 당신은 당신이 변수를 직접 설정해야한다는 것을 알 수 있습니다. ~하지 않다 부작용을 원합니다. 예를 들어, 두 개의 변수를 함께 설정해야 할 수도 있고 "이전"과 "후"상태가 모두 유효하지만 속성을 개별적으로 설정하면 유효성 검사가 시작됩니다.

다른 팁

파생 클래스가 getters를 다시 정의하도록 허용하는 경우 유용 할 수 있습니다. 따라서 수업 내부에서도 Getters를 사용하면 디자인을 확장 할 수 있습니다.

제 생각에는 이것은 코딩 가이드 라인에 정의되어야하는 것입니다.

짧은 대답은 "그것은 의존한다"입니다. :)

Eric Lippert는 훌륭한 기사를 가지고 있습니다 자동 대 명시 적 특성 그것은 약간 다른 각도 에서도이 문제를 다룹니다.

본질적으로, 당신이 물어봐야 할 질문은 다음과 같습니다.

"학급 내에서,이 접근에 대한 원하는 의미는 ... 외부에서 속성에 접근하는 원하는 의미와는 다른 건물입니까?"

의미론이 동일하다면, 당신의 클래스는 자체 속성을 사용해야합니다. 의미론이 다른 경우, 수업은 후원장을 직접 조작해야합니다.

예를 들어 더러운 플래그를 설정하거나 관찰자에게 알리는 것과 같은 추가 작업을 수행하는 세터가있는 경우 유용합니다.

getters의 경우 필드에 액세스하는 대신 표현을 변경할 때 값을 계산할 수 있습니다.

클래스의 getter/setter 동작을 확장 해야하는 경우 캡슐화 된 필드 (직접 멤버 액세스 대신 getters/setter)가 유용합니다. 그러나 상속에서, 서브 클래스가 사적인 것들을 인식해서는 안된다면, 당신의 반의 이너들을 보존하는 것이 흥미 롭습니다. 따라서 때로는 필드가 클래스 구현에 비공개이므로 서브 클래스조차도 알지 못합니다.

나는 때때로 그렇게한다는 것을 알았습니다 - 특히, 필요할 때, 또는 내가 필요로 할 때, 또는 회원들의 주변에 대한 로그인 (그리고 그 주변의 검증)에 대한 로그인을 강하게 예상 할 수 있습니다.

개인/내부 속성을 갖는 것이 이러한 경우에 도움이된다는 것을 알게됩니다.

그러나 나는 확실히 Memeber를 위해 그것을하지 않습니다.

최신 .NET/vs는 속성을 다음과 같이 선언 할 수 있으므로 여기서 실제로 도움이됩니다.

public string SomeProperty
{
get;
set;
}

그리고 그것은 효과적으로 현장 뒤에 메모브를 만듭니다. 나는 그것이 당신에게 도움이되지 않는다는 것을 알고 있지만, 나는 그것이 관심이있을 것이라고 생각했습니다 :-)

이 멤버가 Winform 또는 WPF로 데이터를 데이터를 데이터에 표시 할 수 있으려면 재산으로 선언해야한다고 생각합니다. 나는 데이터 부드링에 속성 (getter/setting syntax)이 필요한 것보다 약 95 %의 긍정적입니다. 이것을 보여주는 작은 WPF 솔루션이 있지만 여기에 첨부하는 방법은 보이지 않습니다.

코드는 다음과 같습니다. WPF 프로젝트에는 기본 창 (창 1)과 테스트중인 객체 (DataObject)에 2 개의 항목이 있습니다 (DataObject) Window에는 데이터 객체 인스턴스의 이름 속성에 대한 데이터가있는 레이블이 있습니다. 이름 속성을 필드로 변환하는 경우 (Getter/Setter를 제거) 데이터베린딩은 작동이 중지됩니다.

Window1.xaml :

<Window x:Class="WpfDatabinding.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
    <Label Name ="Label1" Height="28" Margin="12,24,37,0" VerticalAlignment="Top" Content="{Binding Name}"></Label>
</Grid>

Window1.xaml.cs

using System;
using System.Windows;

namespace WpfDatabinding
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        private DataObject ADataObject;

        public Window1()
        {
            InitializeComponent();
            this.ADataObject = new DataObject();
            this.ADataObject.Name = "Hello!";
            this.DataContext = this.ADataObject;
        }
    }
}

namespace WpfDatabinding
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        private DataObject ADataObject;

        public Window1()
        {
            InitializeComponent();
            this.ADataObject = new DataObject();
            this.ADataObject.Name = "Hello!";
            this.DataContext = this.ADataObject;
        }
    }
}

dataObject.cs :

namespace WpfDatabinding
{
    public class DataObject
    {
        // convert this to a field, and databinding will stop working
        public string Name
        {
            get;
            set;
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top