2011-08-14 9 views
2

だが、私は(名前円がランダムだったとは意味を持たない)クラスがあるとしましょう。一方で独自のgetメソッドを持たないsetメソッドを持つのは悪い習慣ですか?

Class circle{ 
    double colorFrequency_; 
public: 
    void setColor(double colorFrequency){ colorFrequency_=colorFrequency; } 
    void setColor(string colorName){ colorFrequency_=colorNameToFrequency(string colorName); } 
    double getColorFrequency() 
    string getColorName(){ /* converts color frequency into a string containing the name of a color it's close to, like "red" */ } 

} 

を、setColorを呼ばれる方法ではなく、GETCOLORと呼ばれるものを持っている矛盾したようだが、他の代わりにsetColorFrequencyとsetColorNameという関数があれば、setColorNameはgetColorNameの出力だけでなく、setColorFrequencyの出力にも影響するため、これらの名前は完全に説明的ではありません。

setColorという関数を持つのは奇妙ですが、getColorという関数はありませんか?

答えて

7

メンバーの値をクラスのユーザーが取得するかどうかによって異なります。

珍しいかどうか、あなたのデザインが要求するものに固執する必要があります。

+0

私はあなたのデザインを尊重することに同意しますが、この場合は何も表示されず、setColorでオーバーロードを使用するように強制します。 setColorFrequencyとsetColorNameも賢明です。 –

+3

@JürgenStrobel setColorFrequencyとsetColorNameは、2つの異なる*ものを更新するように聞こえるが、そうではない。オーバーロードを避ける場合はsetColorFromNameまたはsetColorFromFrequencyを設定してください。 –

+1

@pst SetColor(double colorFreq)とSetColorFromName(string colorName)はどうですか?何が起こっているのかを説明することは私には明らかです。 – BrandonSun

3

あなたがSetModel()機能が必要な場合がありますが、意味がGetModel()ことはありません1つのよく知られたデザインです:最後のモデル - ビュー - プレゼンター(MVP)パターンまたは(例えばMVC、MVVMなどのような)その変種

私は主にUIに取り組んでいます。ここでは、プリズムアーキテクチャ(WPFとSilverlight)に続いてMVPを実装しました。私たちのデザインは、このような何かを行く:

、ビューのためのモデルとしての地位を設定するビューの SetModel関数を呼び出し、そのプレゼンターですが、それはdoesnのため、ビュークラスには GetModel機能はありません
//C# code, but this design can written in C++ as well 
public class QueryPresenter : IQueryPresenter, /*other interfaces */ 
{ 

    public QueryPresenter(IQueryView view, /*other parameter*/) 
    { 
    //... 
    view.SetModel(this); 
    } 
} 

まったく意味がありません。

はい、それは設定機能を必要とする可能性のある設計に完全に依存しますが、機能を取得することは意味がありません。通常、このようなセット関数は、MVPパターンのように、他の方法で使用されるオブジェクトを「構成する」ために使用されます。集合関数は、協調的に動作するクラスが少ない設計でも使用できます。そのようなクラスは、お互いにアクセスできるように、friendとすることができます(必要に応じて)privateメンバーです。

0

どのように奇妙なのか分かりませんが、ゲッター/セッターの "ペアリング"がないことを明確にするために、ミュータントの名前をchangeColor(または同様のもの)に変更することを検討するかもしれません。

個人的に、私はCircleの完全indepent変換を残して、呼び出し側がそれを処理させることを好むだろう:

double colorNameToFrequency(const string& name) { ... } 
string colorFrequencyToName(double frequency) { ... } 

class Circle 
{ 
    double colorFrequency_; 
public: 
    void setColor(double colorFrequency); 
    double getColor() const; 
}; 

// Client code 
Circle c; 
c.setColor(colorNameToFrequency("mint-green")); 
string name = colorFrequencyToName(c.getColor()); 

これは色の人間が読める形式として選択したものは何でもの独立したCircleクラスになります。

関連する問題