문제

나는 많은 예제 코드는 C#는 클래스가 이:

public class Point {
    public int x { get; set; }
    public int y { get; set; }
}

또는,오래된 코드와 동일한 명시적 전용 백업 값없이 새로운 자동차-구현 속성:

public class Point {
    private int _x;
    private int _y;

    public int x {
        get { return _x; }
        set { _x = value; }
    }

    public int y {
        get { return _y; }
        set { _y = value; }
    }
}

나의 질문는 이유입니다.어떤 사고 위하고 그냥을 만드는 이러한 회원은 공공 분야,아래와 같은?

public class Point {
    public int x;
    public int y;
}

명게,나의 가치를 이해 구현해야 할 때는 일부의 번역본이다.하지만 경우에 당신은 그냥 통과 값을 통해,그것은 보인다 불필요한 자세한 정보를 표시합니다.

도움이 되었습니까?

해결책

나도 동의하는 경향이있(는 것은 불필요하게 자세한 정보),지만 이제가 되고 있는 우리의 팀이지 않은 아직 해결되었고 그래서 우리의 코딩 표준히 주장에서 자세한 정보의 속성에 대한 모든 클래스입니다.

제프우드 처리 이 몇 년 전입니다.가장 중요한 포인트는 소급하다는 것이다 주목 변경에서 필드 호텔 주요 변경 코드에서;아무것도 소비하는것으로 다시 컴파일해야 합니다 새로운 인터페이스 클래스,그렇다면 아무것도의 나머지 부분에서는 소모 클래스에 문제가 있을 수 있습니다.

다른 팁

그것은 또한 훨씬 더 간단한 변경 이후:

public int x { get; private set; }

그것은 캡슐화 설정에 액세스하는 사람들의 멤버입니다.면에서 약간의 시간이 이제는 개발자를 위한 코드를 변경해야 논리 회원에 액세스하거나 설정을 할 수 있을 변경하지 않고 이 계약의 클래스입니다.

아이디어를 하는 경우에 기초 데이터 구조를 변경할 필요가 공용 인터페이스 클래스가 없이 변경 될 수 있습니다.

C#을 치료할 수 있습 속성과 변수를 다르게 시간에.예를 들어,당신은 당신 전달할 수 없 속성으로 심판 또는 매개변수.그래서 필요하신 경우에는 변경 데이터 구조에 대한 몇 가지 이유가 당신을 사용하여 공개 변수 그리고 지금은 당신을 사용해야 특성,인터페이스를 변경해야고 지금은 코드에 액세스하는 시설 x 되지 않을 수 있는 더 이상 컴파일했던 것처럼 되었을 때 변 x:

Point pt = new Point();
if(Int32.TryParse(userInput, out pt.x))
{
     Console.WriteLine("x = {0}", pt.x);
     Console.WriteLine("x must be a public variable! Otherwise, this won't compile.");
}

속성을 사용하여 시작부터 피하고,느낄 수 있는 무료 조정할 근본적인 구현에 필요한 만큼의 용량을 파괴하지 않고 클라이언트 코드입니다.

세터 및 게터를 추가할 수 있습니다 추가적인 추상화 계층과 순수한 OOP 당신은 항상 객체에 액세스 인터페이스를 통해 그들이 제공하는 외부 세계...

이 코드를 저장합니다 당신 asp.net 는 이용하지 않는다는 것은 거의 불가능 합의 수준을 추상화에서 제공하 setter 및 getters:

class SomeControl
{

private string _SomeProperty  ;
public string SomeProperty 
{
  if ( _SomeProperty == null ) 
   return (string)Session [ "SomeProperty" ] ;
 else 
   return _SomeProperty ; 
}
}

이후 자동차 구현 getters 동일한 이름에 대한 속성과 실제적인 저장소 변수입니다.어떻게 당신이 그것을 변경하에서 미래?내가 생각하는 지점 말은 사용하는 자동 구현하는 대신 필드를 변경할 수 있도록 그것은 미래에는 경우에 필요하신 경우에는 추가 논리를 getter 및 setter.

예를 들어:

public string x { get; set; }

