읽기 전용 속성 또는 메서드를 사용하려면?
클래스 인스턴스의 " is mapping? "상태 를 노출해야합니다 . 결과는 기본 점검으로 결정됩니다. 단순히 필드의 값을 노출하는 것이 아닙니다 . 읽기 전용 속성을 사용해야할지 메서드를 사용해야하는지 잘 모르겠습니다.
읽기 전용 속성 :
public bool IsMapped
{
get
{
return MappedField != null;
}
}
방법:
public bool IsMapped()
{
return MappedField != null;
}
MSDN의 Choosing Between Properties and Methods를 읽었 지만 여전히 확실하지 않습니다.
C # 표준에 따르면
§ 8.7.4
속성은 객체 또는 클래스들의 특징에 대한 액세스를 제공하는 부재이다. 속성의 예로는 문자열 길이, 글꼴 크기, 창의 캡션, 고객 이름 등이 있습니다. 속성은 필드의 자연스러운 확장입니다. 둘 다 유형이 연결된 명명 된 멤버이며 필드 및 속성에 액세스하기위한 구문은 동일합니다. 그러나 필드와 달리 속성은 저장 위치를 나타내지 않습니다. 대신 속성에는 값을 읽거나 쓸 때 실행할 문을 지정하는 접근자가 있습니다.
방법은 다음과 같이 정의됩니다.
§ 8.7.3
방법은 그 구현하는 객체 또는 클래스에 의해 수행 될 수있는 연산 또는 작업 멤버이다. 메서드에는 형식 매개 변수 목록 (비어있을 수 있음), 반환 값 (메서드의 반환 유형이 void 인 경우 제외)이 있으며 정적이거나 비 정적입니다.
캡슐화 를 실현하기 위해 속성 과 메서드 가 사용됩니다 . 속성은 데이터를 캡슐화하고 메서드는 논리를 캡슐화합니다. 이것이 데이터를 노출하는 경우 읽기 전용 속성을 선호해야하는 이유입니다. 귀하의 경우에는 개체의 내부 상태를 수정하는 논리가 없습니다. 개체의 특성에 대한 액세스 를 제공 하려고 합니다 .
개체의 인스턴스가 개체 IsMapped
의 특성 인지 여부 . 수표가 포함되어 있기 때문에 액세스 할 수있는 속성이 있습니다. 속성은 논리를 사용하여 정의 할 수 있지만 논리를 노출해서는 안됩니다. 첫 번째 인용문에 언급 된 예와 같이 String.Length
속성을 상상해보십시오 . 구현에 따라이 속성은 문자열을 반복하고 문자 수를 계산할 수 있습니다. 또한 작업을 수행하지만 "외부에서"개체의 내부 상태 / 특성에 대한 설명을 제공합니다.
나는 실제 "행동"(액션)이없고 부작용도없고 너무 복잡하지 않기 때문에이 속성을 사용할 것입니다.
나는 개인적으로 a method
가 무언가를하거나 어떤 행동을해야 한다고 믿습니다 . 당신은 아무것도 내부를 수행하지 않는 IsMapped
그것은을해야하므로property
나는 재산에 갈 것입니다. 주로 참조 된 MSDN 기사의 첫 번째 문장 때문입니다.
일반적으로 메서드는 작업을 나타내고 속성은 데이터를 나타냅니다.
이 경우 그것이 재산이어야한다는 것이 나에게 꽤 분명해 보인다. 간단한 검사, 논리, 부작용, 성능 영향이 없습니다. 그 수표보다 훨씬 간단하지 않습니다.
편집하다:
이 경우 참고하시기 바랍니다 했다 위에서 언급 한 중 하나를 당신이 방법에 넣어 것입니다 또는이 같은, 그 방법은 강한 동사가 아닌 보조 동사를 포함해야한다. 메서드 는 뭔가를합니다. 동사로 시작하는 한 VerifyMapping 또는 DefineMappingExistance 또는 다른 이름을 지정할 수 있습니다.
링크의이 줄이 답이라고 생각합니다
메서드는 작업을 나타내고 속성은 데이터를 나타냅니다.
여기에는 작업이 없으며 데이터 조각 일뿐입니다. 그래서 그것은 재산입니다.
값을 얻기 위해 매개 변수를 추가해야하는 경우에는 메소드가 필요합니다. 그렇지 않으면 재산이 필요합니다
IMHO, 첫 번째 읽기 전용 속성은 IsMapped가 개체의 속성으로 정확하고 작업을 수행하지 않고 (평가 만 수행) 하루가 끝나면 기존 코드베이스와의 일관성이 의미론 .... 이것이 단일 할당이 아닌 경우
저는 여기 사람들이 데이터를 얻고 있고 부작용이 없기 때문에 재산이어야한다는 점에 동의 할 것입니다.
이를 확장하기 위해 부작용이 "외부에서 보는"사람에게 의미가 있다면 setter (게터는 아님)를 사용하여 몇 가지 부작용을 받아 들일 것입니다.
그것에 대해 생각하는 한 가지 방법은 메서드는 동사이고 속성은 형용사라는 것입니다 (반면 객체 자체는 명사이고 정적 객체는 추상 명사입니다).
동사 / 형용사 지침의 유일한 예외는 문제의 정보를 얻거나 설정하는 데 속성이 아닌 메서드를 사용하는 것이 합리적 일 수 있다는 것입니다. 논리적으로 이러한 기능은 여전히 속성이어야합니다. 그러나 사람들은 속성을 성능 측면에서 영향이 적은 것으로 생각하는 데 익숙하며 항상 그래야하는 실제 이유가 없지만 실제로 GetIsMapped()
그랬다면 상대적으로 성능 측면에서 강력한 것을 강조하는 것이 유용 할 수 있습니다 .
실행중인 코드의 수준에서는 속성을 호출하는 것과 가져 오거나 설정하기 위해 동등한 메서드를 호출하는 것 사이에 전혀 차이가 없습니다. 그것은 그것을 사용하는 코드를 작성하는 사람의 삶을 더 쉽게 만드는 것입니다.
이 두 가지 구성에 모두 액세스 할 수있는 상황 / 언어에서 일반적인 구분은 다음과 같습니다.
- 요청이 객체가 뭔가를하는 경우 가 , 속성 (또는 필드)를 사용합니다.
- 요청이 객체 가 수행 하는 작업의 결과 인 경우 메서드를 사용합니다.
좀 더 구체적으로 말하자면, 속성은 속성을 노출하는 객체가 소유 한 (소비 목적을 위해) 데이터 멤버에 읽기 및 / 또는 쓰기 방식으로 액세스하는 데 사용됩니다. 데이터가 항상 영구적 인 형태로 존재할 필요가 없기 때문에 속성이 필드보다 낫습니다 (이 데이터 값의 계산 또는 검색에 대해 "게으른"수 있음). 공용 필드 인 것처럼 코드에서 계속 사용할 수 있습니다.
Properties should not, however, result in side effects (with the possible, understandable exception of setting a variable meant to persist the value being returned, avoiding expensive recalculation of a value needed many times); they should, all other things being equal, return a deterministic result (so NextRandomNumber is a bad conceptual choice for a property) and the calculation should not result in the alteration of any state data that would affect other calculations (for instance, getting PropertyA and PropertyB in that order should not return any different result than getting PropertyB and then PropertyA).
A method, OTOH, is conceptually understood as performing some operation and returning the result; in short, it does something, which may extend beyond the scope of computing a return value. Methods, therefore, are to be used when an operation that returns a value has additional side effects. The return value may still be the result of some calculation, but the method may have computed it non-deterministically (GetNextRandomNumber()), or the returned data is in the form of a unique instance of an object, and calling the method again produces a different instance even if it may have the same data (GetCurrentStatus()), or the method may alter state data such that doing exactly the same thing twice in a row produces different results (EncryptDataBlock(); many encryption ciphers work this way by design to ensure encrypting the same data twice in a row produces different ciphertexts).
I would expect property as it only is returning the detail of a field. On the other hand I would expect
MappedFields[] mf;
public bool IsMapped()
{
mf.All(x => x != null);
}
you should use the property because c# has properties for this reason
참고URL : https://stackoverflow.com/questions/16829732/to-use-a-read-only-property-or-a-method
'Development Tip' 카테고리의 다른 글
jQuery는 ID / 값을 얻습니다. (0) | 2020.11.07 |
---|---|
C ++ 문자열의 문자 정렬 (0) | 2020.11.07 |
AngularJS 1.x에서 필터를 단위 테스트하는 방법 (0) | 2020.11.07 |
Python의 표준 라이브러리에 정렬 된 컨테이너가없는 이유는 무엇입니까? (0) | 2020.11.07 |
스칼라에서 param : _ *는 무엇을 의미합니까? (0) | 2020.11.07 |