문제
나는 많은 예제 코드는 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,그것은 단순히 더미의 특성/값 쌍).