J'écris des cours qui "doivent être utilisés de manière spécifique" (je suppose que tous les cours doivent ...).
Par exemple, je crée la fooManager
classe, ce qui nécessite un appel à, par exemple Initialize(string,string)
. Et, pour pousser l'exemple un peu plus loin, la classe serait inutile si nous n'écoutons pas son ThisHappened
action.
Mon point est que la classe que j'écris nécessite des appels de méthode. Mais il compilera parfaitement si vous n’appelez pas ces méthodes et aboutira à un nouveau FooManager vide. À un moment donné, cela ne fonctionnera pas, ou peut-être tombera en panne, en fonction de la classe et de ce qu’il fait. Le programmeur qui implémente ma classe devrait évidemment regarder à l'intérieur et se rendre compte "Oh, je n'ai pas appelé Initialize!", Et tout irait bien.
Mais je n'aime pas ça. Ce que je voudrais idéalement, c'est que le code ne soit PAS compilé si la méthode n'a pas été appelée; Je suppose que ce n'est tout simplement pas possible. Ou quelque chose qui serait immédiatement visible et clair.
Je me trouve troublé par l'approche actuelle que j'ai ici, qui est la suivante:
Ajoutez une valeur booléenne privée dans la classe et vérifiez si nécessaire que la classe est initialisée. sinon, je vais lancer une exception disant "La classe n'a pas été initialisée, êtes-vous sûr d'appeler .Initialize(string,string)
?".
Je suis un peu d'accord avec cette approche, mais cela conduit à beaucoup de code qui est compilé et, finalement, pas nécessaire pour l'utilisateur final.
En outre, c'est parfois encore plus de code quand il y a plus de méthodes qu'un simple Initiliaze
appel. J'essaie de garder mes cours avec pas trop de méthodes / actions publiques, mais ce n'est pas résoudre le problème, mais le garder raisonnable.
Ce que je cherche ici, c'est:
- Est-ce que mon approche est correcte?
- Y en a t-il un meilleur?
- Que faites-vous / conseillez-vous?
- Est-ce que j'essaie de résoudre un problème qui ne se pose pas? Mes collègues m'ont dit que c'était au programmeur de vérifier le cours avant d'essayer de l'utiliser. Je suis respectueusement en désaccord, mais je pense que c'est un autre problème.
En termes simples, j'essaie de trouver un moyen de ne jamais oublier d'implémenter des appels lorsque cette classe est réutilisée plus tard, ou par quelqu'un d'autre.
CLARIFICATIONS:
Pour clarifier beaucoup de questions ici:
Je ne parle certainement pas seulement de la partie d'initialisation d'une classe, mais plutôt de toute une vie. Empêcher les collègues d'appeler une méthode deux fois, en s'assurant qu'ils appellent X avant Y, etc. Tout ce qui finirait par être obligatoire et dans la documentation, mais que j'aimerais avoir en code et aussi simple et petit que possible. J'ai beaucoup aimé l'idée des assertions, même si je suis sûr que je devrai mélanger d'autres idées, car les assertions ne seront pas toujours possibles.
J'utilise le langage C #! Comment n'ai-je pas mentionné ça?! Je suis dans un environnement Xamarin et je crée des applications mobiles qui utilisent généralement entre 6 et 9 projets dans une solution, notamment des projets PCL, iOS, Android et Windows. Je suis développeur depuis environ un an et demi (études et travail combinés), d’où mes déclarations / questions parfois ridicules. Tout cela n’est probablement pas pertinent ici, mais trop d’informations n’est pas toujours une mauvaise chose.
Je ne peux pas toujours mettre tout ce qui est obligatoire dans le constructeur, en raison des restrictions de plate-forme et de l'utilisation de Dependency Injection, le fait d'avoir des paramètres autres qu'Interfaces n'est pas à la table. Ou peut-être que mes connaissances ne sont pas suffisantes, ce qui est hautement possible. La plupart du temps, ce n'est pas un problème d'initialisation, mais plus
Comment puis-je m'assurer qu'il s'est inscrit à cet événement?
comment puis-je m'assurer qu'il n'a pas oublié d'arrêter le processus à un moment donné?
Ici, je me souviens d’une classe de récupération d’annonces. Tant que la vue dans laquelle l'annonce est visible est visible, la classe récupère une nouvelle annonce toutes les minutes. Cette classe a besoin d’une vue lorsqu’elle est construite où elle peut afficher l’annonce, ce qui pourrait évidemment figurer dans un paramètre. Mais une fois que la vue est partie, StopFetching () doit être appelé. Sinon, la classe continuerait à chercher des annonces pour une vue qui n'y est même pas, et c'est mauvais.
En outre, cette classe a des événements qui doivent être écoutés, comme "AdClicked" par exemple. Tout fonctionne bien s'il n'est pas écouté, mais nous perdons le suivi des analyses si les taps ne sont pas enregistrés. Toutefois, l’annonce fonctionne toujours, de sorte que l’utilisateur et le développeur ne verront aucune différence et que les données analytiques seront erronées. Cela doit être évité, mais je ne suis pas sûr que les développeurs puissent savoir qu'ils doivent s'inscrire à l'événement tao. C’est un exemple simplifié, mais l’idée est là: "assurez-vous qu’il utilise l’Action publique disponible" et au bon moment bien sûr!
initialize
être passé tard après la création de l'objet? Le acteur serait-il trop "risqué" dans le sens où il pourrait jeter des exceptions et briser la chaîne de la création?
new
si l'objet n'est pas prêt à être utilisé. S'appuyant sur une méthode d'initialisation reviendra sûrement vous hanter et devrait être évité sauf en cas de nécessité absolue, du moins c'est mon expérience.