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 và 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ã.
"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