Tôi có nên đặt các phương thức mở rộng của một giao diện trong tệp interface.cs không?


8

Hãy tưởng tượng thiết lập này:

public interface IMass{
    double Mass {get;}
}

public static class IMassExtension {
    public static double ToKg(this IMass massObject) {
        return massObject.Mass / 1000.0;
    }

    public static double CalculateInteractiveGravity(this IMass massObject, IMass otherMassObject)          
    {
         return blah;
    }
}

Bạn có thể đặt lớp mở rộng trong cùng một tệp với giao diện (ví dụ IMass.cs) hoặc nên ở trong một tệp riêng (IMassExtension.cs)?


Một lớp cơ sở là không thể ở đây. Hãy tưởng tượng

public class Person : Animal, IMass {}

public class House : Building, IMass {}

@Yusubov Lớp cơ sở sẽ không hoạt động ở đây, câu hỏi được cập nhật
Moop

Câu trả lời:


13

Vâng, điều đó hoàn toàn tốt. Hơn nữa, tôi sẽ khuyến khích bạn làm điều đó, vì nó làm cho chức năng có sẵn trong giao diện dễ khám phá hơn, đồng thời giảm tiếng ồn trong "chức năng nào trong csproj này?" xem trong studio hình ảnh.

Các đối số duy nhất tôi đã nghe chống lại điều này là:

  • "nhưng sau đó bạn có 2 loại cho mỗi tệp!" - hướng dẫn có mặt để giúp bạn, không trói tay bạn. Bạn sẽ làm cho nó chỉ có một loại nếu bạn có thể.
  • "nhưng tiện ích mở rộng đó sử dụng XYZ!" - vâng, nếu bạn không bao gồm phương thức nếu đó là một lớp trừu tượng, thì bạn cũng không nên kết nối nó với giao diện. Đó không phải là vấn đề với thực tiễn này, nhưng với thiết kế của bạn.

Các tính năng ngôn ngữ mới cải thiện khá nhiều điều này hơn nữa
user1496062

2

Tóm lại: Có các phương thức mở rộng trong một tệp riêng biệt sẽ là cách tiếp cận. Nó cũng rất quan trọng để đặt tên cho các phần mở rộng một cách thích hợp, vì điều đó chắc chắn sẽ an toàn thời gian trong quá trình bảo trì.

Tôi chắc chắn sẽ thích cái tên MassExtensionshơn IMassExtensions. Lý do là với hầu hết các lập trình viên một tiền tố I trên một loại ngụ ý rằng đó là một giao diện. Đây là cả một mẫu rất phổ biến và là một phần của Nguyên tắc Thiết kế .NET.

Việc thêm tiền tố I cho trường hợp phương thức mở rộng sẽ phá vỡ cả các giả định và hướng dẫn đã thiết lập.

Cũng có quyền ưu tiên cho điều này trong Thư viện lớp cơ sở. Phần lớn các phương thức mở rộng có sẵn IEnumerableđược chứa trong loại Enumerable.

Các bài viết liên quan sau đây có thể hữu ích:


Bài viết trên blog này khuyến cáo không nên cùng không gian tên: blogs.msdn.com/b/vbteam/archive/2007/03/10/...
Moop

Đồng ý, nên có không gian tên riêng của họ
Yusubov

1

Thông thường, tôi sẽ không đặt các phương thức mở rộng trong cùng một tệp với giao diện. Cùng thư viện / gói? Chắc chắn rồi.

Trong ví dụ này, tôi chắc chắn sẽ không. Điều gì xảy ra nếu ai đó thực hiện hàng loạt trong các đơn vị đế quốc (sên)? ToKg () phải có trong giao diện (và có thể là toSlug (), nhưng về mặt kỹ thuật sẽ có thể lấy được từ toKg ()) và các phương thức mở rộng sẽ là các phương thức như toG (), toMcg (), v.v. có thể được thực hiện bằng các phương thức giao diện.


0

Tôi sẽ đặt nó trong một tệp riêng biệt và tôi sẽ đặt cho nó một cái tên mô tả hơn là "IMassExtension.cs". Có lẽ một cái gì đó như "MassConversions.cs", vì đó là những gì lớp thực sự làm.

Đừng quên, các phương thức mở rộng vẫn có thể được gọi như thể chúng là các phương thức tĩnh đơn giản (ví dụ MassConversions.ToKg(massObject)), do đó, lớp nên được đặt tên theo ý đó. Ngoài ra, lớp mở rộng của bạn không phải là một giao diện, do đó, có thể gây hiểu nhầm khi đặt tên cho nó với chữ 'I' hàng đầu.


Chà, đây chỉ là một ví dụ đơn giản, tôi có một loạt các phương thức mở rộng để làm những việc khác nhau và không có tên chung nào cho nó
Moop

Đó có thể là một dấu hiệu cho thấy một số suy nghĩ xa hơn nên được đưa vào tổ chức các chức năng. Các lớp "bồn rửa chén" thường là nguồn gây đau đớn và thường nên tránh. Chỉ vì chức năng được nổi lên dưới dạng các phương thức mở rộng không có lý do gì để từ bỏ cấu trúc lớp tốt.
Eric King

Tôi đã cập nhật câu hỏi để cho thấy một lý do có thể tại sao nó hữu ích cho thiết kế này.
Moop

Tôi thấy cập nhật của bạn, và bình luận của tôi vẫn áp dụng. Tạo các lớp riêng biệt (được đặt tên thích hợp) cho các loại chức năng riêng biệt. Theo tôi, việc nhét tất cả chúng vào cùng một lớp là thuận tiện, nhưng cẩu thả.
Eric King

Bạn đang nói điều đó Animial : MassBuilding : Massnếu Masslà một lớp cơ sở?
Moop
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.