2016-03-03 19 views
6

Tôi có một lớp học MyClass có lỗi trong quá trình triển khai. Lớp này là một phần của thư viện, vì vậy tôi không thể thay đổi việc triển khai lớp vì nó sẽ thay đổi hành vi âm thầm cho khách hàng hiện tại (khách hàng trong trường hợp này có thể dựa vào lỗi: Xem ví dụ (https://connect.microsoft.com/VisualStudio/feedback/details/790160/httpclient-throws-operationcanceledexception-insead-of-timeoutexception))Quy ước đặt tên: Cách đặt tên cho một phiên bản khác của cùng một lớp?

Tôi cần phải tạo phiên bản thứ hai của cùng một lớp bao gồm sửa lỗi. Tôi đã nhìn thấy các tình huống như thế này trước đây nhưng việc đặt tên tôi đã thấy luôn tăng dần Ví dụ: MyClass2, MyClass3.

Những trường hợp này có thể khá hiếm, tuy nhiên tôi đã tự hỏi liệu có cách nào tốt hơn để đặt tên cho các lớp "được phiên bản" này hay không. Tôi tưởng tượng một giải pháp phát triển theo thời gian và có nhiều lớp thuộc loại này, điều này có thể gây nhầm lẫn đặc biệt cho thư viện. Tôi tưởng tượng bản thân mình phải chọn giữa MyClass, MyClassV2, MyClassV3, vv

+0

Không chắc chắn nếu có một quy ước đặt tên tồn tại cho điều này, nhưng tôi sẽ sử dụng 'MyClassVX' và đánh dấu những cái trước đó đã lỗi thời. – thijmen321

+0

Người ta có thể tranh luận câu hỏi này chủ yếu dựa trên ý kiến, cũng như tất cả các câu hỏi về quy ước đặt tên. Có lẽ câu hỏi của bạn sẽ được tiếp nhận tốt hơn tại [programmers.stackexchange.com] (http://programmers.stackexchange.com)? –

Trả lời

4

Tôi đã tự hỏi liệu có cách nào tốt hơn để đặt tên cho các lớp "được phiên bản" này hay không.

Không có quy ước đặt tên .NET cho "các lớp sửa lỗi trong các lớp khác". Tôi sẽ tư vấn cho các nhà phát triển khác tại nơi làm việc của bạn và xem họ có bất kỳ công ước nào của công ty cho một điều như vậy hay không. Tôi nghĩ sự nhất quán có tầm quan trọng hơn tên thật.

Và trên một mặt lưu ý cho vấn đề của bạn, tôi sẽ không tạo ra một lớp mới nào cả. Tôi sẽ đánh dấu phương thức với DeprecatedAttribute và triển khai logic bên trong cùng một lớp, hiển thị một tập hợp các phương thức API mới được ghi lại đúng cách để khẳng định rằng chúng ở đây là một bản sửa lỗi. Các khách hàng của thư viện của bạn có lẽ đã quen thuộc với MyClass, và làm như vậy sẽ dễ dàng sử dụng cho họ, xen kẽ họ cần phải tự hỏi mỗi lần "phiên bản này tôi nên sử dụng".

2

tôi sẽ sao chép tất cả các hành vi của lớp hiện tại của bạn để một hình mới, đổi tên một bản gốc để chỉ ra rằng lớp là lỗi thời, đổi tên mới để tên thực tế từ trước và đánh dấu tên ban đầu (với tên mới ngay bây giờ) là [Obsolete] chỉ ra rằng nó không được sử dụng nữa. Vì vậy, tất cả các mã tiêu thụ tự động invokles hành vi mới. Vì vậy, lớp học mới của bạn với hành vi đúng là tên của lớp gốc, trong đó lớp bị lỗi nhận một số phiên bản chẳng hạn.

Đối với mã cũ, bạn có thể làm ngược lại, tạo một lớp mới với tên mới và đánh dấu lớp cũ là Obsolete. Tôi biết SDK có số phiên bản, số cuối cùng cho biết phiên bản mới nhất của lớp và tất cả những người khác có thuộc tính như vậy cùng với thông báo trong các tài liệu đề cập đến lớp được thay thế bằng phiên bản mới.

0

Tôi nghĩ tên lớp trùng lặp sẽ gây nhầm lẫn nghiêm trọng cho người khác làm thêm giờ. Bạn trích xuất phương thức với giao diện C# và triển khai phiên bản khác.

7

Trong một thế giới lý tưởng, các phiên bản mới sẽ giới thiệu chức năng bổ sung trong khi vẫn còn 100% khả năng tương thích ngược với các phiên bản API trước. Thật không may, thế giới lý tưởng vẫn còn khó nắm bắt, và nó không phải là luôn luôn có thể giữ lại khả năng tương thích ngược hoàn toàn. Hậu tố được phiên bản là mẫu thích hợp trong trường hợp này.

Quy ước đặt tên .NET tiêu chuẩn là sử dụng đánh số gia tăng, như Class, Class2, Class3, v.v. Điều này xuất phát từ quy ước đặt tên cho giao diện COM, được thiết kế cho chính xác trường hợp sử dụng bạn mô tả.Ví dụ: giao diện IHTMLDocument hiện có 8 phiên bản, từ IHTMLDocument lên đến IHTMLDocument8.

Các Framework Design Guidelines sổ gốc, bởi Cwalina và Abrams, một cách rõ ràng khuyến khích thực hành này, với các tác giả có cho biết:

DO sử dụng một hậu tố số để chỉ ra một phiên bản mới của API hiện có, nếu tên hiện tại của API là tên duy nhất có ý nghĩa (nghĩa là, nó là một tiêu chuẩn công nghiệp), và thêm bất kỳ hậu tố có ý nghĩa (hoặc thay đổi tên) không phải là một lựa chọn thích hợp.

// old API 
[Obsolete("This type is obsolete. Please use the new version of the same class, X509Certificate2."] 
public class X509Certificate { ... } 

// new API 
public class X509Certificate2 { ... } 

Quy ước cũ, tiếp theo là nhóm Windows ban đầu, là để thêm các hậu tố Ex với các phiên bản cải tiến mới-và-một API, mà xuất phát từ chữ "mở rộng". Tuy nhiên, điều này không có quy mô tốt, dẫn đến các hàm bị nhầm lẫn là ExEx. Tôi không nghĩ có một số ExExEx; mọi người sợ phải chạm vào các API đó. Các Khung Thiết kế Hướng dẫn khuyên rõ ràng chống thực tế này, các folks người đã đi vào kiến ​​trúc sư NET đã học được bài học của họ:

KHÔNG sử dụng "Ex" (hoặc tương tự) hậu tố cho một số nhận dạng để phân biệt với phiên bản cũ hơn của cùng một API.

[Obsolete("This type is obsolete. ..."] 
public class Car { ... } 

// new API 
public class CarEx  { ... }  // the wrong way 
public class CarNew  { ... }  // the wrong way 
public class Car2  { ... }  // the right way 
public class Automobile { ... }  // the right way 

Rõ ràng, như gợi ý mẫu mã mới nhất của họ, nếu bạn đang thêm hỗ trợ cho một tính năng cụ trong phiên bản mới của API, bạn sẽ được giảm giá tốt nhất đặt tên cho lớp mới/giao diện với một tham chiếu đến tính năng cụ thể đó. Và mặc dù ở trên đã tập trung gần như độc quyền trên các lớp và giao diện, cùng một logic sẽ giữ đúng cho bất kỳ chức năng thành viên của lớp đó có thể được thêm vào trong các phiên bản sau này. Hàm ban đầu có thể giữ nguyên tên ban đầu của nó, với hàm mới được thêm có tên khác phản ánh sự lặp lại của nó hoặc chức năng được thêm vào của nó.

+0

Được thăng hạng để đăng bài về các nguyên tắc thiết kế và các quy ước nổi bật. Trong khi các phương pháp không dùng nữa cũng sẽ là giải pháp ưa thích của tôi, giải pháp cụ thể này là cần thiết trong trường hợp cạnh mà tôi có. – David

0

Để rõ ràng, nếu điều đó xảy ra, tôi sử dụng ClassV2. Điều đó cho biết đó là một phiên bản khác của lớp học.