6
votes

Est l'idiome d'interface non virtuelle (NVI) comme utile en C # comme dans C ++?

en C ++, j'ai souvent besoin de NVI pour obtenir cohérence dans mes API. Je ne vois pas cela utilisé autant d'autres chez c #, cependant. Je me demande si cela est parce que c #, en tant que langue, offre des fonctionnalités qui rendent NVI inutile? (J'utilise toujours NVI en C #, cependant, si nécessaire.)


2 commentaires

Quelles fonctionnalités C # rendent inutile d'intérêt?


Eh bien, c'est ce que je me demandais, car je ne les vois pas moi-même - j'utilise nvi. :)


4 Réponses :


0
votes

Je pense que NVI est aussi utile en C # tel qu'il est en C ++. Je vois cela utilisé très souvent chez mon entreprise.


0 commentaires

5
votes

Je pense que l'explication est simplement qu'en C #, le «traditionnel» de style Java de style Java est beaucoup plus enraciné et NVI court à contre-courant. C # a une réelle interface , tandis que NVI s'appuie sur "l'interface" étant une classe de base. C'est comme ça que c'est fait en C ++ quand même, il s'adapte naturellement là-bas.

en C #, il peut encore être fait, et c'est toujours un idiome très utile (beaucoup plus donc, je dirais que des interfaces "normales"), mais cela nécessite que vous ignorez une fonction de langue intégrée.

De nombreux programmeurs C # ne penseraient tout simplement pas à une classe NVI comme étant "une interface appropriée". Je pense que cette résistance mentale est la seule raison pour laquelle il est moins courant dans C #.


0 commentaires

8
votes

C # pose un problème avec NVIS en supprimant plusieurs héritages. Bien que je pense que le héritage multiple génère plus de mal que bien, il est nécessaire (dans la plupart des cas) pour NVI. La chose la plus simple qui saute à l'esprit: une classe en C # ne peut pas mettre en œuvre plus d'une NVI. Une fois que l'on découvre cet aspect désagréable de tandem C # / nvi, il devient beaucoup plus facile d'abandonner NVIS que c #.

et ailleurs, parlant de aspects . C'est un concept très intéressant, et c'est exactement la même chose que celle de NVIS, seule il tente d'examiner le "vrai essense" de la question et de l'adresser "correctement", pour ainsi dire. Jetez un coup d'œil .

Et aussi loin que .NET Framework va, il y a un mécanisme à faire juste que: Inject code «orthogonal», afin de dire à la logique principale à portée de main. Je parle de tout ce que MarshalbyRef / TransparentProxy Business, je suis sûr que vous en avez entendu parler. Cela fait sérieusement l'impact des performances, cependant, donc pas de la grosse chance ici.

Il y a également eu de nombreuses tentatives visant à mettre en œuvre le même concept à travers d'autres techniques, de la construction de façades à la saleté mentionnée ci-dessus au post-traitement du MSIL.

Cette dernière approche arrive pour faire appel à la vôtre le plus, car elle peut être faite transparente (en incorporant les étapes nécessaires à sa routine de construction), cela n'affecte pas la performance (plus que ce qui est absolument nécessaire d'exécuter réellement le "orthogonal "Code) et il n'implique pas une sorte de" piratage "ou ingénierie inverse, puisque MSIL est ouvert et bien documenté.

ici on peut trouver ces points discutés plus en détail, ainsi que Plus d'informations et des liens vers des outils réels. Utiliser Google dans le même but est également acceptable. : -)

bonne chance.


1 commentaires

AVERTISSEMENT, POSTSHARP peut être une addiction. ; p



4
votes

Trey Nash dans son livre accéléré C # favorise la Modèle NVI comme une forme canonique en C #.

Je ne sais pas qui a écrit l'article que vous référez ( Plus C ++ Idiomes / interface non virtuelle ), mais je sens que l'auteur a raté le point.

...

interface vs classes abstraites

Je dirais que, philosophiquement, il y a peu de différence (en C #) entre une classe entièrement abstraite (c'est-à-dire aucune implémentation que ce soit) par rapport à une interface. Sur la surface, ils peuvent tous deux fournir une signature de méthodes pouvant être effectuées et nécessiter quelque chose d'autre pour mettre en œuvre cette fonctionnalité.

avec C #, vous programmeriez toujours une interface si ce dont vous avez besoin est une interface. Vous utilisez uniquement une classe de base (abstraite) car vous souhaitez également la réutilisation de la mise en œuvre.

De nombreuses bases de code combinent celles-ci et programme à l'interface en plus de fournir une hiérarchie de classe comme implémentation par défaut pour l'interface.

NVI pour les interfaces en C

Si votre seule motivation à utiliser NVI en C ++ serait d'avoir une interface, alors non, vous n'allez pas utiliser cela dans C # car la langue / CLR fournit des interfaces en tant que fonctionnalité de première classe.

NVI et hiérarchies d'objets

Dans mon esprit, NVI n'a jamais été sur les interfaces. C'est toujours un excellent moyen de mettre en œuvre le Modèle de modèle modèle.

L'utilité se manifeste dans la maintenance du cycle de vie de code (facilité de changement, extension, etc.) et fournit un modèle d'héritage plus simple.

Mon avis: Oui, NVI est très utile dans C #.


0 commentaires