2012-07-04 31 views
11

thể trùng lặp:
Extension Methods vs Static Utility ClassPhương pháp mở rộng so với Helper Lớp

Tôi đang xây dựng một API chức năng chung mà thực hiện hành động dựa trên các đối tượng trong .NET. Ví dụ; Tôi đã tạo một hàm kiểm tra chuỗi để xem đó có phải là địa chỉ email không.

tôi có thể hoặc có:

static bool IsEmailAddress(string text) 
{ 
    return IsMail(text); 
} 

hoặc tôi có thể tạo ra một phương pháp khuyến nông sẽ được sử dụng như sau:

string text = "[email protected]"; 
if (text.IsEmailAddress()) 
{ 
} 

đó là phù hợp hơn, hoặc bạn có nghĩ rằng vì đây là một thư viện đa năng, tôi có thể triển khai kỹ thuật theo cả hai cách và cho phép nhà phát triển quyết định cái nào là tốt nhất cho họ?

+7

** BTW: ** sử dụng 'trả về IsMail (văn bản)' thay vì câu lệnh if. –

+0

Tôi muốn đi với các phương pháp mở rộng VÀ tái cấu trúc Mahmoud đề xuất. –

+3

Tôi nghĩ rằng đó không phải là trách nhiệm của 'chuỗi' để biết địa chỉ email là gì. Vì vậy, tôi không nghĩ rằng đây nên là một phương pháp mở rộng. – CodesInChaos

Trả lời

12

Tạo phương thức tiện ích có nghĩa là phương thức này sẽ tự động hiển thị trong khi intellisense khi người dùng sử dụng loại đó. Bạn phải cẩn thận không thêm nhiều tiếng ồn vào danh sách các phương thức mà các nhà phát triển duyệt (đặc biệt là khi tạo một khung công tác tái sử dụng). Ví dụ, khi các phương thức đó chỉ có thể sử dụng được trong một ngữ cảnh nhất định, bạn có thể sử dụng các phương thức tĩnh 'bình thường' tốt hơn. Đặc biệt là khi triển khai các phương pháp mở rộng cho các loại chung như string.

Ví dụ: phương pháp mở rộng ToXml(this string) hoặc phương thức mở rộng ToInt(this string). Mặc dù có vẻ khá thuận tiện để có các phương thức mở rộng này, việc chuyển đổi văn bản thành XML không phải là thứ bạn sẽ làm trong suốt ứng dụng và sẽ dễ dàng thực hiện XmlHelper.ToXml(someString).

Chỉ có một điều tệ hơn và đó là thêm phương thức tiện ích mở rộng trên object.

Nếu bạn đang viết một khuôn khổ có thể sử dụng lại, the book Framework-Design-Guidelines by Krzysztof Cwalina là điều tuyệt đối phải đọc.

+1

Đừng quên rằng phần mở rộng bị ràng buộc vào không gian tên - vì vậy cho đến khi bạn không chỉ định một không gian tên của phần mở rộng trong lớp máy khách của bạn - intellisense cho các phương thức của tiện ích mở rộng của bạn sẽ không xuất hiện. Một phần mở rộng khác thực sự là gì? - sau khi biên dịch - đó là lớp tĩnh với phương thức tĩnh - vì vậy tôi muốn sử dụng các phần mở rộng như là đường cú pháp và có cấu trúc tốt của các không gian tên của tôi thay vì tạo các StaticHelpers. –

2

Tôi thích Phương thức tiện ích mở rộng, vì mã của bạn là thanh lịch và bạn có thể xác định phương thức tiện ích mở rộng trên lớp được đóng kín của khung.

0

Một phương pháp mở rộng tự động là một phần của lớp tĩnh. Điều này có nghĩa là người tiêu dùng có thể sử dụng phương thức mở rộng hoặc gọi phương thức tĩnh từ lớp nếu cô ấy muốn. Tôi sử dụng các phương thức mở rộng nhiều nhất có thể, chúng dễ dàng hơn để khám phá nếu chúng được đặt trong không gian tên thích hợp.

0

Phương pháp mở rộng cho phép các nhà phát triển không biết chính xác những gì lớp trợ giúp được gọi và vị trí của nó, chưa kể đến thực tế của sự tồn tại của nó. Lưu ý rằng bạn vẫn cần đặt không gian tên của chúng trong mệnh đề using - có thể đặt chúng trong một số không gian tên chung cấp cao nhất cho ứng dụng của bạn.

2

Câu hỏi là bạn sẽ nhắm mục tiêu vào Khuôn khổ .NET nào? Nếu < 3.5 thì phương thức mở rộng không khả dụng. Nếu không, tại sao bạn sẽ tạo một lớp mới?

Các vấn đề liên quan