2008-10-20 36 views
8

Tôi có câu hỏi với giao diện thông thạo.Giao diện thông thạo trong C#

Chúng tôi có một số đối tượng được sử dụng như các đối tượng tham số cho một giao diện SQL, sau đây là một ví dụ:

using (DatabaseCommand cmd = conn.CreateCommand(
    "SELECT A, B, C FROM tablename WHERE ID = :ID", 
    SqlParameter.Int32(":ID", 1234))) 
{ 
    ... 
} 

Đối với một số các thông số này, tôi muốn để cho phép một số tùy chọn chuyên ngành, nhưng thay vì thêm nhiều thuộc tính hơn cho phương thức Int32 (mà chỉ là một trong nhiều), tôi nghĩ rằng tôi sẽ xem xét các giao diện thông thạo.

Dưới đây là một ví dụ mà tôi đã thêm những gì tôi đang nhìn vào:

SqlParameter.Int32(":ID", 1234).With(SqlParameterOption 
    .Substitute 
    .Precision(15) 
) 

Tôi biết hai lựa chọn những không có ý nghĩa đối với loại tham số, nhưng đó không phải những gì các câu hỏi là về.

Trong trường hợp trên, thay thế sẽ phải là thuộc tính tĩnh (hoặc phương thức nếu tôi chỉ thêm một số dấu ngoặc đơn) vào lớp SqlParameterOption, trong khi Precision sẽ phải là một phương thức thể hiện.

Nếu tôi sắp xếp lại chúng thì sao?

SqlParameter.Int32(":ID", 1234).With(SqlParameterOption 
    .Precision(15) 
    .Substitute 
) 

Sau đó, thay thế phải là thuộc tính thể hiện và Xác định phương pháp tĩnh. Điều này sẽ không biên dịch tất nhiên, tôi không thể có cả thuộc tính tĩnh hoặc thuộc tính tĩnh hoặc phương thức có cùng tên.

Làm cách nào để thực hiện việc này? Tôi hoàn toàn đi sai đường ở đây à?

Trong khi đọc lại câu hỏi, tôi đã có ý tưởng, cú pháp khác này dưới đây có ý nghĩa hơn không?

SqlParameter.Int32(":ID", 1234).With 
    .Precision(15) 
    .Substitute 

Trong trường hợp này cả hai sẽ là phương pháp thể hiện trên bất kỳ mục nào Với trả về, đây sẽ là lớp hoặc giao diện đặc biệt cho các tùy chọn SqlParameter như thế này. Tôi không chắc chắn tôi muốn kết xuất phần . Với, vì điều này sẽ hiển thị tất cả các phương pháp của đối tượng, thay vì chỉ thông thạo.

Tư vấn và một số url ngon sẽ được hoan nghênh nhất, tôi đã lùng sục trong nhiều ví dụ, nhưng họ có xu hướng hiển thị ví dụ như thế này:

order 
    .AddFreeShipping() 
    .IncludeItem(15) 
     .SuppressTax(); 

(nâng lên từ this page)


Chỉnh sửa: Theo dõi sau phản hồi Từ @marxidad:

class SqlParameterOption 
{ 
    public SqlParameterOption Precision(int p) {/* ... */; return this;} 
    public SqlParameterOption Substitute() {/* ... */; return this;} 
    /* ... */  
} 

/* ... */ 
SqlParameter.Int32(":ID", 1234).With(new SqlParameterOption() 
              .Precision(15) 
              .Substitute()); 

Với cách tiếp cận này, Với sẽ phải lấy đối tượng và áp dụng nó cho tham số. Tôi ổn với điều đó.

Nếu tôi sử dụng cú pháp tôi thêm vào như là một ví dụ, nó sẽ là như thế này:

SqlParameter.Int32(":ID", 1234).With 
           .Precision(15) 
           .Substitute()); 

Trong trường hợp này, Với sẽ không biết khi nào chuỗi kết thúc, vì vậy mỗi tùy chọn sẽ phải áp dụng của nó có hiệu lực trực tiếp.

