C #의 제네릭 형식에 대한 좋은 명명 규칙은 무엇입니까? [닫은]


16

나는 오히려 주관적이므로 스택 오버플로 대신이 질문을하기로 결정했습니다.

C #에서는 일반적으로 이름이 매우 낮은 일반 유형이 표시됩니다. 특히, "T"는 일반적으로 사용되지만 그 자체로는 의미있는 이름이 아닙니다. 예를 들면 다음과 같습니다.

class Fruit<T>
{
    T fruit;
}

이것이 일반적인 접근 방법이지만 누군가는 이것을 반대 할 것입니까? 그렇다면 일반적인 함수와 클래스에 대한 C #의 맥락에서 제네릭 형식에 대한 합리적인 명명 규칙은 무엇입니까?

이전 예에서 제네릭 형식 T은 항상 Apple또는 과 같은 과일 형식 이어야 한다고 가정하겠습니다 Orange. 유형은 T그래서 아마 더 좋은 이름이 될 것이다, 그것은 과일의 종류가 있다는 것이 분명하게 할 필요가 FruitType우리와 끝까지 있도록 :

class Fruit<FruitType>
{
    FruitType fruit;
}

이것은 당신에게 내가 찾고있는 것에 대한 아이디어를주는 것입니다. 이 문제에 허용되는 "거짓의 법칙"은 무엇입니까?


3
이것은 건설적인 질문이 아닙니다. 포스터가 가장 좋아하는 스타일로만 답변을받습니다.
Michael K

1
예제를 고려하여 제약 조건을 살펴보십시오. msdn.microsoft.com/en-us/library/d5x73970.aspx#Y426
Matthieu

2
@Michael에는 많은 답변이있을 것이며, 승인 된 답변은 Robert가 가장 좋아하는 답변이 될 것이지만 다른 여러 답변이 투표 될 것입니다.
StuperUser

5
@ 마이클 주관적인 질문은 주관적인 답변을 얻습니다. 이 문제는이 특정 문제에 대한 다양한 아이디어 / 솔루션을 원하는 사람에게 참조 점으로 작용하기 때문에 여전히 건설적인 문제입니다. 내가 답변으로 표시 한 것은 유일하고 유용한 정보를 나타내는 것이 아닙니다.
void.pointer

아마도 주관적이지만 좋은 자원으로 커뮤니티 위키로 바꿀 수 있습니까?
tylermac

답변:


22

실제로 주관적이다 ... ish .
일부 사람들 i은 for 루프 변수에 대해 완벽하게 유효하기 때문에 일부 T클래스는 일반 클래스의 유형 자리 표시 자에 완벽하게 유효 하다고 생각 합니다.

나는 개인적 으로이 접근법을 배우고, 그것은 일반적인 관습이며 사람들은 일반적으로 당신이 무엇을 의미하는지 알고 있습니다.

유형이 의미가있는 곳에서는 의미있는 이름을 사용하지만 일반적으로 T로 시작합니다. 최근에 일반 사전 클래스를 개발했지만 묻지 않았습니다.

public class Dictionary<TKey, TValue>

그러나 유형이 본질적으로 의미가없는 Tuple과 같은 경우 다음을 완벽하게 수용 할 수 있다고 생각합니다.

public class Tuple<T1, T2, T3>

2
나는이 주관적인 것을 전혀 찾지 못한다. i그리고 T작동하며, 이것은 원칙적으로 측정 가능합니다 (즉, 루프 인덱스가 다른 식별자를 얻는다면 소스 코드의 이해력이 증가하는지 여부를 측정 할 수 있습니다). 그건 그냥 있기 때문에 하드 의미하지 않는다 측정하기 위해 우리는 모든 것을에서 "주관적"라벨 태그를해야합니다. 명백한 문제없이 광범위하게 사용되므로 실제로 작동한다는 것을 측정하지 않고도 말할 수 있습니다.
Konrad Rudolph

