web-dev-qa-db-ja.com

同じことをする異なる関数シグネチャを提供することは良い考えですか?

以下は、3つの値で構成されるC++クラスです。

class Foo{

    //Constructor
    Foo(std::string, int, char);

private:
    std::string foo;
    char bar;
    int baz;
};

パラメータタイプはすべて異なります。
順序が問題にならないように、コンストラクタをオーバーロードできます。

class Foo{

    //Constructors
    Foo(std::string, char, int);
    Foo(std::string, int, char);
    Foo(char, int, std::string);
    Foo(char, std::string, int);
    Foo(int, std::string, char);
    Foo(int, char, std::string);


private:
    std::string foo;
    char bar;
    int baz;
};

しかし、それは良い考えでしょうか?
クラス/関数に必要なものを知っていたので、私はそれを始めました。
私はそれが彼らを連れて行った順番をいつも思い出したわけではありませんでした。


同じコンストラクタを呼び出したかのように、コンパイラがこれを最適化すると想定しています。

//compiler will implement this with the same code? 
//maybe not.. I could call a function to get a parameter, 
//and that function could change the state of the program, before calling
//a function to get another parameter and the compiler would have to
//implement both
Foo foo1("hello",1,'a');
Foo foo2('z',0,"world");

順序が問題にならないように関数をオーバーロードすることについてのあなたの意見は何ですか?


また、私がいくつかのユーティリティ関数を書いているなら、
同じことをする異なる関数名を提供することは良い考えですか?

例えば。

void Do_Foo();
void DoFoo();
void do_foo();
//etc..

私はこれら2つの慣習を見ることはあまりありません。
私は習慣を破るか、受け入れるべきですか?

23
Trevor Hickey

[パラメーターの]順序が問題にならないようにコンストラクターをオーバーロードできます...しかし、それは良い考えですか?

番号。

コンストラクターのオーバーロードが異なると、意図したものとは逆の効果があります。あなたが後に来るプログラマーは、異なるオーバーロードが異なる動作をすることを期待し、「これらのオーバーロードのそれぞれによって、どのような異なる動作が表現されていますか?」

ほとんどのプログラマーは、事前定義された順序でメソッドパラメーターを使用するという規律を期待しており、IntelliSenseなどのツールは、入力時にパラメーターの期待される順序を通知します。


同じことをする複数の関数名を持つことは同じ問題です。プログラマは、バリアントの動作が異なることを期待しています。動作ごとに1つの関数またはメソッドを使用してください。一貫した命名パターンを採用してください。

93
Robert Harvey

時には、議論の間の交換をサポートすることが必要です。例えば:

double operator *(int, double);
double operator *(double, int);

オペランドが逆になっている場合、intdoubleの乗算で異なるものを計算することは望ましくありません。また、intsとdoublesを乗算すると、doubleが左に行くことをプログラマに強制することもできません。

同じことが次のように行われるため、これが演算子であることは重要ではありません。

footype plus(const footype &, const bartype &);
footype plus(const bartype &, const footype &);

それは本当に機能の種類に依存します。ほとんどのプログラマーはおそらく算術ライブラリーの可換性のサポートを望んでいますが、たとえば、I/Oライブラリー関数がすべての可能な引数の順序をサポートすることを必ずしも望んでいません。

問題はおそらく、関数呼び出しが関与する予定のネストに関係しています。算術演算子の柔軟性により、構文ツリーの全体的な構造を変更して、式全体を明確にすることができます。つまり、類似した用語などをグループ化します。

14
Kaz