Je n'essaie pas de dire que je sais quelque chose que tout le monde ne sait pas, mais j'ai résolu de plus en plus de conceptions avec l'utilisation de classes imbriquées, donc je suis curieux de me faire une idée de l'acceptabilité d'utiliser ce qui semble rarement utilisé mécanisme de conception.
Cela m'amène à la question: est-ce que je suis sur un chemin intrinsèquement mauvais pour des raisons que je découvrirai quand ils reviendront me mordre, ou les classes imbriquées sont-elles peut-être quelque chose qui est sous-estimé?
Voici deux exemples pour lesquels je viens de les utiliser: https://gist.github.com/3975581 - le premier m'a aidé à garder ensemble des éléments héréditaires étroitement liés, le second m'a permis de donner accès aux membres protégés aux travailleurs ...
Réponses:
Je n'appellerais pas cela un "mécanisme de conception rarement utilisé" - du moins pas universellement: bien qu'il existe des boutiques où certains contributeurs peuvent désapprouver l'utilisation de classes imbriquées, ce n'est pas du tout une fonctionnalité obscure.
Bien que l'existence de classes avec visibilité d'assemblage et l'introduction de lambdas aient considérablement réduit le besoin de classes imbriquées * , elles restent un choix de conception valide. Bien qu'il existe un certain chevauchement avec les classes internes à l'intérieur d'un espace de noms, la fonctionnalité des classes imbriquées est unique en vous permettant de masquer une classe entièrement à l'intérieur d'une autre classe.
* L'utilisation d'une fonctionnalité similaire en Java est beaucoup plus élevée, car les autres alternatives disponibles en C # ne sont pas là en Java.
la source
Considérez un instant que vous écrivez une classe dans une autre classe, qui ne sera jamais utilisée ailleurs dans votre programme. Parce que si vous l'utilisiez ailleurs, vous en feriez un cours public ordinaire, comme tous les autres.
Donc, la chose qui est censée rendre la POO excellente (réutilisabilité) est absente ici. En outre, que pourriez-vous réaliser avec une classe imbriquée que vous ne pourriez pas réaliser avec des méthodes ordinaires et des membres privés au sein de la classe parente?
Pour un modèle logiciel utile utilisant des classes imbriquées, regardez ici .
la source
am I going down an inherintly bad path
Je pense que dans votre deuxième exemple (les sous-classes de travailleurs), vous l'êtes certainement. Vous avez mappé chaque sous-classe à un état spécifique dans la super classe. Alors maintenant, chaque fois que vous souhaitez ajouter un état à la super classe, vous devrez modifier trois emplacements (ajouter un état à la super classe, ajouter une nouvelle sous-classe et changer le constructeur de la classe dérivée pour ajouter la sous-classe à la liste ).
L'utilisation de classes imbriquées pour accéder aux membres privés semble être une utilisation valide (je ne l'ai jamais fait personnellement) mais votre cas spécifique ne fonctionne pas ici.
Comme pour l'exemple de la partie du corps. Étant donné que toutes les classes imbriquées sont publiques, vous ne faites pas grand-chose sauf l'espace de noms. Si ces classes se développent pour inclure plus de fonctionnalités, vous constaterez peut-être que les classes imbriquées encombrent simplement les interfaces et vous parcourez le code pour trouver quelque chose de spécifique. Je remarque également que parce que vous avez des classes imbriquées, vous êtes obligé de rompre les conventions de dénomination et de nommer vos classes en minuscules (c'était peut-être un choix). Mais ces arguments sont plus superficiels que tout ce qui est réellement faux.
À moins, bien sûr, que vous ayez besoin de mettre en œuvre un bras désincarné. Ensuite, créer un bras en procédant comme suit est déroutant car il n'y a pas de corps / torse / côté. (Notez également le boîtier déroutant).
la source
Le seul avantage que je puisse penser des classes imbriquées est qu'elles peuvent être rendues privées (ou protégées). Je dirais que dans ce cas, les classes imbriquées peuvent vous aider à encapsuler des fonctionnalités si une classe est destinée à être utilisée par la classe externe et cette classe seule.
la source
D'après mon expérience, les classes imbriquées
J'ai jeté un coup d'œil à votre classe, et tout de suite je pense que:
Pourquoi ne pas séparer votre classe en plusieurs classes et leur donner des espaces de noms séparés. Par exemple
la source