it-swarm.com.de

Verbieten Sie Aufrufe beliebiger Funktionen / Klassen in externem Code

Ich habe Fälle erlebt, in denen es sinnvoll wäre, den Zugriff auf die API externer Bibliotheken und Frameworks zu beschränken, um negative Folgen im System zu vermeiden.

In einer SharePoint-Anwendung kann es beispielsweise natürlich erscheinen, spList.Items.GetItemById, um ein Listenelement zu erhalten, auch in einer Schleife, ohne zu bemerken, dass dies zu großen 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äß vertreten und verspotten können.

Gibt es zuverlässige und einigermaßen einfache Möglichkeiten, um 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 unter allen Umständen zu verhindern, z. B. durch Reflexion oder einfach durch Deaktivieren. Es sollte vielmehr eine strikte Warnung sein, dass sie nicht verwendet werden sollten. Erzwingen Sie den Programmierer vorzugsweise, aktiv Maßnahmen zu ergreifen, um diese Einschränkungen zu überwinden, wenn dies möglich/erforderlich ist.

12
Alex

Gibt es zuverlässige und einigermaßen einfache Möglichkeiten, um diese Einschränkungen für externen Code zu erreichen, außer an bestimmten Stellen in unserem eigenen Code?

Da es sich bei der Frage speziell um C # handelt, gibt es eine Compiler-basierte Lösung, mit der solche Regeln durchgesetzt werden können: Roslyn Analyzers . Sie können Ihren eigenen Analysator schreiben, der den Zugriff auf bestimmte APIs als Kompilierungsfehler oder Warnung meldet.

Ein Beispielsatz von Analysatoren, die beim Schreiben Ihres eigenen Codes viel Beispielcode enthalten, sind die StyleCop-Analysatoren , die die alte StyleCop-Funktion für C # ersetzen.

Trotzdem 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überprüfungen, wie sie in der Antwort von Karl Bielefeldt erörtert wurden. Es kann bei solchen Überprüfungen hilfreich sein, sollte diese jedoch nicht ersetzen.

8
David Arno

Sie können zeitaufwändige Dinge tun, z. B. einen Wrapper um die externe API schreiben, der Ihre unerwünschten Vorgänge auslässt, aber nichts geht über Schulungen und Codeüberprüfungen, denn unabhängig von den von Ihnen festgelegten Standards oder technischen Maßnahmen finden die Mitarbeiter kreative Wege, um diese zu umgehen .

Zum Beispiel haben wir mehrere Dienste in Scala geschrieben, und eines der Dinge, die wir zur Codeüberprüfungszeit fragen, ist die Unveränderlichkeit, aber wir kommunizieren oft, dass wir das vars loswerden. Jemand hat neulich ein val x: ListBuffer [Boolean] verwendet, um eine einzelne veränderbare Variable als einziges Element in der Liste zu speichern. Sie können x kein weiteres ListBuffer zuweisen, aber Sie können die Elemente der Liste so oft ersetzen, wie Sie möchten. Genauso schlecht wie die Verwendung eines var, aber hinterhältiger.

Mit anderen Worten, Sie müssen überprüfen, ob Personen Ihre technischen Lösungen umgehen. Wenn diese technischen Lösungen teuer sind und die Komplexität erhöhen, können Sie auch überprüfen, ob sie korrekt codiert sind.

25
Karl Bielefeldt

Karls Antwort ist 100% richtig. Es gibt keine Möglichkeit, die Konformität zu garantieren. Erwägen Sie jedoch zusätzlich zu Schulungen und Codeüberprüfungen die Verwendung statischer Analysetools, um die Einhaltung sicherzustellen. (Anmerkung: Ich sagte "zusätzlich zu", da man diese auch genauso umgehen kann, wie Karl es angegeben hat).

Der Vorteil der Verwendung statischer Analysetools besteht darin, dass mühsame Analysen des menschlichen Codes entfernt werden, um nach Instanzen der "Mehrfachverwendung von IEnumerable" oder nach Leistungsproblemen der Woche zu suchen, die Sie sich ansehen (oder zumindest immer das Gefühl haben, dass ich es bin) anschauen). Auf diese Weise können sich die Codeüberprüfungen und Schulungen auf "interessantere" Themen konzentrieren.

Insbesondere für C # habe ich unten einige Vorschläge aufgenommen. Schließen Sie diese an Ihre Build-Umgebung an und Sie können loslegen. Unabhängig davon, welche Sprache Sie verwenden, gibt es im Allgemeinen 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

  • .NET Compiler Platform (Codename Roslyn) - Von Microsoft .NET entwickeltes Open-Source-Compiler-Framework für C # und Visual Basic .NET. Bietet eine API zum Analysieren und Bearbeiten der Syntax.
  • CodeIt.Right - Kombiniert statische Code-Analyse und automatisches Refactoring zu Best Practices, die die automatische Korrektur von Codefehlern und -verletzungen ermöglichen. unterstützt C # und VB.NET.
  • CodeRush - Ein Plugin für Visual Studio, das Benutzer auf Verstöße gegen Best Practices hinweist.
  • FxCop - Kostenlose statische Analyse für Microsoft .NET-Programme, die in CIL kompiliert werden. Standalone und in einige Microsoft Visual Studio-Editionen integriert; von Microsoft.
  • NDepend - Vereinfacht die Verwaltung einer komplexen .NET-Codebasis durch Analysieren und Visualisieren von Codeabhängigkeiten, Definieren von Entwurfsregeln, Durchführen von Auswirkungsanalysen und Vergleichen verschiedener Codeversionen. Integriert sich in Visual Studio.
  • Parasoft dotTEST - Ein Plugin für statische Analyse, Komponententests und Codeüberprüfung für Visual Studio. funktioniert mit Sprachen für Microsoft .NET Framework und .NET Compact Framework, einschließlich C #, VB.NET, ASP.NET und Managed C++.
  • Sonargraph - Unterstützt C #, Java und C/C++ mit Schwerpunkt auf Abhängigkeitsanalyse, automatisierter Architekturprüfung, Metriken und der Möglichkeit, benutzerdefinierte Metriken und Codeprüfer hinzuzufügen.
  • StyleCop - Analysiert C # -Quellcode, um eine Reihe von Stil- und Konsistenzregeln durchzusetzen. Es kann in Microsoft Visual Studio ausgeführt oder in ein MSBuild-Projekt integriert werden.
0
Reginald Blue