Điều gì được ưa thích hơn? Rằng các tùy chọn xây dựng một đối tượng có hiệu lực sẽ phải được áp dụng sau, hoặc mỗi hiệu ứng sẽ áp dụng hiệu ứng của nó trực tiếp?

quyết định của tôi: Như @marxidad nói, nếu những thay đổi không thể đảo ngược, và có khả năng có thể là đối tượng của một sự đảo ngược, xây dựng nhà nước và thất bại tại một số điểm với một ngoại lệ là cách tôi sẽ đi.

Tuy nhiên, trong trường hợp này, tôi sẽ thực hiện một cách tiếp cận đơn giản hơn để sửa đổi đối tượng SqlParameter trực tiếp.

Trong trường hợp này, mã của tôi sẽ giống như thế này:

SqlParameter.Int32(":ID", 1234).With 
           .Precision(15) 
           .Substitute()); 

Edit: Gah, đó là cách nó đi khi tôi chỉ tập trung vào một điều.

tôi không thể sử dụng cú pháp đó, tôi sẽ đi với những điều sau đây, theo đề nghị của @marxidad:

SqlParameter.Int32(":ID", 1234).With(new SqlParameterOption() 
              .Precision(15) 
              .Substitute()); 

Lý do là tất nhiên rằng phương pháp mà sẽ đưa các đối tượng SqlParameter như một cuộc tranh cãi là không thể để đối phó với đối tượng được trả về bởi Với, vì vậy mặc dù đối tượng SqlParameter được xây dựng và thiết lập đúng cách, nó trở nên không tương thích với mục đích sử dụng. tất cả

Trả lời

8

SqlParameterOption's phương pháp có thể được phương pháp dụ trả về cùng một đối tượng:

class SqlParameterOption 
{ 
    public SqlParameterOption Precision(int p) {/* ... */; return this;} 
    public SqlParameterOption Substitute() {/* ... */; return this;} 
    /* ... */  
} 

/* ... */ 
SqlParameter.Int32(":ID", 1234).With(new SqlParameterOption() 
              .Precision(15) 
              .Substitute()); 

Re: xây dựng nhà nước được áp dụng sau so với việc áp dụng trực tiếp với mỗi cuộc gọi, nếu không có dụng phụ irreverisible thực hiệu ứng trong cả hai trường hợp, sau đó nó không quan trọng và nó tùy thuộc vào sở thích cá nhân của bạn. Nếu các tùy chọn được cam kết với mỗi cuộc gọi phương thức và có một cơ hội bạn có thể muốn hoàn tác, sau đó bạn có thể muốn xây dựng trạng thái trước và sau đó áp dụng nó. Nếu đối tượng tham số thực hiện xác nhận hợp lệ giữa các thuộc tính cho bạn khi bạn áp dụng chúng thì có thể tốt hơn nếu sử dụng ứng dụng trực tiếp để bạn nhận được phản hồi hợp lệ đúng cách.

1

Bạn có thể đã quá tải phương thức. Ví dụ, nếu nó là Substitute(). Bạn thường không thể có cả phiên bản tĩnh và phiên bản của một phương thức, nhưng các phương thức mở rộng có thể sử dụng một số ... nhưng nếu hai phiên bản của Substitute có ý nghĩa khác nhau thì sẽ đơn giản hơn nếu có các kiểu khác nhau được trả về, rằng hai biến thể của Substitute() không thể xung đột.

+0

Trong trường hợp này sẽ không có xung đột về ý nghĩa, câu hỏi đặt ra nhiều hơn về cách tôi tổ chức mã để nhận được những gì tôi muốn, theo cú pháp. Việc làm mới một thể hiện của đối tượng tùy chọn giải quyết vấn đề đó, như được hiển thị bởi marxidad. –

+0

Đủ công bằng - marxidad đã có +1 ;-p của tôi –

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