.NET 위임 유형에 대한 적절한 명명 규칙?


82

관례에 따라 클래스는 종종 명사, 동사와 같은 메서드 및 형용사와 같은 인터페이스와 같은 이름이 지정됩니다.

델리게이트에 대한 일반적인 명명 규칙은 무엇입니까? 또는 대리인이 유형 및 기타 항목에 나열 될 때 이름을 구별하는 좋은 방법은 무엇입니까?

내 즉각적인 가정은 단일 메서드 인터페이스가 종종 대리자로 대체 될 수 있기 때문에 대리자를 형용사 로 명명하는 것 입니다.

몇 가지 생각 :

delegate object ValueExtracting(object container);

delegate object ValueExtractor(object container);

delegate object ValueExtractionHandling(object container);

delegate object ValueExtractionHandler(object container);

답변:


111

개인적으로 몇 가지 다른 패턴을 사용합니다.

[Task][State]Handler - UITaskFinishedHandler

[Event]Handler - ControlLoadedHandler

[Function Name]Delegate - DoSomeWorkDelegate - 내가 다른 / 새 스레드에서 함수를 호출하기위한 대리자를 만들 필요가있을 때 사용

[Task]Callback - ContainerLoadedCallback - 제어 A는 작업 및 제어 (A)의 대부분이 제어 B에 대한 종속성을 통과 않는 제어 B 작업을 시작할 때 사용 (예 : ControlA를 채우기 위해 ControlB에 대한 UI 컨테이너를 통과하고 실제로 컨테이너를 보여 통지를 필요로했을 수 있습니다 )

다중 스레딩 또는 비동기 WCF 호출을 많이 사용하는 프로젝트가있는 경우 많은 대리자가 떠 다니게 될 수 있으므로 최소한 이해하기 쉬운 표준을 채택하는 것이 중요합니다.


+1 멋진 컨벤션입니다. 또한 이벤트 유형에서 사용하는 대리자가 'Handler'대신 'EventHandler'접미사를 가져야하는 아래의 @Aaronaught 답변에 동의합니다.
Samuel

1
"[Function Name] Delegate"가 CA1711을 위반합니다. 반환 유형이 있는지 여부에 따라 "[Function Name] Func"또는 "[Function Name] Action"을 사용하고 싶습니다.
Tinister 2013-09-05

1
그것은 아마도 내가 지금까지 본 가장 유용한 (그리고 가장 짧은) 규칙 일 것입니다. 나에게서 +1. @slugster를 공유해 주셔서 감사합니다
FullStackForger

코드 규칙은 위임 어떤 위임 접미사하지 말 docs.microsoft.com/en-us/visualstudio/code-quality/...
기독교 핀들 레이

2
말할 @MelbourneDeveloper 그 만든 사람 RequestDelegateasp.net 코어에 대해 -]
t3chb0t

48

Microsoft의 프레임 워크 디자인 지침 -나를위한 명명 책정 은 주제에 대해 다음과 같이 말합니다 .

√ 이벤트에 사용되는 델리게이트 이름에 접미사 "EventHandler"를 추가하세요.
√ 이벤트 핸들러로 사용되는 것 이외의 델리게이트 이름에 접미사 "콜백"을 추가하세요.
X 델리게이트에 접미사 "Delegate"를 추가하지 마십시오.


16
재미는 MS가 '대리인에 접미사 "위임"을 추가하지 마십시오'만에 말한다 들이라는 대리자가 ProcessBookDelegate...
PadawanLondon

@PadawanLondon은 RequestDelegateasp.net-core에서 와 같은 이야기를 합니다. 일관성과 코딩 관습이 너무 많습니다. 나는 그들 자신의 문서도 읽지 않는 것 같다.
t3chb0t

16

델리게이트는 작업 (동사)을 수행하는 것이므로 해당 작업을 수행하는 이름을 지정해야합니다. 가지고 Converter<TInput, TOutput>예를 들어. 동사는 Convert 입니다. 변환을 수행하는 것을 변환기 라고 하므로 델리게이트의 이름이됩니다.


6

이것은 몇 가지에 달려 있습니다.

대리자가 이벤트로 사용되는 경우 항상EventHandler 하위 유형 으로 참조 되어야 합니다. 예를 들면 다음과 같습니다.

public delegate void ValueExtractingEventHandler(object sender,
    ValueExtractingEventArgs e);

이벤트가 아닌 경우 MS 코딩 지침 (Google에서 올바른 사본을 찾을 수없는 것 같음) 은 특별한 경우를 제외하고 대리인 이름에 "delegate"또는 "handler"와 같은 단어 포함 하지 않도록 명시 적으로 권장 합니다. 유형.EventHandler

일반적으로 델리게이트는 actionsValueExtracting (값이 추출되기 전에 델리게이트가 발생하는 경우) 또는 ValueExtracted(추출 후 ) 처럼 이름을 지정해야합니다 .

Func<T1, T2, ..., TResult>대리인이 구문은 더 일반화되고 있지만 그것으로는 4 개 이상의 매개 변수가없는 한, 당신은 모두에서 자신의 선언 할 필요가 없습니다 - 그냥 한 기존의 사용 :

object ExtractObject(object source, Func<object, object> extractor);

이 구문은 대리자가 클로저 로 사용될 때 가장 좋습니다 . 델리게이트 자체에는 그다지 흥미로운 이름이 없지만 인수는 에이전트 명사 (추출기, 공급자, 평가자, 선택자 등)입니다.

대부분의 델리게이트 사용법은 위의 범주 중 하나에 해당하므로 적절하게 선택하는 데 사용되는 것을 파악하십시오.


3

난 그냥 중 하나를 사용하는 대부분 때문에 나는 그것에 대해 생각하지 않았다 EventHandler<T>, Func<T>또는 Action<T>과부하를 내 자신을 정의 귀찮게하지 않습니다. 나는 아마도 당신이 나열한 것들 중에서 ValueExtractor를 선택할 것입니다. 이것은 그것이 객체처럼 들리게 만들고 그것을 호출하면 그 객체를 사용하여 작업을 수행하게됩니다. 예를 들면 :

ValueExtractor extractor += Blah;
var value = extractor(data);

또한 대부분의 기본 제공 대리자는 명사처럼 이름이 지정됩니다. 확실하지 않은 경우 .NET 프레임 워크를 따르십시오.


0

나는 ValueExtraction과 함께 갈 것입니다 ..
이유를 생각해 본 적이 없습니다. 하지만 당신이 연산을 저장하고 있고 명사가되어야하기 때문인 것 같습니다. 엄밀히 말하면 이것은 연산이 아닙니다.


0

을 기반으로 Enumerable.Sum대리자를 a로 전달 Func<object, object>하고 매개 변수의 이름을 지정합니다 selector.

void Foo(Func<object, object> selector) ...

자신의 델리게이트를 만들어야한다면 그것이하는 일에 ValueExtractor대한 가장 설명적인 이름이기 때문에 나는 함께 갈 것입니다 .


이러한 일반 델리게이트 (Action 및 Func)는 95 %의 경우 괜찮습니다. 그러나 매우 부족한 경우가 있습니다. 즉, 대리자가 복잡한 서명을 가지고 있고 많이 전달되는 경우입니다. 기본적으로 각 인수가 수행하는 작업은 명확해야합니다. 그렇지 않은 경우 명명 된 대리자를 만드는 것이 좋습니다.
Matěj Zábský
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.