Platzieren von benutzerdefiniertem Code in einem Systemnamespace

8

Gibt es Best Practices, bei denen der benutzerdefinierte Statuscode nicht in einem System -Namespace platziert werden sollte? Sollten System und seine Kinder für Microsoft-Code reserviert sein?

Ich frage, weil ich eine Klassenbibliothek schreibe, die in vielen Projekten verwendet wird, und ich möchte die Dinge konsistent halten, indem ich sie in System.InteropServices lege (da es sich um P / Invoke handelt).

    
David Brown 12.04.2010, 22:18
quelle

3 Antworten

11

Das ist keine gute Idee, weil es einen der Hauptvorteile von Namespaces vereitelt: das Verhindern von Namenskonflikten. Was, wenn eine neuere Version des Frameworks einen gleichnamigen Typ in diesem Namespace einführte?

Dies ist besonders schlimm für System Namespaces, da sie in viele andere Codeteile mit using Direktiven importiert werden und die Einführung von benutzerdefinierten Typen in diesen Namespaces den Namensbereich anderer Quelldateien mit unerwarteten Bezeichnern beschmutzt.

Um Ihre benutzerdefinierten Interop-Typen zu kategorisieren, können Sie einen neuen Namensraum wie MyProduct.InteropServices erstellen.

    
Mehrdad Afshari 12.04.2010, 22:21
quelle
2

Wenn Sie eine neue Klasse in System.InteropServices platzieren, muss jede Datei, die eine using System.InteropServices; -Klausel hat, gezwungen werden, Ihre Klasse im Geltungsbereich zu haben, was den Programmierer verwirren könnte. Da sich der Programmierer dagegen nicht wehren kann, würde ich diese schlechte Praxis in Erwägung ziehen.

    
dtb 12.04.2010 22:24
quelle
2

Ich stimme nicht mit allen überein.

Ich denke, dass es in einer begrenzten Teilmenge von Fällen (hauptsächlich mit Erweiterungsmethoden) durchaus sinnvoll ist, Code in einen Systemnamensraum zu stellen.

Hier ist meine Seite des Arguments aus einem E-Mail-Thread, in dem wir im System-Namensraum über Extension-Methoden diskutiert haben: EPS :

Ok, also hier ist meine Seite des Arguments:

  1. Ich mag es wirklich, Code zu minimieren. Das schließt Usings ein.

  2. Ja, ReSharper greift auf Erweiterungsmethoden zu und fügt die Usings für Sie hinzu, aber einige Leute haben keinen ReSharper, und außerdem bevorzuge ich Coderush, das bisher (soweit ich weiß) nicht wirklich greift Erweiterungsnamespaces.

  3. Es gibt mindestens zwei verschiedene Arten von Erweiterungsmethoden. Dies sind Hilfsmethoden für unsere Anwendung - einschließlich domänen- und anwendungsspezifischer Helfer, und solche, die Funktionen und Syntax kapseln, von denen wir glauben, dass sie mit der Sprache beginnen sollte.

Ein gutes Beispiel für letzteres ist die Möglichkeit, "a {0} {1}".Format("b", "c") oder someListOfStrings.Join(", ") auszuführen, anstatt String.Join(someStringList.ToArray(), ", ") zu tun. Andere umstrittenere Beispiele sind IEnumerable<T>.ForEach und die Erweiterung IsNull() , die den Platz der unbeholfenen object.ReferenceEquals(null, someVar) -Syntax einnehmen.

Mein Argument ist, dass es allen Grund gibt, diese letztere Klassifizierung - Ihr Team stimmt weitgehend überein, sollte in der Sprache sein, aber nicht - im entsprechenden Namespace (System, System.IO, System.Linq, etc.) zu platzieren. . Wir möchten, dass diese Funktionen überall verfügbar sind, so wie wir es bevorzugen, dass die Schlüsselwörter foreach und yield immer sichtbar sind. Wenn es jedoch anwendungsspezifisch ist, sollte es in einem eigenen Namensraum liegen. In 90% der Fälle sollten anwendungsspezifische Helfererweiterungen wahrscheinlich keine Erweiterungen sein und nicht einmal statisch sein. Ich schließe aus dieser Anweisung aus, indem ich Erweiterungsmethoden verwende, um Aliase für Funktionsnamen bereitzustellen.

Damit können Sie natürlich Probleme bekommen, wenn Sie in Assemblys anrufen, die systemweite Erweiterungen enthalten. Angenommen, ich habe auf die Assembly verwiesen, die meine void IEnumerable<T>.ForEach -Methode enthält, und wollte meine eigene rubinähnliche R IEnumerable<T, R>.ForEach erstellen (was eigentlich nur eine Auswahl ist, aber vergiss das nicht). Das wäre ein Problem! Was ich tun möchte, um das Problem zu verringern, besteht darin, meine Erweiterungsklassen als intern zu definieren, sodass sie nur für mein Projekt verwendet werden können. Dies löst das Problem gut.

    
George Mauer 12.04.2010 22:33
quelle

Tags und Links