Zeigen viele using / import-Anweisungen ein schlechtes Design oder einen schlechten Code-Geruch an?

13

In der Regel werden einige using-Anweisungen oben in der Klassendatei angezeigt. Beispiel:

using System.Collections.Generic;
using System.IO;
using System.Xml.Linq;

Aber in einem Projekt, an dem ich arbeite, sehe ich mehrmals 20 oder mehr Verwendungen / Importe in einer Klassendatei. Ist das schlechtes Design? Es scheint so, als ob Klassen, die darauf ausgelegt sind, eine Sache zu tun, sich nur auf wenige Komponenten stützen sollten.

Jon Raynor
quelle
1
Visual Studio verfügt über eine Option zum Entfernen nicht verwendeter usingAnweisungen. Vielleicht möchten Sie sehen, wie viele dieser 20 tatsächlich verwendet werden.
Dan Pichelman
@Dan -Sie werden alle verwendet, da ich ReSharper verwendet habe, um die nicht verwendeten auszusortieren.
Jon Raynor
Haben Sie versucht, eine IoC hinzuzufügen, in eine Konstruktorinjektion umzuwandeln und / oder einige Integrationspunkte in Inline-Lambdas umzuwandeln, um festzustellen, ob dadurch die Anzahl der usingAnweisungen verringert wird, ohne die Anzahl der Klassen erhöhen zu müssen? Bedenken Sie, dass eine zunehmende Anzahl von Klassen oder Quelldateien den Verwaltungsaufwand für den Quellcode erhöht.
Rwong
2
IoC versteckt nur das Problem.
Telastyn
1
Einige dieser Dinge sind fast nur Teil der Sprache und des Programmierstils, den sie fördern, wie zB Collections.Generic und LINQ, weshalb ich mich nicht unbedingt darum kümmern müsste. Ich würde mich wahrscheinlich auf die anderen konzentrieren. Die meisten Klassen sollten IO wahrscheinlich nicht direkt ausführen müssen. Wenn dies also überall zu finden ist, kann es zu einer Überschneidung von Verantwortlichkeiten oder einer schlechten Schichtung kommen, dies hängt jedoch von der Anwendung ab.
Erik Eidt

Antworten:

21

Es kann auf ein schlechtes Design hindeuten, ja. Es kann sein, dass die Klasse, die Sie betrachten, zu viele Dinge tut, aber es kann auch bedeuten, dass die Namespaces, die Sie importieren, wirklich stärker gekoppelt sind, als es die Namespace-Trennung impliziert. Dies kann an einem Überentwickeln oder einer Überabstraktion liegen, es kann sich aber auch nur um ein Design handeln, das nicht gut zur Verwendung passt.

Das heißt, es ist ein Geruch - manchmal führt es Sie zu etwas Schlimmem, und manchmal ist es nur ein falscher Alarm.

Telastyn
quelle
Ich denke, der wahre "Code-Geruch" wäre, wenn die importierten Namespaces alle oder größtenteils einen völlig anderen Zweck haben. Um ehrlich zu sein, hatte ich selten mehr als 6 bis 8 usingin einer einzelnen C # -Datei.
Greg Burghardt
2
Ich möchte Ihnen eine zweite +1 geben, wenn ich könnte, nur um den Begriff "Codegeruch" richtig zu verwenden!
Jörg W Mittag
! @Greg - Ich stimme zu, normalerweise sind die "Verwendungen" verwandt. Ich denke in diesem Fall ist es ein Fall über Abstraktion, weil etwa 15-20 der "Verwendungszwecke" von Anwendungsnamespaces und der Rest vom .net-Framework stammen.
Jon Raynor
2

Eine Klasse sollte nicht größer und nicht kleiner als das sein, was zur Bereitstellung einer beabsichtigten Funktion erforderlich ist.

In einer Anwendung habe ich eine Verschlüsselungsklasse, die einen Job hat: Daten verschlüsseln. Zwischen der Kernfunktionalität, der Protokollierung und der Ausnahmebehandlung benötigt die Umgebung 11 verschiedene Namespace-Importe, um diesen einen Job auszuführen.

Es fällt mir schwer, mir selbst zu sagen, dass ich Importe minimieren soll. Oder um den Erfolg meiner Klasse nur anhand der Anzahl der importierten Namespaces zu beurteilen. Ich kann dies nicht zu Recht isoliert als Hinweis auf den Erfolg einer Klasse verwenden. Importe sind für mich das Mittel zum Zweck der Klasse. Wenn der Job der Klasse genau definiert ist, kümmert sich alles andere innerhalb des unterstützenden Systems, einschließlich des Imports, um sich selbst.

Paulstgeorge
quelle