3 votes

L'extension de l'espace de noms du système de la FCL est-elle vraiment une mauvaise pratique ?

Il est connaissance commune ( et convention ) que les espaces de noms sont utilisés pour code d'identification unique et éviter les conflits de noms, c'est pourquoi vous devez toujours placer votre propre code dans un espace de noms unique.

Mais , ...

Les espaces de noms sont également utilisés pour regrouper des classes logiquement pertinentes. Ma bibliothèque personnelle s'étend simplement sur la Framework Class Library (FCL) et met en œuvre toutes les fonctionnalités que je trouve manquantes dans la FCL. Elle contient principalement des classes d'extension et d'aide, ainsi que d'autres classes hautement réutilisables. J'ai trouvé très utile de suivre la même structure d'espaces de noms que dans la FCL.

Je suis allé un pas de plus et j'ai commencé à utiliser les espaces de noms du FCL pour "injecter" mon code dans les espaces de noms où je l'attendais.

L'un des avantages est qu'il n'est pas nécessaire de définir autant d'utilisations. Par exemple, en faisant simplement référence à la bibliothèque, les méthodes d'extension sont immédiatement disponibles sans qu'il soit nécessaire d'ajouter des utilisations supplémentaires. A titre d'exemple (pour ceux qui aiment garder leur liste d'utilisations propre), combien de fois vous attendez-vous à ce que les méthodes d'extension fonctionnent, pour vous rendre compte que vous n'avez pas encore ajouté "using System.Linq ;"?

MISE À JOUR :

Le principal avantage, selon moi (comme mentionné dans les commentaires), est que vous avez l'accès à davantage de services publics, plus facilement sans avoir à rechercher les espaces de noms spécifiques. Par exemple, si vous utilisez System.Collections.Generic , des méthodes d'extension immédiate pour les IList<T> sont disponibles.

Je soutiens que cet avantage pourrait en fait l'emporter sur les inconvénients. Le fait que des conflits de noms puissent se produire à l'avenir ne me dérange pas, car cela indiquerait qu'une nouvelle version de la CMF inclut effectivement quelque chose de similaire à ce que je souhaitais. En fait, il est plus facile de remarquer les changements dans le FCL, que je voudrais de toute façon refléter dans mes espaces de noms.

Bien sûr, je comprends que cela irait radicalement mal si tout le monde commençait à faire cela pour les bibliothèques publiques, mais pour mes projets individuels, je trouve que c'est vraiment utile.

Ai-je oublié des autres les inconvénients ? J'ai déjà envisagé le cas où je voudrais rendre la bibliothèque publique, je dois trouver un moyen d'autoriser l'utilisation de la fonction System ou un espace de noms différent, selon le souhait de l'utilisateur. À ma connaissance, la seule façon de procéder dans l'environnement .NET est la suivante l'utilisation de prédirectives .

MISE À JOUR 2 :

Donc, comme je l'ai dit, je suis conscient que certaines personnes peuvent trouver cela gênant et souhaiter un espace de noms différent. Pour mes propres projets, je trouve qu'il n'est pas pratique de faire, par exemple, ce qui suit :

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media
using System.Windows.Media.Media3D;

using MyNamespace.Windows;
using MyNamespace.Windows.Controls;
using MyNamespace.Windows.Media;
using MyNamespace.Windows.Media.Media3D;

Sans oublier ce problème qui rend par exemple using MyNamespace.System.Windows; impossible.

Formuler une question en espérant obtenir des réponses plus utiles :

Existe-t-il une solution plus efficace que de placer le code dans l'espace de noms System ? Existe-t-il un moyen de faciliter compiler dans un espace de noms différent quand on le souhaite, en dehors des prédirectives, ou est-ce une mauvaise idée ?

5voto

Reed Copsey Points 315315

Sans tenir compte des conflits de noms, puisque vous y avez déjà fait référence...

L'avantage majeur est qu'il n'est pas nécessaire de définir autant d'utilisations.

En fait, je considère cela comme un inconvénient. Le fait de vous obliger à ajouter une instruction using ou à qualifier complètement votre type rend votre code plus facile à maintenir, car il est plus évident de savoir où un code spécifique est défini.

Bien qu'il soit normal pour vous de voir vos services publics dans les System.*** la plupart des développeurs s'attendent à ce qu'un type défini en tant que System.***.SomeType fait partie des bibliothèques des classes de base. À mon avis, le fait d'"étendre" les bibliothèques de base avec vos propres types est source de confusion et entraîne une réduction de la maintenabilité.

0voto

Steven Jeuris Points 4850

Je publierai le commentaire de Cody Gray qui m'a le plus aidé en guise de réponse :

Pourquoi faut-il séparer tous les vos fonctions "d'aide" dans des espaces de noms séparés dans des espaces de noms distincts ? [ ] c'est-à-dire, pourquoi ne peuvent-elles pas être appelées dans MyNamespace, vous laissant avec un seul à ajouter ? La seule raison pour laquelle les espaces de noms sont utiles ici est pour que vos méthodes d'extension aient les mêmes mêmes noms (et si c'est le cas, vous ne pourrez pas pourrez pas les importer toutes en même temps. en même temps comme vous l'avez montré de toute façon).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X