Ich habe Fälle erlebt, in denen es nützlich wäre, den Zugriff auf die API externer Bibliotheken und Frameworks einzuschränken, um negative Konsequenzen im System zu vermeiden.
In einer SharePoint-Anwendung kann es beispielsweise logisch erscheinen spList.Items.GetItemById
, ein Listenelement aufzurufen , auch wenn es sich um eine Schleife handelt, ohne zu wissen, dass dies zu erheblichen Leistungsproblemen führen kann.
Es kann auch sein, dass wir die Verwendung von SmtpClient verbieten müssen, um alle zu zwingen, unsere eigene Klasse zum Senden von E-Mails zu verwenden, um sicherzustellen, dass wir alle E-Mails in der Testumgebung ordnungsgemäß proxen und verspotten können.
Gibt es zuverlässige und einigermaßen einfache Möglichkeiten, diese Einschränkungen für externen Code zu erreichen, außer an bestimmten Stellen in unserem eigenen Code? Es ist nicht unbedingt erforderlich, den Zugriff auf diese Methoden / Klassen zu unterbinden, zum Beispiel durch Reflektion oder einfach durch Deaktivierung. Es sollte vielmehr eine strikte Warnung sein, dass sie nicht verwendet werden sollten. Erzwingen Sie vorzugsweise, dass der Programmierer aktiv Maßnahmen ergreift, um diese Einschränkungen zu umgehen, wenn dies möglich / erforderlich ist.
quelle
Antworten:
Da es sich bei der Frage speziell um C # handelt, gibt es eine compilerbasierte Lösung, mit der solche Regeln erzwungen werden können : Roslyn Analyzers . Sie können einen eigenen Analyzer schreiben, der den Zugriff auf bestimmte APIs als Kompilierungsfehler oder Warnung meldet.
Ein Beispielsatz von Analysatoren, der viele Beispiele für das Schreiben eigener Codes enthält, sind die StyleCop-Analysatoren , die die alte StyleCop-Funktion für C # ersetzen.
Allerdings können solche automatisierten Überprüfungen immer von Leuten umgangen werden, die entschlossen sind, "die Regeln zu brechen". Daher ist dieser Ansatz kein Ersatz für Code Reviews, wie in der Antwort von Karl Bielefeldt erörtert. Es kann bei solchen Überprüfungen behilflich sein, sollte sie jedoch nicht ersetzen.
quelle
Sie können zeitaufwändige Dinge tun, wie das Schreiben eines Wrappers um die externe API, der Ihre unerwünschten Vorgänge ausschließt, aber nichts geht über Schulungen und Codeüberprüfungen, denn unabhängig von den von Ihnen eingeführten Standards oder technischen Maßnahmen werden die Leute kreative Wege finden, um sie zu umgehen .
Zum Beispiel haben wir mehrere Services in Scala geschrieben, und eines der Dinge, die wir zur Zeit der Codeüberprüfung fragen, ist die Unveränderlichkeit, aber wir kommunizieren dies oft, indem wir das loswerden
vars
. Jemand hat neulich einen val x: ListBuffer [Boolean] verwendet , um eine einzelne veränderbare Variable als einziges Element in der Liste zu speichern . Sie könnenListBuffer
x keine andere zuweisen , aber Sie können die vorhandenen Elemente der Liste so oft ersetzen, wie Sie möchten. Genauso schlecht wie mit einemvar
, aber schlauer.Mit anderen Worten, Sie müssen überprüfen, ob Ihre technischen Lösungen von Personen umgangen werden. Wenn diese technischen Lösungen kostenintensiv sind und die Komplexität erhöhen, können Sie auch einfach überprüfen, ob sie korrekt codiert sind.
quelle
AtomicMarkableReference.get
undAtomicStampedReference.get
).Karls Antwort ist zu 100% richtig. Konformität kann nicht garantiert werden. Berücksichtigen Sie jedoch zusätzlich zu Schulungen und Codeüberprüfungen die Verwendung von statischen Analysetools, um die Einhaltung sicherzustellen. (Anmerkung: Ich sagte "zusätzlich zu", da man diese genauso umgehen kann, wie Karl es sagte).
Der Vorteil der Verwendung von statischen Analysetools besteht darin, dass die mühsame Analyse von menschlichem Code entfällt, wenn nach Beispielen für die "mehrfache Verwendung von IEnumerable" oder nach Leistungsproblemen der Woche gesucht wird (oder zumindest das Gefühl besteht, dass ich es immer bin) anschauen). Auf diese Weise können sich die Code-Überprüfungen und das Training auf "interessantere" Themen konzentrieren.
Speziell für C # habe ich unten einige Vorschläge aufgenommen. Schließen Sie diese an Ihre Build-Umgebung an, und Sie können loslegen. Aber im Allgemeinen gibt es, unabhängig von der verwendeten Sprache, irgendwo ein statisches Analysetool.
Kopieren / Einfügen direkt von der Wikipedia-Seite, verwenden Sie die Wiki-Seite für die neuesten Informationen und Links: https://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#.NET
quelle
Um auf den in einer anderen Antwort enthaltenen Vorschlag "Schulung und Codeüberprüfung" einzugehen: Da es sich bei dem Code, den Sie verbieten möchten, um legalen Code handelt, können Sie nicht darauf zählen, dass der Compiler dies verhindert, und Sie müssen sich auf einen späteren Prozess verlassen. die Überprüfung.
Dies kann (und sollte) sowohl manuelle als auch automatische Überprüfungsschritte umfassen:
Bereiten Sie eine Checkliste mit bekannten Problemen vor und gehen Sie diese nacheinander in Ihren manuellen Code-Überprüfungen durch. Führen Sie eine wiederkehrende Besprechung durch, um die Checkliste zu überprüfen und zu aktualisieren. Wenn ein böser Fehler aufgefangen und analysiert wird, fügen Sie ihn der Checkliste hinzu.
Fügen Sie Eincheckregeln hinzu, um nach bekannten Mustern zu suchen. Das Schreiben kann kompliziert sein, aber für ein großes Projekt kann es im Laufe der Zeit nützlich sein. Mit TFS können Sie Regeln in C # schreiben, und andere Buildsysteme haben ihre eigenen Hooks. Erwägen Sie die Verwendung von Gated Builds, um Check-Ins abzulehnen, die dem Muster entsprechen. Ja, es verlangsamt die Entwicklung, aber nach einer bestimmten Projektgröße und Komplexität kann es eine gute Sache sein, die Entwicklung zu verlangsamen.
quelle
Möglicherweise kann Ihnen der Compiler dabei helfen, unerwünschte Anrufe abzufangen.
Benennen Sie Klassen / Methoden des Codes in Ihrer eigenen Bibliothek um, die nicht von externen Bibliotheksclients verwendet werden sollen. Alternativ können Sie Klassen / Methoden intern machen und Interna zu den Klassen hinzufügen, die diese verwenden dürfen.
Externe lib-Benutzer erhalten eine Kompilierungsfehlermethode / -klasse, die nicht gefunden wurde.
Verbotene Klassen / Methoden aus öffentlichen Bibliotheken: Erstellen Sie denselben Namespace / dieselbe Klasse / Methode in Ihrer Bibliothek
Externe Benutzer von lib erhalten einen Kompilierungsfehler, weil eine doppelte Klasse gefunden wurde
[aktualisieren]
quelle