고 예를 들어,당신은 이미 x 를 사용하여 시간을 많이 그리고 당신은 원하지 않는다 당신의 코드입니다.

당신은 어떻게 변화 자동 getter setter...예를 들어에 대한 세터만 허용 설정은 유효한 전화 번호 형식...당신은 어떻게 변경도록 코드만 등을 변경합니까?

내 아이디어는 새로 추가 개인 변수를 추가 동일한 x getter 및 setter.

private string _x;

public string x { 
    get {return x}; 
    set {
        if (Datetime.TryParse(value)) {
            _x = value;
        }
    }; 
}

이것이 무슨 뜻으로써 유연한가?

또한 것으로 간주의 영향이 변화하는 공공 구성원 올 때 바인딩 및 serialization.이들 모두는 종종에 의존하고 공공성을 검색과 설정 값이다.

또한,당신은 당신을 넣을 수 있습점에서 구현,하지만 당신은 할 수 없습에서는 필드가 있습니다.

AFAIK 생성된 CIL 인터페이스는 다릅니다.를 변경하는 경우에는 공공 구성원을 속성을 변경하는것은 공공 인터페이스를 재 구축 할 필요가 있는 모든 파일을 사용하는 클래스입니다.이것은 필요하지 않는 경우에만 변화의 실현.

어쩌면 그냥을 만드는 필드에 공개할 수 있습에 당신을 이끌고 더 빈혈 도메인 모델.

종류 감사

그것은 또한 주목할 만들 수 없다는 자동 속성을 읽기 전용할 수 없습니다 초기화 그들에게 인라인 요소입니다.이 두 가지 일을 하고 싶에 표시의.순,그러나 나는 할 수 있다고 생각지 않습니다.NET4.0.

만 시간 사용 백업 분야 특성을 가진 이러한 일이있는 경우 클래스를 구현하 INotifyPropertyChanged 고 불 OnPropertyChanged 이벤트는 경우는 변경되었습니다.

또한 이러한 상황에서 나는 설정 백업 필드를 직접 경우 값을 전달에서부터 생성자를(필요가 없을 시도하고 화재 OnPropertyChangedEvent(는 것 NULL 이 시간에)어쨌든,다른 곳 내가 사용하는 속성 자체.

당신이 알고하지 않는 경우가 필요하지 않을 수도 있습 몇 번역의 데이터는 나중에.당신을 위해 준비하는 경우에 당신은 멀리 숨어서 회원에게 있습니다.사용자에게 등이 추가하면 번역 때문에 인터페이스를 동일하게 유지됩니다.

가장 큰 difrence 는 경우에,당신 변경,내부 구조를 유지할 수 있습니다 아직도 구현으로는 변화,자신의 내부의 논리를 아프게 하지 않고 사용자의 API 를 사용합니다.

을 변경해야 하는 경우에는 어떻게 x 및 y 이 경우에,당신은 추가 할 수 있습 속성이다.이것은 내가 대부분을 찾을 혼란스럽습니다.사용하는 경우에는 공공 구성원 변수,쉽게 변경할 수 있는 재산을 나중에 사용하고,개인 변수라는 _x 및 _y 해야 하는 경우 값을 저장하기 위해 내부적으로 합니다.

Setter 및 getters 은 나쁜 원칙적으로(그들은 나쁜 OO 냄새-나의 짧은 멈추지 말은 그들이 안티-패턴이 있기 때문에 그들은 정말 필요한 때).

아니,거기에 기술적으로 차이가 없을 때 내가 정말 원하는 대한 액세스를 공유하는 개체는 요즘,나는 때때로 공개한 최종를 추가하는 대신 getter.

방법 setter 및 getters 던"판매되는"당신이 알아야 할 수도 있습니다 누군가가 받고하거나 값을 변경하는 것--는 의미와 프리미티브입니다.

시설백체 DAOs,dto 로 표시체에서 제외되는 이 규칙 때문에 이러한지 않는 객체에서 진정한"OO 디자인"단어의 의미를 개체입니다.(당신이 생각하지 않지"메시지를 전달하는"DAO,그것은 단순히 더미의 특성/값 쌍).

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