Beim Erstellen einer benutzerdefinierten 3D-Klasse Point
mit Koordinatenwerten mit einfacher Genauigkeit in C# musste ich eine Methode schreiben, um den Abstand zwischen zwei Punkten zu berechnen. Dann dachte ich über die A -> B
Graphnotation, die "von A nach B" bedeutet, und überlegte, den >
Operator zu überladen, da es keinen Sinn hat, über einen Punkt A zu denken, der "größer" ist als ein Punkt B (außerdem kann der Operator ->
nicht überlastet sein).Kann verschleierter Code manchmal nützlich sein?
Also hat ich die folgenden Methoden:
/// <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));
}
Dies führt zu Code wie folgt:
var manhattan = A > B;
var euclidean = A >= B;
Der Code scheint verschleiert zu werden, aber wenn man den Griff davon bekommt, ist es durchaus einfach zu lesen und kürzer als mit A.DistanceTo(B)
.
Die Frage ist, sollte ich diese Art von Code vollständig vermeiden? Wenn ja, aus welchem Grund? Ich bin ziemlich besorgt mit Clean Code, und ich bin mir nicht sicher, ob das sauber oder nicht sein könnte. Wenn Sie denken, dass ein solcher Code manchmal erlaubt ist, könnten Sie Beispiele bereitstellen?
In diesem speziellen Fall, ja, weil der '> =' Operator fast allgemein als "größer als oder gleich" bekannt ist, und Sie das hier stark untergraben. Die meisten Leute würden sich diesen Operator anschauen und denken: "Warum sagt es mir nicht, ob" A "größer ist als" B "?" – casperOne
In 6 Monaten werden Sie Ihren Code beibehalten und sich fragen, warum Sie überprüfen, ob A größer als B ist. Ist es so schlimm, stattdessen eine 'DistanceTo'-Methode zu verwenden? Das erklärt mir klarer, was Sie tun. – Default
Vielleicht können Sie einen anderen Operator nehmen, der mit Klassen keinen Sinn macht, wie >> (Bitverschiebung) – Gusman