J'ai travaillé avec un développeur qui avait de nombreuses années mon senior dans C # Experience. Je n'ai plus de moyen de le contacter et je me souviens de lui dire que ce n'est pas une bonne idée d'inclure le code dans un paramètre par défaut moins constructeur, mais je ne me souviens pas de la raison pour laquelle. P>
Est-ce une bonne pratique ou une mauvaise pratique d'inclure le code dans le constructeur par défaut en C # ou une langue de ce type? P>
9 Réponses :
Cela dépend de la situation, mais il n'est certainement pas une mauvaise pratique de mettre le code dans les constructeurs par défaut. Si vous avez besoin de, allez-y et faites-le. P>
Je sais que nous avons mis un appel à l'initialisation à tous les paramètres du constructeur par défaut. Il y a des moments où nous devons "blank" les données en dehors de la déclaration juste de la déclaration, nous le faisons donc dans une méthode distincte et l'appelons au constructeur le plus bas pour n'importe quel objet. P>
Cela dépend de la situation, parfois, il est nécessaire, parfois, il peut parfois être utilisé, il ne faut parfois pas être là. P>
Ce qui est important, c'est que tout constructeur doit laisser l'objet dans un état correctement initialisé. Si un objet a toujours besoin d'un code d'initialisation, mais pas de saisie spécifique pour ce faire, un constructeur sans paramètre serait un bon endroit pour cela. P>
D'une importance significative, le constructeur ne doit pas lancer d'exceptions. Si un morceau de l'initialisation peut lancer, enveloppez-le et manipulez-le.
@GalacticCowboy: Au contraire, si le constructeur est incapable d'initialiser l'objet correctement, il devrait I> lancer une exception. C'est la seule façon que le constructeur puisse conserver l'objet d'être créé. Voir par exemple: Stackoverflow.com/Questions/3629849/...
Ah, assez vrai. Je basais cela sur ma mémoire d'une règle FXCOP, mais je jette réellement sur static i> constructeurs - une exception dans un constructeur statique entraînerait le type étant cassé pour l'ensemble de l'application.
@Galacticcowboy: Ah, cela a du sens. Ce serait une exception irréfléchi. :)
C'est une question de goût. Je trouve ces règles définies par l'utilisateur Kokos très utile: p>
SON RÈGLES: P>
- Ne pas initialiser avec les valeurs par défaut dans la déclaration (NULL, FAUX, 0, 0,0 ...). LI>
- Préférez l'initialisation dans la déclaration si vous n'avez pas de paramètre de constructeur qui modifie la valeur du champ. LI>
- Si la valeur du champ change à cause d'un paramètre de constructeur, mettez l'initialisation dans les constructeurs. LI>
- soyez cohérent dans votre pratique. (la règle la plus importante) li> ol> blockQuote>
Voir: Initialiser les champs de classe dans le constructeur ou à Déclaration? P>
Depuis que vous utilisez C # avec le framework .NET. Permettez-moi de vous donner l'article complet "Conception du constructeur" de MSDN: P>
http://msdn.microsoft .Com / fr-US / bibliothèque / vstudio / ms229060 (v = vs.100) .aspx p>
À mon avis, vous devez mettre juste code d'initialisation dans votre constructeur. P>
Les champs de classe Uinitialisés devraient généralement se retrouver dans le constructeur par défaut. Si vous initialisez les champs de classe sur la même ligne que les déclarations, ces déclarations ne s'exécuteront pas si vous désérialisez un tel objet. En outre, il est une bonne pratique pour collecter toutes les initalisations dans la CTOR par défaut. P>
Que vient à l'esprit est l'article 17 de Java efficace (par Joshua Bloch):
Point 17: Conception et document pour l'héritage ou d'autres interdire P> blockQuote>
Il explique qu'un constructeur ne doit pas appeler des méthodes qui sont excessives: p>
xxx pré> Ce qui finit par arriver, c'est que vous appelez le constructeur de la superclasse (quand vous invoquez Créez une instance de la sous-classe) et vous obtenez un comportement inattendu. P>
Si votre constructeur invoque d'autres méthodes de la classe, vous devez le documenter dans votre API afin que les développeurs se subglassent, ils sauront à quoi s'attendre. . P>
Sinon, il n'y a pas de mal à mettre le code dans votre constructeur. p> p>
c'est vrai msdn.microsoft.com/en-us/library/vstudio/...
Lorsque vous désérialisez un objet avec un formidateur binaire, le constructeur par défaut n'est pas exécuté lorsque l'objet est créé. Le BinaryFormatter utilise une astuce pour obtenir .NET pour donner une instance initialisée dans laquelle aucun constructeur par défaut n'est exécuté. P>
Cela ne devrait pas poser de problème, car le formidateur Binary se remplit dans tous les membres privés eux-mêmes. La seule situation que je puisse imaginer être dangereuse, c'est si vous utilisez le constructeur par défaut pour "enregistrer" l'objet quelque part dans une autre classe statique ou quelque chose selon ces lignes, auquel cas vous avez un nouvel ensemble de problèmes. p>
Cela ne devrait pas être un problème, car vous ne pouvez tout simplement pas empêcher de marquer la classe aussi sérialisable s'il ne peut pas être créé par la désérialisation.
@Guffa ce n'est pas le problème ici. Vous ne savez peut-être pas que ce genre de chose arrive lorsque la désérialisation. De plus, vous pouvez implémenter l'interface IdesérializationCallback pour entrer dans cet événement si vous en avez vraiment besoin. Mais vous devez savoir.
règle de pouce forte> p>
Rendez-le aussi simple que possible. P>
L'ensemble du point de bonnes normes de codage est pour la maintenabilité et la capacité de débogage. Nous avons tous rencontré du code qui est spaghetti. Ceci est juste pour que d'autres comprennent votre API mieux. Même avec un bon Javadoc, la plupart des gens ne sont pas Par exemple, si l'instanciation de votre objet fait une manipulation de la base de données, vous feriez mieux de vous amuser une bonne raison. P>
Exemple de comptoir fort> p>
Vous devez toujours faire ce qui est le meilleur. Si vous décidez d'avoir un singleton chargé de paresseux qui charge un cache ou une connexion ou qu'est-ce que vous avez, le point entier est qu'il chargera automatiquement quelque chose lorsque vous l'instanciez. P>