Quy ước đặt tên thích hợp cho kiểu .NET Delegate?


82

Theo quy ước, các lớp thường được đặt tên như danh từ, phương thức như động từ và giao diện như tính từ.

Quy ước đặt tên chung cho một đại biểu là gì? Hoặc cách tốt để phân biệt tên của nó khi các đại biểu được liệt kê trong số các loại và những thứ khác là gì?

Giả định ngay lập tức của tôi là đặt tên một đại biểu nhiều khả năng là một tính từ vì một giao diện phương thức đơn thường có thể được thay thế bằng một đại biểu.

Một vài suy nghĩ:

delegate object ValueExtracting(object container);

delegate object ValueExtractor(object container);

delegate object ValueExtractionHandling(object container);

delegate object ValueExtractionHandler(object container);

Câu trả lời:


111

Cá nhân tôi sử dụng một vài mẫu khác nhau:

[Task][State]Handler - UITaskFinishingHandler

[Event]Handler - ControlLoadedHandler

[Function Name]Delegate - DoSomeWorkDelegate - được sử dụng khi tôi cần tạo một đại biểu để gọi một hàm trên một luồng khác / mới

[Task]Callback - ContainerLoadedCallback - được sử dụng khi điều khiển A bắt đầu một hành động mà điều khiển B thực hiện hầu hết công việc và điều khiển A đã chuyển một phần phụ thuộc vào điều khiển B (tức là ControlA có thể đã chuyển một vùng chứa giao diện người dùng để ControlB điền và cần thông báo để thực sự hiển thị vùng chứa )

Khi bạn có một dự án sử dụng nhiều lệnh gọi WCF đa luồng hoặc không đồng bộ, bạn có thể kết thúc với rất nhiều đại biểu trôi nổi, vì vậy điều quan trọng là phải áp dụng một tiêu chuẩn ít nhất có ý nghĩa đối với bạn.


+1 Đó là một quy ước tốt đẹp. Tôi cũng đồng ý với câu trả lời @Aaronaught bên dưới khi một đại biểu sử dụng loại sự kiện phải có hậu tố 'EventHandler' thay vì chỉ 'Handler'.
Samuel

1
Rất tiếc, "[Tên chức năng] Delegate" vi phạm CA1711. Tôi thích sử dụng "[Tên hàm] Hàm" hoặc "[Tên hàm] Hành động" tùy thuộc vào việc nó có kiểu trả về hay không.
Tinister

1
Đó có lẽ là quy ước hữu ích nhất (và ngắn nhất) mà tôi đã thấy cho đến nay. +1 từ tôi. Cảm ơn bạn đã chia sẻ @slugster
FullStackForger

Các quy tắc mã yêu cầu bạn không để thêm bất kỳ đại biểu nào với Ủy quyền docs.microsoft.com/en-us/visualstudio/code-quality/…
Christian Findlay

2
@MelbourneDeveloper nói rằng những người đã tạo ra RequestDelegateasp.net-core; -]
t3chb0t

48

Nguyên tắc Thiết kế Khung của Microsoft - niên giám đặt tên đối với tôi, cho biết những điều sau về chủ đề:

√ NÊN thêm hậu tố "EventHandler" vào tên của các đại biểu được sử dụng trong các sự kiện.
√ NÊN thêm hậu tố "Gọi lại" vào tên của các đại biểu khác với những người được sử dụng làm trình xử lý sự kiện.
X KHÔNG thêm hậu tố "Đại biểu" vào đại biểu.


16
Hài hước rằng MS nói 'KHÔNG thêm hậu tố 'Đại biểu' tới đại biểu', nhưng trong ví dụ này họ có một đại biểu gọi là ProcessBookDelegate...
PadawanLondon

@PadawanLondon câu chuyện tương tự với RequestDelegatetrong asp.net-core - liên quan đến tính nhất quán và các quy ước mã hóa. Tôi đoán họ thậm chí không đọc tài liệu của riêng họ.
t3chb0t

16

Vì đại diện là một thứ thực hiện một hành động (một động từ), đại biểu phải được đặt tên là cái mà bạn sẽ gọi là thứ thực hiện hành động đó. Lấy Converter<TInput, TOutput>ví dụ. Động từ là Convert . Thứ thực hiện chuyển đổi được gọi là bộ chuyển đổi , do đó có tên là đại biểu.


6

Điều này phụ thuộc vào một vài điều.

Nếu đại biểu sẽ được sử dụng như một sự kiện, nó phải luôn được gọi là một EventHandlerkiểu con, ví dụ:

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

Nếu nó không phải là một sự kiện, sau đó MS mã hóa hướng dẫn (mà tôi không bao giờ có thể có vẻ để tìm các bản sao phải trên Google) một cách rõ ràng khuyên chống lại bao gồm những từ như "đại biểu" hay "xử lý" trong tên đại biểu, ngoại trừ trong trường hợp đặc biệt của EventHandlercác loại.

Thông thường, các đại diện phải được đặt tên theo các hành động , giống như ValueExtracting(nếu đại biểu xảy ra trước khi giá trị được trích xuất) hoặc ValueExtracted(sau khi trích xuất).

Các Func<T1, T2, ..., TResult>cú pháp đại biểu cũng đang trở thành phổ biến hơn, nhưng trừ khi bạn có 4 hoặc nhiều tham số đi sâu vào nó, bạn không cần phải khai báo của riêng bạn tại tất cả - chỉ cần sử dụng hiện có:

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

Cú pháp này tốt nhất khi đại biểu đang được sử dụng như một bao đóng . Bản thân đại biểu không có một cái tên rất thú vị, nhưng đối số là một danh từ tác nhân (trình trích xuất, trình cung cấp, trình đánh giá, bộ chọn, v.v.)

Hầu hết các cách sử dụng đại biểu phù hợp với một trong các loại trên, vì vậy hãy tìm hiểu xem nó đang được sử dụng để lựa chọn phù hợp.


3

Tôi không bao giờ nghĩ về điều đó, chủ yếu là bởi vì tôi chỉ cần sử dụng một trong những EventHandler<T>, Func<T>hoặc Action<T>quá tải và không bao giờ bận tâm định của riêng tôi. Tôi có thể sẽ chọn ValueExtractor từ những người bạn đã liệt kê. Điều này làm cho nó giống một đối tượng hơn và khi bạn gọi nó, bạn sẽ sử dụng đối tượng đó để thực hiện một hành động. Ví dụ:

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

Ngoài ra, hầu hết các đại biểu cài sẵn cũng được đặt tên giống như danh từ. Khi nghi ngờ, hãy làm theo .NET framework.


0

Tôi sẽ sử dụng ValueExtraction ..
Tôi chưa bao giờ nghĩ tại sao, nhưng tôi đoán vì bạn đang lưu trữ một phép toán và nó phải là một danh từ .. thực sự đây không phải là một phép toán, tôi biết ...


0

Dựa trên Enumerable.Sum, tôi sẽ chuyển đại biểu dưới dạng a Func<object, object>và đặt tên cho tham số selector:

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

Nếu bạn phải làm đại biểu của riêng mình cho nó, tôi sẽ đi cùng ValueExtractorvì đó là tên mô tả nhất cho những gì nó làm.


Các đại diện chung này (Hành động và Chức năng) là tốt 95% các trường hợp. Tuy nhiên, có một số trường hợp chúng không đủ - đó là khi người đại diện có chữ ký phức tạp VÀ được chuyển qua nhiều. Về cơ bản, những gì mỗi lập luận làm phải rõ ràng, nếu không, việc đưa ra một đại biểu được nêu tên là một ý kiến ​​hay.
Matěj Zábský
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.