2
@ Konrad : 당신은 요점을했습니다. . . 그러나 그 질문은 주관적인 것으로 태그되지 않았으며, 사람들은 사람들이 명명 규칙에 대해 자신의 선호를 갖는 경향이 있다고 가정하는 주관적인 주제임을 인정합니다. 따라서 질문이 주관적이지 않을 수도 있지만 실제로는 정답이 없습니다 (예 : Microsoft 공식 가이드 라인으로 연결되는 답변이 아니기 때문에) 주제는 주관적입니다. " i하고 T있는 . 하나는 단일 문자 이름 이제까지 사용하지 않을해야한다"타입의 대답을. 모두를 만족시키는 데 도움이 되는 ish 를 추가했습니다 :)
Binary Worrier

1
답변 자체가 매우 유용하지만이 게시물에 추가 된 의견만으로도 귀중한 답변을 얻을 수 있다고 생각합니다. T"제약이없는 유형에 대해 이야기 할 때 TFruit의미가 있습니다. 그것이"과일이라는 제약이있는 모든 유형 "이라고 말했기 때문입니다. 이것은 일반적인 형식 매개 변수의 이름을 지정하는 데 유용한 "거의 규칙"처럼 보입니다. 감사!!
void.pointer

1
참고로 이는 MSDN의 라이브러리 개발자위한 .NET Framework 디자인 지침 과 일치합니다 . 제네릭 형식 매개 변수의 이름을 참조하십시오 .
그랜트 토마스

7

비록 당신이 옳다고 생각하지만, T는 꽤 표준이되었습니다. 아마도 오래된 C ++ 시대와 "T 유형"이라는 문구에서 유래했을 것입니다. 가능한 한 서술적인 것이 좋은 습관이라고 생각하지만 주관적입니다.

많은 사람들이 인터페이스를 위해 I를 선택하는 것처럼 T를 접두어로 선택할 수 있습니다. 그러므로

class Juice<TFruit> where TFruit...

겸손한 의견으로는 좋은 이름이 될 것입니다. 대부분의 경우 접두사를 접두사로 사용하는 것이 좋습니다. 왜냐하면 접했을 때 무엇을보고 있는지 명확하게 알 수 있으며 Intellisense와 같은 것을 사용하여 쉽게 검색 할 수 있기 때문입니다. 텍스트 형식과 같은 형식을 항상 알고 있지만 설명 이름에 대해 100 % 확신 할 수없는 경우 UI 컨트롤에도 좋습니다.

그것의 부정적인 측면은 유형 자체가 T로 시작할 때 나빠 보인다는 것입니다. 따라서 아래의 경우와 같이 특별한 경우에 일반적인 유형의 접미사를 사용하는 것이 좋습니다.

class SomeAlgorithm<TypeT> where TypeT : Type

이것은 단지 제 의견이며 매우 주관적입니다. 그러나 접두사보다 접두사를 선호하는 사소한 점이 있다고 생각합니다.


프레임 워크 디자인 가이드 라인에서 T타입 매개 변수와 I인터페이스 이름 에 접두어를 사용해야합니다 ( " DO ..."규칙).
Richard

1
TFruit여기를 사용 하면 무엇이 테이블에 가져 오는지 의문 T입니다. 와 같은 이름을 사용 TType하거나 TypeT확실히 말도 안됩니다. 그것은 단지 어떤 정보도 추가 하지 않습니다T . 똑같은 정보가 전달됩니다.
Konrad Rudolph

@ Konrad Rudolph : TypeT의 예를 자세히 살펴보십시오 .System.Type을 다룰 때 특별한 경우를 다룹니다. 제 이름에 T를 사용하는 것보다, 특히 제네릭도 제한된 경우 내 이름의 엔트로피가 더 높다고 생각합니다.
팔콘

7

Microsoft는 클래스 이름, 구조 및 인터페이스 ( 여기 에서 인용 하고 책 형식 : 프레임 워크 디자인 지침 )에 대한 일반 지침을 제공 합니다.

특정 질문과 관련하여 다음과 같이 말합니다.

단일 문자 이름이 완전히 설명 적이 지 않고 설명 이름이 값을 추가하지 않는 한, 설명 유형으로 일반 유형 매개 변수의 이름을 지정하십시오.

IDictionary<TKey, TValue> 

이 가이드 라인을 따르는 인터페이스의 예입니다.

