2009-07-06 5 views
5

Tôi xem giao diện thông thạo rất thuận tiện cho nhiều tác vụ. Nhưng tôi cảm thấy khó chịu khi tôi kết thúc việc trộn các phương pháp thông thạo và sửa đổi các phương thức trong một lớp.Trộn giao diện thông thạo và không thành thạo trong một lớp

Chỉ cần một ví dụ (đó là một chút giả tạo, xin vui lòng chịu với tôi):

Giả sử một lớp chuỗi tiện ích, cắt tỉa dường như tốt cho chaining:

Str & Str::Trim() { return TrimLeft().TrimRight(); } 

Các phương pháp khác một cách tự nhiên sẽ trả về một đối tượng mới :

Str Str::GetFirstToken() const 
{ 
    // result = first token; 
    return result; 
} 

và there'sa loại thứ 3, đó - bởi chính nó - một cách logic sẽ biến những đối tượng ret Urn mới:

Str Str::SplitFirstToken() 
{ 
    result = GetFirstToken(); 
    // this = remainder 
    return result; 
} 

Khi tôi sử dụng chữ ký đó là rõ ràng nhất cho từng phương pháp riêng, tôi kết thúc với ba loại, và tôi sợ nó không phải là rất trực quan cho tiêu thụ các lớp học mà là trong đó, đặc biệt là vì kiểu trả về là mroe hoặc ít hơn giống nhau.


tôi đã quyết định chống lại việc Str bất biến - kể từ khi các phương pháp như SplitToken cung cấp chức năng cốt lõi. Vấn đề chính của tôi là trộn các phương pháp thông thạo Bạn sẽ làm gì?

  • không sử dụng phương pháp thông thạo trong giao diện mà

  • di chuyển chúng đến một tiểu giao diện (xem dưới đây)

  • "Nếu ai thông thạo, tất cả các phương pháp sửa đổi nên thông thạo"?

  • sử dụng tiền tố seocific cho phương pháp thông thạo?

  • đừng lo lắng?

  • ???

tiểu giao diện ý tưởng:

void CStr::Trim() { TrimLeft(); TrimRight(); } 
CStrFluent & Str::Fluent() { return CStrFluent(*this); } 
.... 
str.Fluent().TrimLeft().TrimRight(); 

Tôi chưa quyết định về vấn đề này, tôi không thực sự thích thêm "thông thạo" - đặc biệt rằng đó là một lời gọi phương thức trong C++

gì bạn nghĩ?

[sửa] Tôi đang sử dụng "thông thạo" ở đây theo ý nghĩa cơ bản của phương thức chuỗi cuộc gọi trên một cá thể đơn lẻ, không theo nghĩa tiên tiến trong việc tạo câu tiếng Anh trong mã.

Trả lời

3

Tôi đã không thực hiện nhiều công việc với giao diện thông thạo (mặc dù tôi đã chơi chung với DSL nói chung), nhưng có vẻ như với tôi rằng trong khi lớp học có thể tự vay cho phương pháp này, điều này không thực sự cần thiết trong trường hợp này . Có lẽ tôi đang thiếu một cái gì đó, nhưng có vẻ như với tôi rằng bạn không có khả năng làm một loạt các hành động trên một chuỗi duy nhất mà không có tham chiếu đến bất cứ điều gì khác, đó là những gì bạn đã kết thúc với ở đây.Bên cạnh đó, bạn đang chuyển sang các đối tượng mới ở giữa chuỗi, mà dường như một lần nữa để vi phạm mục đích của một giao diện thông thạo, đặc biệt là khi bạn xem xét những gì xảy ra trong chuỗi này:

Str String = OtherString.GetFirstToken().SplitFirstToken().Trim(); 

Tôi nghĩ có lẽ đó loại tiện ích tương đối cấp thấp này là nơi sai để thử một giao diện thông thạo. Lưu loát dường như với tôi quan trọng hơn nhiều khi đối tượng của bạn phải chịu sự chú ý liên tục, tập trung hơn khi chúng thoáng qua và phụ thuộc vào logic cốt lõi.

+0

"bạn đang chuyển sang đối tượng mới ở giữa chuỗi" - chính xác đó là cốt lõi của mối quan tâm của tôi, cũng được nói! Tôi sẽ cố gắng để swing mà không có chuỗi cho bây giờ, mặc dù firstName = line.SplitToken (...). Trim() có vẻ là một điều kinh điển để làm. – peterchen