Supposons que j'ai une classe "Application". Pour être initialisé, il prend certains paramètres dans le constructeur. Supposons également que le nombre de paramètres est si élevé qu'il est impératif de les placer dans une classe qui leur est propre.Classes imbriquées "publiques" ou non
Comparez les deux implémentations suivantes de ce scénario.
Application 1:
class Application
{
Application(ApplicationSettings settings)
{
//Do initialisation here
}
}
class ApplicationSettings
{
//Settings related methods and properties here
}
Mise en œuvre 2:
class Application
{
Application(Application.Settings settings)
{
//Do initialisation here
}
class Settings
{
//Settings related methods and properties here
}
}
Pour moi, la seconde approche est très bien préférable. Il est plus lisible car il souligne fortement la relation entre les deux classes. Lorsque j'écris du code pour instancier la classe Application n'importe où, la seconde approche va paraître plus jolie. Maintenant, imaginez simplement que la classe Settings elle-même avait à son tour une classe similaire "related" et cette classe l'a fait à son tour. Allez seulement trois niveaux de ce genre et la dénomination de la classe sort du champ dans le cas «non imbriqué». Si vous nichez, cependant, les choses restent élégantes.
Malgré ce qui précède, j'ai lu des gens dire sur StackOverflow que les classes imbriquées sont justifiées seulement si elles ne sont pas visibles au monde extérieur; c'est-à-dire si elles sont utilisées uniquement pour l'implémentation interne de la classe conteneur. L'objection couramment citée est de gonfler la taille du fichier source de la classe contenant, mais les classes partielles est la solution parfaite pour ce problème. Ma question est la suivante: pourquoi nous méfions-nous de l'utilisation «publique» des classes imbriquées? Y a-t-il d'autres arguments contre une telle utilisation?
J'ai dû écrire du code de constructeur récemment et je me suis souvenu de ce post. Il s'est avéré être une approche très utile, alors merci. –
* "Cela permet également au constructeur d'accéder aux membres privés de la classe externe" * Seulement avec une référence explicite, correcte (je suis sûr que ce n'est pas implicite comme dans les classes internes de Java). – samosaris
@SamusArin: Oui, il n'y a pas de référence implicite à une instance de la classe conteneur. Mais vous avez également accès à des membres statiques. Fondamentalement, je parlais seulement de l'accessibilité. –