6

これは悪い設計の証拠だと思いますか?

//FooType and BarType not in the same hierarchy
bool operator==(const FooType &, const BarType &);
bool operator<(const FooType &, const BarType &);

たとえば、FooTypedoubleエポックからの秒数を測定BarTypeし、UTC で日付を提供する 3 つの整数 (年、月、日) のタプルである場合、上記のような比較は「意味があります」。

このようなタイプ間の比較を見たことがありますか? 彼らは C++ コミュニティで眉をひそめていますか?

4

4 に答える 4

3

個人のビジョンと経験

私は個人的に、異なるタイプ間の比較に眉をひそめません。コードの可読性が向上する可能性があるため、私はそれをお勧めします。あなたがしていることをより論理的に見えるようにします。基本的な数値型、おそらく文字列と文字以外では、型内の論理的な比較を行うのは難しいと思います。また、多くの人に会ったことを覚えていません。ただし、このように使用される算術演算子はたくさんあります。

それらの使用方法

あなたがしていることに注意する必要があります。理由があってほとんど使われていません。2 つの異なるタイプを比較する関数を提供する場合、結果は論理的であり、ユーザーが直感的に期待するものでなければなりません。また、適切なドキュメントを作成することも望ましいです。Mark Ransom も言っていますが、ユーザーが双方向で比較できれば良いのです。演算子を使用した比較が十分に明確ではないと思われる場合は、名前付き関数の使用を検討する必要があります。演算子が複数の意味を持つ場合、これは非常に優れたソリューションでもあります。

何がうまくいかないのか

あなたが書いたものでユーザーが何をするかを完全に制御することはできません。tletnes は、2 つの整数を比較する良い例を示しましたが、結果には意味がありません。これに反して、2 つの異なるタイプの比較は非常に正しい場合があります。秒を表す float と整数はよく比較できます。

算術演算子

論理の次に、算術演算子を使用した型内の例を示したいと思います。算術演算子は、型内の使用法について話すときの論理演算子によく似ています。

2 次元のベクトルと正方形の演算子 + があるとします。これは何をしますか?ユーザーはそれが正方形をスケーリングすると思うかもしれませんが、別のユーザーはそれが翻訳されると確信しています! この種の問題は、ユーザーにとって非常に苛立たしいものになる可能性があります。適切なドキュメントを提供することでこれを解決できますが、私が個人的に好むのは、Translate などの具体的に名前が付けられた関数です。

結論

型内論理演算子は便利で、きれいなコードを作成できますが、使い方を誤るとすべてが複雑になります。

于 2013-07-09T14:47:02.367 に答える
1

適切な設計では、互換性のある意味の値のみを比較する必要があります。一般に、型は意味を知る良い手がかりですが、最後の単語ではありません。実際、多くの場合、次の 2 つの整数のように、同じ型の 2 つの値が互換性のない意味を持つ場合があります。

int seconds = 3 //seconds
int length = 2; //square inches
if(seconds >= length){
    //what does this mean?
}

この例では、長さと秒を比較していますが、両者の間に意味のある関係はありません。

int test_duration = 3 //minutes
float elapsed_time = 2.5; //seconds
if((test_duration * 60) >= elapsed_time ){
    //tes is done
}

この例では、異なるタイプ (および単位) の 2 つの値を比較しますが、それらの意味は互換性があります (どちらも時間を表します)。そのため (2 つがそのように格納された理由 (API の使いやすさなど) には正当な理由があると仮定します)。 ) これは良いデザインです。

于 2013-07-08T16:38:19.997 に答える