이름이 같은 일반 클래스를 포함하는 파일을 구조화하고 이름을 지정하는 가장 좋은 방법은 무엇입니까?


14

현재 프로젝트에서 동일한 이름이지만 다른 수의 일반 매개 변수로 일반 클래스를 작성 해야하는 요구 사항을 충족했습니다. 예를 들면 다음과 같습니다.

MyClass<T1>
MyClass<T1, T2>
MyClass<T1, T2, T3>

동일한 네임 스페이스 에서이 모든 것을 원한다면 클래스와 파일을 구조화하고 이름을 지정하는 방법에 대해 혼란 스럽습니까?

클래스가 파일 당 1 개로 제한되어야하고 파일이 네임 스페이스 계층 구조를 나타내는 폴더 구조에 있어야하고 파일 이름이 클래스 이름과 일치해야한다는 아이디어를 따르는 경우이 상황을 어떻게 처리해야합니까? ?

내가 정말 여기 해달라고 부탁하는 것은 내가 이름을해야 무엇 파일을 포함 MyClass<T1>하고, 내가이 이름을해야 파일 이 들어 MyClass<T1, T2>? 유형 매개 변수의 이름이 무엇인지 묻지 않습니다.


문제를보다 자세하게 설명하는 구체적인 예를 들어 주십시오 . 당신이 제공 한 예제는 너무 ... 음, 일반입니다. "클래스와 파일을 구조화하고 이름을 지정하는 방법"은 무엇을 의미합니까?
Robert Harvey

Microsoft는 type 매개 변수에 숫자를 추가하여이 작업을 수행합니다. Tuple 문서를 참조하십시오 : msdn.microsoft.com/en-us/library/…
Pete

@Pete : 그것은 실제로 Tuple에만 적용됩니다. Microsoft는 또한이 TKey, TValue규칙을 사용합니다 . Func에는 TResult유형 매개 변수가 있습니다. 내가 어떻게 당신이 사용할 수 있음에 동의하지만 T1, T2등, 그렇지 않으면 같은 특정 용도를하지 않아도 입력 매개 변수의 변수 번호 TKeyTValue.
Robert Harvey

@RobertHarvey 예, 그러나 사전과 같은 실제 키 / 값 수집의 맥락에서만 가능합니다. 다양한 유형의 유형으로 구성된 항목에는 숫자가 추가됩니다. 다음은 또 다른 예입니다. msdn.microsoft.com/en-us/library/dd402872(v=vs.110).aspx
Pete

1
글을 수정하면 일부 의견이 더 이상 사용되지 않습니다. :) 왜 클래스를 동일한 실제 파일에 보관할 수 없습니까? 파일이 너무 다르기 때문에 별도의 파일로 보관해야하는 경우 다른 점을 알려주세요.
Pete

답변:


14
MyGenericClass`1.cs
MyGenericClass`2.cs
MyGenericClass`3.cs

백틱 이후의 숫자는 일반 유형 매개 변수의 수입니다. 이 규칙은 Microsoft에서 사용합니다.

또는 다음과 같은 것을 사용할 수 있습니다

MyGenericCollectionClass[TKey, TValue].cs

제네릭 형식 매개 변수의 수뿐만 아니라 특정 이름도 유지합니다. 물론, 그것은 꺾쇠 괄호를 유지하지는 않지만 우리가 원하는 모든 것을 가질 수는 없습니까?


1
.NET에서는 이름이 다른 여러 개의 일반 매개 변수를 사용하는 동일한 유형의 여러 유형을 허용하지 않지만 C #에서는 백 형식과 일반 매개 변수의 수를 추가하여 내부적으로 일반 유형의 이름을 맹 글링합니다. 따라서 파일 이름 지정 규칙은 컴파일러의 기능과 일치합니다.
코드 InChaos

1
github.com/dotnet/corefx/tree/master/src/… 당신이 틀렸다는 것을 증명하고 싶었습니다. 저는이 컨벤션이 마음에 들지 않습니다.
Den

1
@ Den, 이제 그들은 그 대회에서 후회 한 것 같습니다. 어쩌면 문제가 있음을 암시합니까? github.com/dotnet/corefx/commit/…
Sam

@Sam Microsoft 팀 간의 통신 문제가 아니길 바랍니다. 다른 사람이하지 않기 때문입니다. 또한 라이브러리 팀이 아닌 컴파일러 팀이 내 의견으로 결정합니다.
Den

파일 이름에 "`"를 사용하기위한 공이 없습니다.
Cristian E.

4

