it-swarm.com.de

Verstößt der neue nullbedingte Operator von C # 6.0 gegen das Gesetz von Demeter?

Das Gesetz von Demeter besagt Folgendes:

  • Jede Einheit sollte nur begrenzte Kenntnisse über andere Einheiten haben: nur Einheiten, die "eng" mit der aktuellen Einheit verwandt sind.
  • Jede Einheit sollte nur mit ihren Freunden sprechen. Sprich nicht mit Fremden.
  • Sprechen Sie nur mit Ihren direkten Freunden.

In C # 6.0 wurde ein neuer Operator namens nullbedingter Operator eingeführt. IMHO erleichtert es das Codieren und verbessert die Lesbarkeit. Es macht es aber auch einfacher, mehr gekoppelten Code zu schreiben, da es einfacher ist, durch Klassenfelder zu navigieren und bereits auf Null zu prüfen (so etwas wie var x = A?.B?.C?.D?.E?.F?).

Ist es richtig zu behaupten, dass dieser neue Betreiber gegen das Gesetz von Demeter verstößt?

29
Arthur Rizzo

Ist es richtig zu behaupten, dass dieser neue Betreiber gegen das Gesetz von Demeter verstößt?

Nein* *


* * Der bedingte Nulloperator ist ein Tool innerhalb der Sprache und des .NET Frameworks. Beliebig Das Tool kann missbraucht und auf eine Weise verwendet werden, die die Wartbarkeit einer bestimmten Anwendung beeinträchtigen kann.

Die Tatsache, dass ein Werkzeug kann missbraucht werden, bedeutet jedoch nicht zwangsläufig, dass es hat missbraucht werden muss oder dass das Werkzeug gegen bestimmte Prinzipien verstößt. das kann gehalten werden.

Das Gesetz von Demeter und andere sind Richtlinien über wie Sie sollten Ihren Code schreiben. Es richtet sich an Menschen, nicht an die Werkzeuge. Die Tatsache, dass die C # 6.0-Sprache ein neues Tool enthält, wirkt sich also nicht unbedingt auf wie aus. Sie sollten Ihren Code schreiben und strukturieren.

Bei jedem neuen Tool müssen Sie es als ... bewerten, wenn der Typ, der Ihren Code verwaltet, ein gewalttätiger Psychopath ist ... . Beachten Sie erneut, dass dies eine Anleitung für die Person ist, die den Code schreibt, und nicht für die verwendeten Tools.

44
user53019

Art von.

Wenn Sie nur einen Zugriff ausführen (a?.Foo) dann ist es äquivalent zu:

a == null ? null : a.Foo

was die meisten Menschen zustimmen würden, ist kein Verstoß gegen das Gesetz von Demeter. Zu diesem Zeitpunkt ist es nur syntaktischer Zucker, um die Lesbarkeit zu verbessern.

Alles andere als das, und es würde wahrscheinlich gegen das Gesetz von Demeter verstoßen, und diese Funktion fördert tendenziell diese Art der Verwendung. Ich würde sogar sagen, dass die oben genannte "gute" Verwendung allein nicht ausreicht, um diese Art der Änderung der Sprache zu rechtfertigen. Ich gehe daher davon aus, dass sie die weniger eindeutig gute Verwendung unterstützt.

Es sei jedoch daran erinnert, dass das Gesetz von Demeter kein Gesetz an sich ist, sondern eher eine Richtlinie. Viel Code verletzt es und funktioniert gut. Manchmal ist die Einfachheit des Designs oder des Codes mehr wert als das Risiko eines Verstoßes gegen das Demeter-Gesetz.

10
Telastyn

Betrachten wir sowohl den Operator für sich als auch die stark verkettete Verwendung, die Sie dafür haben.

Allein .?A hängt von der gleichen Kenntnis der Klasse ab, die der linke Wert ist, und von dem Typ, der von der Methode zurückgegeben wird wie .A != null tut, nämlich. Es muss wissen, dass die Eigenschaft A vorhanden ist und einen Wert zurückgibt, der mit null verglichen werden kann.

Wir können nur argumentieren, dass dies gegen das Gesetz von Demeter verstößt, wenn typisierte Eigenschaften dies tun. Wir sind nicht einmal gezwungen, A als konkreten Typ zu haben (sein Wert könnte von einem abgeleiteten Typ sein). Die Kopplung ist hier minimal.

Betrachten wir nun var x = A?.B?.C?.D?.E?.F.

Dies bedeutet, dass A von einem Typ sein muss, der null sein kann, oder eine B -Eigenschaft haben kann, die von einem Typ sein muss, der null sein kann, oder eine C haben kann Eigenschaft usw., bis der Typ der Eigenschaft E etwas ist, das null sein oder eine Eigenschaft F haben kann.

Mit anderen Worten, wir müssen dies entweder mit einer statisch typisierten Sprache tun oder eine Einschränkung auf die Typen angewendet haben, die zurückgegeben werden können, wenn die Typisierung lose ist. C # verwendet in den meisten Fällen statische Typisierung, daher haben wir nichts geändert.

Wenn wir dann hätten, würde der folgende Code auch das Gesetz verletzen:

ExplicitType x;
var b = A.B;
if (b == null)
  x = null;
else
{
  var c = b.C;
  if (c == null)
    x = null;
  else
  {
    var d = c.D;
    if (d == null)
      x = null;
    else
    {
      var e = d.E;
      if (e == null)
        x = null;
      else
        x = e.F;
    }
  }
}

Welches ist genau das gleiche. Dieser Code, der die Kopplung verschiedener Elemente verwendet , muss über die gesamte Kopplungskette "Bescheid wissen", verwendet jedoch Code, der nicht verletzt das Gesetz von Demeter, um dies zu tun, wobei jede Einheit eine genau definierte Kopplung mit der nächsten hat.

9
Jon Hanna

Objekte können erstellt werden, um Verhaltensweisen zu kapseln oder Daten zu speichern, und Objekte können erstellt werden, um mit externem Code geteilt oder privat von ihrem Ersteller gehalten zu werden.

Auf Objekte, die zum Einkapseln von Verhalten (ob freigegeben oder nicht) oder zum Teilen mit externem Code (unabhängig davon, ob sie Verhalten oder Daten einkapseln) erstellt wurden, sollte im Allgemeinen über ihre Oberflächenschnittstelle zugegriffen werden. Wenn datenhaltige Objekte ausschließlich zur Verwendung durch ihren Ersteller erstellt werden, gelten jedoch nicht die normalen Law-of-Demeter-Gründe für die Vermeidung eines "tiefen" Zugriffs. Wenn ein Teil einer Klasse, die Daten im Objekt speichert oder bearbeitet, so geändert wird, dass ein anderer Code angepasst werden muss, kann garantiert werden, dass der gesamte Code aktualisiert wird, da - wie oben erwähnt - das Objekt für erstellt wurde die ausschließliche Verwendung einer Klasse.

Während ich das denke? Der Operator hätte vielleicht besser entworfen werden können. Es gibt genügend Situationen, in denen Objekte verschachtelte Datenstrukturen verwenden, sodass der Operator viele Anwendungsfälle hat, die nicht gegen die im Gesetz von Demeter festgelegten Prinzipien verstoßen würden. Die Tatsache, dass es zur Verletzung des LoD verwendet werden könnte, sollte nicht als Argument gegen den Betreiber verstanden werden, da es nicht schlechter als das "." Betreiber in dieser Hinsicht.

5
supercat