Lý do đằng sau quy ước đặt tên tiền tố của tôi là gì cho các giao diện trong .NET?


10

Tôi biết quy ước "Tôi" đã xuất hiện từ COM, nhưng tôi chưa bao giờ hiểu tại sao nó không được xem xét lại như mọi quy ước đặt tên khác trước khi .NET có.

Tiêu thụ khôn ngoan, điều duy nhất tách biệt một giao diện khỏi, giả sử, một lớp trừu tượng, là chúng có thể được nhân rộng. Nhưng tất cả mọi thứ sau Visual Studio 2003 đã hiển thị chữ ký loại trong chú giải công cụ, vì vậy nó cũng vô dụng như tất cả các ký hiệu khác của Hungary đã bị loại bỏ.

Tôi cũng nghĩ rằng nó có thể để bạn có thể triển khai cơ bản giao diện có cùng tên, ví dụ như Messagekế thừa IMessage, nhưng hầu hết các thư viện .NET đã dùng để thêm từ "Base" vào cuối (ví dụ System.Collections.ReadOnlyCollectionBase) - và điều này làm cho ý nghĩa ngữ nghĩa nhiều hơn.

COM interop dường như là một lý do có thể khác - nhưng không phải là nếu các lớp trình bao bọc mà nó tạo ra là .NET hoàn toàn thành ngữ, vì vậy tôi nghi ngờ rằng đó là một sự cân nhắc về mặt thẩm mỹ.

Trong một trong những dự án mới hơn của tôi, tôi đã hoàn toàn bỏ qua quy ước và cảm thấy rất ổn. Có thiếu điều gì không?


1
Bạn không kế thừa giao diện để hoàn thành chúng, sự khác biệt lớn.
Daniel Little

Ngoài ra, nó có vẻ như ưu tiên như IList và List trái ngược với List và ArrayList. Có lẽ họ đã làm điều đó bởi vì IList không phải là ListBase nhưng thực sự là ListInterface (không phải là List of type interface), nếu bạn hiểu ý tôi.
Daniel Little

@Lavinski Trong .NET IListlà một thuật ngữ chung cho một bộ sưu tập tuần tự, tiếp giáp, truy cập ngẫu nhiên, trong khi đó Listlà một bộ sưu tập ngẫu nhiên , liên tục, truy cập ngẫu nhiên, bộ sưu tập đang phát triển . Tôi nghĩ rằng F # đã có nó ngay trong răng cưa Listđể ResizeArray; Đó chắc chắn là một cái tên mô tả nhiều hơn. IListsau đó có thể có được List, vì vậy dường như đó cũng không phải là một lý do.
Rei Miyasaka

2
IBaseBall và IBaseBallBase có ý nghĩa với tôi hơn BaseBallBase và BaseBallBaseBase (ví dụ ngớ ngẩn, tôi biết: D)
e-MEE

@ e-MEE ngớ ngẩn không kém sẽ là IIRC, có thể là giao diện cho giao thức trò chuyện IRC hoặc từ viết tắt của "nếu tôi nhớ chính xác".
Rei Miyasaka

Câu trả lời:


12

Tôi nghĩ rằng đây có thể là trường hợp duy nhất khi tiền tố hữu ích.

Các lớp và giao diện thực sự có ngữ nghĩa khác nhau, và bởi vì cả hai đều là loại, rất dễ trộn lẫn.
Khi tôi thấy một khai báo lớp, tôi có thể ngay lập tức cho biết nó bắt nguồn từ đâuthực hiện nó là gì :

public sealed class ActivityCollection : List<Activity>, 
    IList<Activity>, ICollection<Activity>, IEnumerable<Activity>, 
    IList, ICollection, IEnumerable

Sẽ khó hiểu hơn nếu định nghĩa giống như

public sealed class ActivityCollection : ListClass<Activity>, 
    List<Activity>, Collection<Activity>, Enumerable<Activity>, 
    List, Collection, Enumerable

Và bạn sẽ gọi ListClassnhư thế nào? Rõ ràng nó không chỉ ListBasevì nó có thể tự sử dụng được.
Vì vậy, chúng ta hoặc phải giải quyết một vấn đề mà chúng ta vừa phát minh ra hoặc điều chỉnh một tiền tố tách các lớp khỏi các giao diện, đó là những gì các nhà thiết kế .NET Framework đã làm.

Ngoài ra, cá nhân tôi thấy nó hữu ích khi tôi có thể nói từ chữ ký phương thức rằng nó hoạt động với các giao diện.

public void PrintLines (IEnumerable<string> source)

Nó giống như một tín hiệu đến đầu tôi: này, tôi có thể thực hiện điều này! Tôi có thể nuôi phương thức bất cứ điều gì phù hợp với hợp đồng.

