1 votes

Questions de conception Java - Classe, fonction, modificateurs d'accès

Je suis novice en matière de Java. J'ai quelques questions de conception.

Disons que j'ai une application crawler, qui fait ce qui suit : 1. Parcourir une url et obtenir son contenu. 2. Analyse le contenu 3. Affiche le contenu

  1. Comment choisir entre l'implémentation d'une fonction ou d'une classe ? -- L'analyseur syntaxique doit-il être une fonction de la classe crawler, ou doit-il être une classe en soi, afin qu'il puisse être utilisé par d'autres applications ? -- S'il s'agit d'une classe, doit-elle être protégée ou publique ?

  2. Comment décider de la mise en œuvre d'une classe publique ou protégée ? -- Si je devais créer une classe pour générer des statistiques à partir du contenu analysé, par exemple, cette classe devrait-elle être protégée (de sorte que seule la classe crawler puisse y accéder) ou publique ?

Merci Ron

2voto

Andy White Points 36586

Le meilleur guide que j'ai vu pour ce type de questions est le "SOLID Principles of OO Design".

http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

Le plus fondamental de ces principes, et celui qui répond en quelque sorte à votre première question, est le "principe de la responsabilité unique". Ce principe stipule qu'"une classe doit avoir une, et une seule, raison de changer". En d'autres termes, vos classes doivent chacune faire exactement une chose. Si vous avez besoin de changer la façon dont cette chose fonctionne, vous n'avez qu'une seule classe à changer et, avec un peu de chance, un seul endroit pour faire le changement dans cette classe. Dans votre cas, vous voudrez probablement une classe pour récupérer le contenu de l'URL, une autre pour l'analyser dans une sorte de structure de données en mémoire, une autre pour traiter les données (si nécessaire), et une autre (ou d'autres) pour afficher le contenu dans le format que vous souhaitez. Évidemment, vous pouvez vous laisser emporter par les classes, mais il est généralement plus facile de tester un grand nombre de petites classes à opération unique, plutôt qu'une ou deux grandes classes englobantes.

La question sur public vs. protected dépend de la façon dont vous prévoyez d'utiliser ce code. Si votre classe peut être utilisée indépendamment en dehors de votre bibliothèque, vous pouvez envisager de la rendre publique, mais si elle accomplit une tâche spécifique ou liée à vos autres classes, elle peut probablement être protégée. Par exemple, une classe permettant de récupérer du contenu à partir d'une URL est une bonne classe à usage général, vous pouvez donc la rendre publique, mais une classe qui effectue un type spécifique de manipulation de données peut ne pas être utile en dehors de votre bibliothèque, elle peut donc être protégée. Dans l'ensemble, ce n'est pas toujours noir ou blanc, mais en fin de compte, ce n'est généralement pas un gros problème dans les deux cas.

2voto

Lars Andren Points 2902

Je pense que la réponse d'Andy est très bonne. J'ai quelques ajouts à faire :

Si vous pensez qu'une classe sera étendue à l'avenir, vous pouvez définir tous vos fichiers private (le cas échéant) pour protected . De cette façon, toutes les classes d'extension futures pourront également y accéder.

J'aime la règle selon laquelle une méthode ne doit pas être plus longue que ce que l'on peut voir de ses crochets d'ouverture et de fermeture ( { } ) sans défilement. Si une méthode est plus longue que cela, essayez de la diviser en plusieurs méthodes ( private , protected o public selon votre préférence). Cela rend le code plus lisible, et pourrait également permettre d'économiser des lignes de code.

Disons qu'une méthode prend de l'ampleur et que vous la divisez en plusieurs méthodes. private méthodes. Si ces nouvelles méthodes ne sont utilisées qu'au sein de la première méthode "mère", il est logique de déplacer l'ensemble dans une classe à part entière. De cette façon, vous rendrez la classe originale plus petite et plus lisible. En outre, la fonctionnalité de la nouvelle classe sera plus facile à comprendre, car elle ne sera pas mélangée à celle de la classe originale.

1voto

rompetroll Points 2163

J'aime penser aux classes comme à des "gars" qui peuvent faire des choses spécifiques avec des "méthodes".

Dans votre cas, il y a un gars qui peut récupérer le contenu d'une url si vous lui dites de quelle url il s'agit.

Puis il y a cet autre type, qui est vraiment bon pour analyser le contenu. Je pense qu'il le fait avec un outil appelé rome, mais je ne suis pas sûr. Il garde cela privé (indice ;) )

Puis nous avons le troisième type, qui expose des trucs. Il est un peu attardé et ne comprend que les trucs que "l'autre gars" produit, mais bon, ça va.

Enfin, le projet a besoin d'un patron, qui donne des ordres aux trois autres et transmet les messages entre eux.

ps : Je n'ai jamais vraiment pensé à rendre les classes protégées ou non. Habituellement, elles sont simplement publiques sans raison particulière. Tant que ça ne fait pas de mal, pourquoi s'en soucier ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X