단일 문자 유형 매개 변수가 하나 인 유형의 유형 매개 변수 이름으로 문자 T를 사용하십시오.

설명 유형 매개 변수 이름 앞에 문자 T를 사용하십시오.

매개 변수 이름에 유형 매개 변수에 대한 제한 조건을 표시하십시오. 예를 들어, ISession으로 제한되는 매개 변수를 TSession이라고 할 수 있습니다.


더 나은 참조는 Framework Design Guidelines 책 또는 MSDN의 (요약), 특히 클래스 이름, 구조 및 인터페이스 입니다.
Richard

@Richard : 귀하의 의견을 고려하여 답변을 조정했습니다. 감사합니다!
Matthieu

2

제네릭의 요점은 기능을 위임하는 것입니다. 제네릭 클래스는 한 가지 일을하고, 그 인수는 다른 일을합니다. 교과서 예제는 일반적인 컬렉션입니다. 컬렉션은 '사물'을 저장하지만 이러한 것들이 무엇인지는 중요하지 않습니다. (! 원문) - 이름 "는 제네릭 형식 인수입니다"이외의 설명 아무것도 없기 때문에 우리가 그것을 설명되고 싶지 않아 일반적인 이름은, 따라서 그것을 어떤 논리가 T철저하게 포함이 (고려 컨벤션). 설명하는 것은 좋지만 지나치게 설명적인 것은 존재하지 않는 제한을 암시합니다.

그러나 일반 클래스 나 메서드에는 유형 매개 변수가 두 개 이상인 경우가 있으며이 시점에서 더 설명적인 이름을 지정하면 역할이 명확 해집니다. 키와 값이 모두 일반인 키-값 수집 유형이 좋은 예입니다. 를 호출 T하고하는 것은 S(또는 Q또는 무엇이든) 말, 그들을 호출하는 것보다 덜 유용 할 것입니다 KeyTypeValueType, 또는 TKeyTVal.


1

정답은 주관적입니다. 그러나 코드는 자체 문서화해야하기 때문에 의문의 여지가 있으며 우리는 모두 더 나은 방법을 배울 수 있습니다.

다음은 내가 배우고 따르는 규칙입니다.

  • 일반 클래스 매개 변수는 구체적인 클래스로 착각해서는 안됩니다. 이것은 일반적으로 T인터페이스가 일반적으로 앞에 오는 것과 같이 다음 에 관계없이 서문을 권장합니다 I.

  • 클래스 나 메소드의 단일 제네릭 형식 매개 변수에는 일반적으로 레이블이 지정되어야합니다 T. 이것은 C ++ 템플릿으로 거슬러 올라간 보편적으로 이해되는 관습입니다.

  • 동일한 클래스 또는 메소드 선언의 여러 일반 유형 매개 변수는 모두 T로 시작해야하지만 간결하지만 이해하기 쉬운 방법으로 구별해야합니다. TIn그리고 TOut, 예를 들면, 강력한 형식 일반 입력을 접수하고 강력한 형식의 일반적인 출력을 생성하는 방법이 일반적이고 잘 알려진 세로토닌이다.

  • .Net의 Tuple과 같은 포함 클래스 또는 Func, Predicate 및 Action과 같은 델리게이트 유형과 같이 여러 가지 차별화되지만 눈에 띄지 않는 유형에는 T1, T2, T3 등으로 레이블을 지정할 수 있습니다. 그러나 "명확한"GTP 선언 / 또는 매우 구체적인 유형 제한)에는 더 설명이 있어야합니다.

  • 포함하는 클래스의 제네릭 형식과 다른 메서드의 단일 제네릭 형식은 클래스 또는 메서드의 여러 형식에 대한 이전 규칙을 따르거나 형식이 다르지 않은 경우 다른 형식을 지정할 수 있습니다 단일 문자, 종종 UV. 이것은 다시 C ++ 템플릿으로 거슬러 올라간 관습입니다.

  • 무엇을 선택하든 일관성을 유지하십시오. 두 번째 클래스가 첫 번째 클래스에 중첩되어 두 번째 클래스에서 사용할 수없는 경우를 제외 T하고 한 클래스에 대한 GTP 레이블을 지정하지 마십시오 .TParamT

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