C #의 선언 형식과 속성 / 멤버 이름을 동일하게 지정하는 것이 좋지 않습니까?


25

예를 들어 다음과 같은 클래스가 있습니다.

class Dog { } //never mind that there's nothing in it...

그리고 다음과 같은 속성 :

Dog Dog { get; set; }

더 상상력이 풍부한 이름을 만들 수 없다면 다음을 사용해야한다고 들었습니다.

Dog DogObject { get; set; }

더 나은 이름을 지정하는 방법에 대한 생각이 있습니까?


2
당신이 들었던이 요구 사항은 아마도 좋은 지침을 과도하게 시행했기 때문에 뇌가 죽은 것처럼 보입니다 (더 나은 이름이있을 때 유형 이름을 사용하지 마십시오).

2
멤버 이름은 엔 클로징 유형과 같을 수 없으므로 C #에서도 컴파일되지 않습니다.
Lee

3
@ 리 : 컨텍스트는 속성이 다른 유형이라고 생각합니다. 예 :PersonDogDog
goric

3
그녀가 실제로 개라면, 그녀에게 그렇게 라벨을 붙인다.
Thomas Eding

1
IDE의 구문 강조는 유형과 속성을 구별해야합니다. IDE를 사용하지 않을 때는 언제든지 컨텍스트를 볼 수 있습니다.
Cyanfish

답변:


22

컨텍스트를 기반으로 코드에서 말하는 내용이 이미 분명하다는 사실이 아니기 때문에 나쁜 습관 일 수 있습니다.

Dog = new Dog();

유형 생성자는 무엇입니까? 어떤 물체입니까? 혼란스럽지 않습니까? 좋아, 어때?

Dog = Dog.Create()?

어떤 물체입니까? 유형의 정적 팩토리 메소드는 무엇입니까? 아직도 혼란스럽지 않습니까? 나는 그렇게 생각하지 않았다.

이것이 잠재적 인 문제라고 본 유일한 시간은 네임 스페이스 트리가 상당히 정교 해지고 컴파일러가 모호성을 파악할 수없는 경우입니다.

Dog = new Some.Namespace.Dog();

어쨌든 로컬 변수 이름은 항상 camelCased되므로 모호성을 완전히 피하기 때문에 자동 속성 (및 열거 형)에서만 발생합니다.

dog = new Dog();

7
+1. "TheDog", "AnyDog", "MyDog"등의 대안이 더 나쁩니다. 추가 할 항목이 없으면 추가하지 않는 것이 가장 좋습니다.
케빈 클라인

어떤 이유로 든 Dog인스턴스 메소드가있는 경우 두 번째 것이 혼란 스러울 수 있다고 생각 Create하지만 그 시점에서 꽤 끔찍한 코딩 방법을 배우고있을 것입니다.
KDiTraglia

40

이것은 합리적인 관행 일뿐만 아니라,이를 가능하게하도록 특별히 고안된 것입니다. 규칙 및 자리 맞추기에 대한 "색상"에 대한 C # 사양을 검색하고 다음을 참조하십시오.

http://blogs.msdn.com/b/ericlippert/archive/2009/07/06/color-color.aspx

이 결정에서 발생하는 흥미로운 코너 사례에 대해.

어떠한 경우에도 유형과 동일하게 호출되지 않도록 속성 이름을 "DogObject"로 지정해서는 안됩니다. 이는 프레임 워크 디자인 가이드 라인과 직접 모순됩니다.


속성 유형이 인스턴스에 ID가없는 유형 (예 :) 인 경우 Color그러한 사용은 합리적입니다. 그러나 가변 또는 IDisposable유형이 마음에 들지 않습니다 . "컨트롤 Font"은 속성에 의해 캡슐화 된 상태의 측면 또는 Font속성 게터에 의해 식별 된 인스턴스를 의미 합니까?
supercat

7

그것을 호출하는 것은 완벽하게 괜찮 Dog으며 실제로는 프레임 워크 명명 지침 에서 Microsoft가 권장하는 것입니다 .

유형과 이름이 같은 속성을 제공하는 것을 고려하십시오.

예를 들어 다음 속성은 Color라는 열거 형 값을 올바르게 가져 와서 설정하므로 속성 이름은 Color입니다.

위의 가이드에서 사용하는 예제는 다음과 같습니다.

public enum Color {...}
public class Control {
    public Color Color { get {...} set {...} }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.