2016-05-12 5 views
-2

C#で単精度座標値を使用してカスタム3D Pointクラスを作成する際に、2点間の距離を計算するメソッドを作成する必要がありました。それで、私はA -> Bのグラフ表記が "AからBへ"を意味すると考えました。そして、点Aが点Bより大きいと考えるのは意味がないので、>演算子のオーバーロードについて考えました(さらに、->演算子は過負荷になる)。難読化されたコードは時々役立つことができますか?

だから私は、次のメソッドを作成しました:これは、このようなコードになり

/// <summary> 
/// Calculates the Manhattan distance between the two points. 
/// </summary> 
public static float operator>(Point p1, Point p2) 
{ 
    return Math.Abs(p1.X - p2.X) + 
      Math.Abs(p1.Y - p2.Y) + 
      Math.Abs(p1.Z - p2.Z); 
} 

/// <summary> 
/// Calculates the euclidean distance between the two points. 
/// </summary> 
public static double operator>=(Point p1, Point p2) 
{ 
    return Math.Sqrt(Math.Pow(p1.X - p2.X, 2) + 
        Math.Pow(p1.Y - p2.Y, 2) + 
        Math.Pow(p1.Z - p2.Z, 2)); 
} 

を:

var manhattan = A > B; 
var euclidean = A >= B; 

コードを難読化しているようだが、あなたはそれの把握を得れば、それはかなりあります簡単に読むことができ、A.DistanceTo(B)を使用するよりも短くなります。

私はこの種のコードを完全に避けるべきですか?もしそうなら、理由は何ですか?私はきれいなコードにかなり心配しています、そして、私はこれがと考えられると確信していませんかどうか分かりません。そのようなコードが許されると思われる場合は、例を挙げることができますか?

+0

'> = '演算子はほぼ普遍的に「より大きい」または「等しい」として知られているため、ここではそれをひどく邪魔しています。ほとんどの人がその演算子を見て、「なぜAがBよりも大きければ教えてくれないの? – casperOne

+3

6ヶ月であなたのコードを維持し、なぜAがBよりも大きいかどうかをチェックしているのだろうかと思い始めます。代わりに 'DistanceTo'メソッドを使うのは悪いですか?それは、私には、あなたがしていることをより明確に説明しています。 – Default

+0

クラスで意味をなさない別の演算子を使うことができるかもしれません。>>(ビットディスプレースメント) – Gusman

答えて

3

一般的に、この種のコードは避けるべきです(おそらくそれがより深いDSLの一部でない限り)。

予期しない動作をする一般的な演算子やメソッドをオーバーライドすると、コードを取り上げ、理解し、デバッグすることが非常に難しくなります。

あなたは本を読んでいるとしますが、その言葉は英語のように見えますが、著者はいくつかのキーワードの意味を後ろの付録でメモを取って変更していますので、それぞれの文章は、あなたが思っていることを意味します。

コードは、人が読んでください。あなたはその作業をより簡単に行うことができますし、あなたが組み込んだ驚きは少なくなります。

+0

に移行する必要があります私はあなたの答えを完全に理解していますが、F#などの関数型プログラミング言語をどのように説明していますか?これらの言語のコードはすべて可読ですが、人気が高まっています。 – Charlie

+0

また、ゲーム(3つのプログラム、あなたは私を得る;))演算は、演算子を置換するのが非常に一般的ですが、非常に通常の変更はベクトルのドットプロダクトに "*"演算子を変更することです。 – Gusman

+0

私は関数型言語の読みやすさは、親しみやすさの問題だと主張したいと思います。機能的な言語は非常に読みやすい(簡潔な!)ことができます。重要なのは、F#を学ぶと標準的なスタイルで書くべきだから、F#を知っている誰かがそれを読むのは簡単です。 – Paolo

関連する問題