의 경우 TupleAction피트가 언급 한 것으로, 마이크로 소프트 자체가 하나의 파일을 사용 - 참조 Tuple.csAction.cs을 .

모든 클래스의 기능이 기본적으로 동일한 지 여부에 부분적으로 달려 있다고 생각합니다. 개인적으로 일괄 클래스를 단일 파일로 싫어하지만 이는 예외 일 수 있습니다. 내가 작업하는 소스 코드에서 NamedTuple와 같은 방식으로 작동 Tuple하지만 생성자에 대한 첫 번째 인수로 문자열 이름을 사용하는 자동 생성 (T4 사용) 클래스를 추가했습니다 .

단일 파일을 사용하지 않으려는 경우 질문에 대답하려면 MyClass_1.cs는 MyClass<T1>, MyClass_2.cs는 MyClass<T1, T2>을 사용하십시오.

두 가지 방법 모두 이상적인 것은 아니므로 "Microsoft는 이런 식으로 그렇게하십시오"라는 주장을하는 경향이 있습니다.


2
Tuple그리고 Action모든 참가자이다; 구현 코드가 없으므로 모든 변형을 별도의 파일에 넣는 것은 어쨌든 의미가 없습니다. 모든 규칙에 예외가 있음을 증명하십시오.
Robert Harvey

예, 일반적으로 여러 공개 대리인을 동일한 파일에 넣는 것은 괜찮은 것으로 간주됩니다 (관련된 경우).
Stephen

1
@RobertHarvey Tuple는 대리인이 아니지만 각 구현은 짧습니다.
Arturo Torres Sánchez

@ ArturoTorresSánchez : 그렇습니다 Func.
Robert Harvey

0

수업이 같은 의도를 가지고 있는지 스스로에게 물었습니까? 한 클래스가 다른 클래스보다 일반인 경우 GenericClass , MoreGenericClassMostGenericClass가 됩니다. 클래스의 각 유형 매개 변수가 클래스에 새로운 차원을 추가한다고 가정하면 어떤 차원인지 묻는 것이 도움이 될 수 있습니다.

이 예제를 보자.

  • Container<Thing>
  • MetricContainer<Thing, Metric>
  • MetricTransportableContainer<Thing, Metric, Transport>

나는 이것이 최고의 예는 아니지만 3 차원을 보여주기 위해 매우 표현 적이라는 것을 알고 있습니다.

  • 내부 치수,로드 할 수있는 것
  • 측정 항목 차원,로드 할 수있는 측정 항목, 사물 수 또는 제곱 측정 또는 입방체 용량 또는 중량 기준
  • 로드 할 수있는 외부 치수.

따라서 자동차 운송을 모델링 할 수 있습니다.

Container<Cars>
MetricContainer<Cars, CountMetric>
MetricTransportableContainer<Cars, CountMetric, Ship>

유체 운송 :

Container<Fluid>
MetricContainer<Fluid, Volume>
MetricTransportableContainer<Fluid, Volume, Shelf>

에너지 운송 :

Container<Energy>
MetricContainer<Energy, ElectricPower>
MetricTransportableContainer<Energy, ElectricPower, Box>

설탕, 시리얼 운송 :

Container<CrumblyMaterial>
MetricContainer<CrumblyMaterial, Weight>
MetricTransportableContainer<CrumblyMaterial, Weight, Silo>

아, 놀랍습니다. List<T>리스트가 가질 수있는 것을 나타내는 하나의 차원이 있습니다. 이 Map<T, S>맵은 맵이 보유 할 수있는 것과 액세스 키를 나타내는 2 차원입니다.


1
나는 당신이 그 질문을 이해하지 않았다고 생각합니다. 질문의 마지막 단락을보십시오.
Robert Harvey

1
@RobertHarvey 질문을주의 깊게 읽으십시오 : classname은 filename과 동일해야합니다. 상호 교환 가능합니다. 문제는 클래스의 잘못된 분석과 일반적인 클래스의 잘못된 이름 지정에 있습니다. 내 대답을 요약하면 : "그것이 무엇인지 아닌지 말하십시오."
shylynx


1
@RobertHarvey 내 답변 읽기 : 하나의 수업을 하나의 파일에 넣으십시오!
shylynx

1
나는 당신이 요점을 놓치고 있다고 생각합니다. 문제는 묻는다 : 어떻게 배치해야합니까 Tuple<T1>, Tuple<T1, T2>그리고 Tuple<T1, T2, T3>, 표준 방식으로 별도의 CS 파일에 이름이 충돌하지 않고?
Robert Harvey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.