Tất nhiên người ta có thể tranh luận rằng nó không quan trọng lắm nhưng đây là một trong những điều nhỏ làm cho tiền tố xứng đáng với tôi. Nó đặc biệt hữu ích khi viết nhiều mã với các thùng chứa IoC khi bạn liên tục làm việc với các giao diện và cần dễ dàng phân biệt giữa hai loại này.

Nhân tiện, không chỉ các giao diện có tiền tố trong hệ thống loại .NET. Đừng quên các tham số loại chung:

public delegate TResult Func<in T, out TResult>(
    T arg
)

Đây là một tình huống khác khi nó cực kỳ hữu ích để có thể phân biệt giữa các lớp và một loại khác.


2
Bạn có thể dễ dàng hiểu rằng bằng cách biết rằng "lớp đầu tiên là sự kế thừa, lớp thứ hai trở đi là các giao diện".
Saeed Neamati

3
Đây có vẻ là một lý do chính đáng. Java dường như đã giải quyết nó độc đáo hơn một chút bằng cách sử dụng các từ khóa để làm rõ danh sách : class Dog extends Mammal implements MailmanChaser. @Saeed bạn có thể có một lớp không kế thừa từ bất cứ thứ gì, vì vậy loại đầu tiên trong danh sách thực sự là một giao diện chứ không phải là một lớp cơ sở.
Rei Miyasaka

+1 cho phần in đậm, mặc dù tôi có thể nghĩ đến một nơi khác, nơi một quy ước dựa trên tiền tố sẽ hữu ích: để phân biệt giữa một trường đóng gói quyền sở hữu độc quyền của một int[](hoặc đối tượng khác thuộc loại có thể thay đổi) mà nó có thể biến đổi nhưng không chia sẻ và một cái đóng gói quyền sở hữu chung của một int[]thứ, mặc dù loại của nó sẽ cho phép đột biến, không ai được phép đột biến.
supercat

6

Tôi không nghĩ bạn thiếu thứ gì, đó chỉ là thói quen lịch sử.

Tôi cũng đồng ý với bạn và cũng đã bỏ 'Tôi' vào một vài dự án vừa và nhỏ mà không có tác dụng bất lợi.


2
Mặc dù điều kỳ lạ là họ đã ném ra thực tế mọi quy ước lỗi thời khác ngoại trừ quy ước này. Lịch sử cũng không giải thích điều đó. Tôi vẫn cảm thấy như phải có một lý do, trừ khi đó thực sự chỉ là chính trị nội bộ - nhưng ngay cả khi đó, tôi thực sự không thể thấy một lý do mà bất cứ ai sẽ buồn về việc tôi bị bỏ rơi.
Rei Miyasaka

2

Tôi nghĩ lý do duy nhất, theo Nguyên tắc đặt tên của Microsoft về Giao diện và Lớp , là, đôi khi bạn có xung đột giữa tên của giao diện và lớp thực hiện điều đó. Điều này quay trở lại thực tế là các giao diện trên thực tế là bộ xương chứ không phải thịt và lớp người thực hiện trên thực tế là thịt (hiện thực hóa bản thiết kế). Do đó, IAnimal chỉ mô tả những gì một con vật nên có , trong khi Animal có thể cho bạn biết những gì nó .

Tuy nhiên, cá nhân tôi hoàn toàn đồng ý với bạn về điểm chúng ta chỉ có thể sử dụng Animal Base cho giao diện và Animal cho lớp.

Mặt khác, đôi khi có hai điều mâu thuẫn nhau đến mức một nhóm quyết định đưa ra một quy ước để ngăn ngừa xung đột hơn nữa, bất chấp các quyết định đã được đưa ra. Ví dụ: trong ASP.NET MVC, cả Chế độ xem một phầnBố cục (trang chính), giống như Chế độ xem bình thường , trong khi chúng phục vụ các chức năng khác nhau. Do đó, Microsoft mặc dù nhấn mạnh không sử dụng dấu gạch dưới trong cách đặt tên, gợi ý cho Bố cục gạch dưới và Chế độ xem một phần với dấu gạch dưới.


Có gì sai với AnimalInterfacethay vì AnimalBase? Nó không phải là một lớp cơ sở, nó là một giao diện.
Scott Whitlock

3
Nhưng có gì sai với IAnimal thay vì AnimalInterface? chắc chắn rằng chúng ta đã đi hết quãng đường đến nơi chúng ta bắt đầu - điều này chỉ cho thấy rằng một số ký hiệu của 'Thượng' là hữu ích. Ném tất cả chúng ra (trừ I và T) là một niềm vui hơn là một nỗ lực chu đáo để tìm ra một hệ thống tốt hơn.
gbjbaanb

2
@ScottWhitlock: Đối với tôi, IAnimaldễ đọc hơn nhiều AnimalInterface. Tên dài dòng được ưu tiên ngoại trừ trong trường hợp khi một quy ước ngắn đơn giản có thể được sử dụng cho một cái gì đó xảy ra thường xuyên đủ. Và giao diện là một trường hợp như vậy.
maaartinus
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.