2009-07-06 11 views
5

流暢なインターフェースは多くのタスクにとって非常に便利だと考えています。しかし、私は1つのクラスで流暢なメソッドとメソッドを変更してしまうと、不安を感じます。1つのクラスで流暢なインターフェースと流暢でないインターフェースを混在させる

だけの例では、(それは少し不自然だ、私と一緒にご負担ください):

トリミング、文字列ユーティリティクラスを想定すると、チェーン化のために良いようだ:

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

他の方法は、自然に新しいオブジェクトを返します:

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

そのthere'sa第三種、 - それ自体で - 論理オブジェクト RETを変異させるだろう新しいものをURN:私は個別に各メソッドのために最も明白である署名を使用する場合

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

、私は、これらの3つのタイプで終わる、と私はそれがあるクラスを消費するための非常に直感的ではありません怖いです、特に戻り値の型がmroe以下であるためです。 SplitTokenのようなメソッドは、コア機能を提供するので -


私はすでにStrは不変作りに対して決定しました。私の主な問題は、流暢な方法を混ぜることです。あなたは何をしますか?

  • は「1が流暢である場合は、すべての変更方法が堪能でなければなりません」(下記参照)サブインターフェースにそれらを移動

    そのインターフェイス

  • で流暢な方法を使用していませんか?

  • 流暢な方法に接尾辞を付けてください。

  • 心配ですか?

  • ???

サブインターフェースのアイデア:

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

私は本当に余分な「流暢」好きではない、この上未定だ - それは何C++で

メソッド呼び出しの特にことあなたは考える?

[編集]ここでは、コード内に英語の文章を作成する上級の意味ではなく、単一のインスタンスで連鎖メソッド呼び出しの基本的な意味で「流暢」を使用しています。

答えて

3

私は流暢なインターフェイスで多くの作業をしていませんが(一般的にはDSLで遊んでいましたが)、このアプローチには役立つかもしれませんが、この場合は特に必要ありません。たぶん私は何かを見逃しているかもしれませんが、あなたがここで終わったことである何かへの参照なしで単一の文字列上でたくさんのアクションを実行する可能性は低いようです。私は多分それだと思う

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

:加えて、あなたはこのチェーンでは何が起こるかを考える場合は特に、流れるようなインターフェイスの目的に違反すると再び思わチェーンの途中で新しいオブジェクトに移行していますこのタイプの比較的低レベルのユーティリティクラスは、流暢なインターフェイスを試すには間違った場所です。あなたのオブジェクトが一時的でコアロジックに付随している場合よりも、永続的かつ集中的な注意を払う必要がある場合、流暢性は私にとってははるかに重要です。

+0

"あなたはチェーンの真ん中の新しいオブジェクトに移行しています" - まさにそれが私の心配の核心です。 firstName = line.SplitToken(...)ですが、Trim()はカノニカルなことに思えますが、今はチェーンなしでスイングしようとします。 – peterchen

関連する問題