2010-08-02 1 views
3

J'apprends les principes OO et pour la pratique je développe une application en Java. L'application consiste à analyser les fichiers texte d'historique des mains émis par les sites de poker après chaque main de poker et à extraire les mêmes types de données du fichier, quel que soit le site d'où provient l'historique des mains.OO Problèmes de conception

Les fichiers d'historique des mains peuvent être dans des formats très différents selon le site de poker. Certains sites ont chacun la main dans un style très lisible par l'homme, par exemple:

NL $0.25/$0.50 Texas Hold'em - Tuesday, June 22, 19:55:24 GMT 2010 

et d'autres ont un style XML.

Ma question est: En analysant la ligne ci-dessus du texte, devrais-je avoir des classes séparées pour analyser chaque élément? Par exemple devrais-je avoir une classe StakesParser avec une méthode parseStakes() puis une classe CurrencyParser avec une méthode parseCurrency() etc. Ou devrais-je avoir une seule classe qui peut analyser cette ligne et obtenir tous les différents bits d'information?

Pour avoir une classe séparée pour chaque chose que je veux analyser semble plus OO, mais moins efficace. Aucun conseil? Ce que je veux à la suite du processus d'analyse est une classe GameState qui contiendrait toutes les informations pour une main de Poker. Donc, quel que soit le site de l'histoire de la main, je serais en mesure de faire un objet de type GameState avec toutes les informations pertinentes analysées par une classe HHParser. À cette fin, j'ai pensé que ce serait une bonne idée d'avoir une interface qui devrait être implémentée pour que le HHParser de chaque site de poker finisse par produire une classe GameState. Donc l'interface aurait des méthodes telles que parseStakes(), parseCurrency() etc. Est-ce la bonne approche? Ce qui me rend plus confus pour moi, c'est que sur des sites différents, l'information est dans un ordre différent, donc j'ai besoin d'une classe de contrôleur qui s'assure que chaque méthode est appelée dans le bon ordre en fonction du site du fichier texte est de. Désolé pour la gaufre, mais je serais reconnaissant pour les pointeurs sur ce qui pourrait être préférable de faire.

Merci beaucoup à l'avance. :-)

Répondre

4

Je me demande si une stratégie «class per element» est trop granulaire. Je pense peut-être à une sorte d'usine qui renvoie l'implémentation correcte de l'analyseur pour un site particulier.

public class ParserFactory { 
    public static Parser get(String url) {...}; 
} 

Alors vous vous retrouvez avec une interface Parser responsable de retourner une sorte de haricot java encapsulant les attributs d'une main de poker.

public interface Parser { 
    public Collection<Hand> parse(); 
} 

Et vous implémentez Parser pour chaque site à partir duquel vous pouvez obtenir des mains, renvoyer la bonne de l'usine.Je pourrais utiliser Commons Digester pour les sites XML et ANTLR ou même des expressions régulières pour les non-XML.

+0

OK merci jcrossley3. Je me suis ligoté dans des nœuds en essayant de "faire OO" quand il semble que je ne serai pas capable de réutiliser une grande partie du code et si je le fais comme je l'étais alors je finirai par avoir des milliers de les classes me confondent plus. Je vais essayer de réutiliser le code là où je peux, mais à part ça je peux avoir une classe Parser par site contrôlant la lecture et l'analyse du fichier texte et produisant l'objet bean GameState java. À votre santé. – Joe

+0

Pour ne pas paraître trop moralisateur, mais rappelez-vous toujours que OO est un "moyen", pas une "fin". OO est un excellent outil, mais comme une tronçonneuse, il est capable de destruction énorme. La partie la plus difficile de OO est de déterminer la granularité optimale de vos abstractions. Bien sûr, il est possible de faire abstraction de chaque nom de votre modèle de domaine dans une classe, mais cela ne fera que créer de la confusion chez les personnes qui doivent maintenir votre code. En fait, c'est une bonne règle de base: ajoutez seulement une abstraction (classe) quand vous pensez que cela aidera le mec qui vient derrière vous à créer votre design. :) – jcrossley3

+0

Aussi, la réutilisation à mon humble avis n'est pas le meilleur argument de vente d'OO. Réutiliser est sacrément difficile à obtenir, et OO seul ne vous y mènera pas. Le meilleur argument de vente d'OO est la clarté, vous permettant de mieux exprimer votre intention d'une manière que les ordinateurs et, plus important encore, les humains peuvent comprendre. Bonne chance! – jcrossley3

1

Puisqu'il ne s'agit que d'une seule ligne de données, je recommande d'avoir un seul objet analyseur qui traite de l'analyse de la monnaie, des enjeux, etc. Cette classe pourrait ensuite instancier différents objets pour contenir les données.

Cela ne viole pas les principes OO car la classe parser a la responsabilité unique de lire les données de texte et de générer des objets Java à partir de celle-ci. Et chaque objet Java a la responsabilité de conserver ses données à utiliser par votre programme.

+0

Salut Justin. Merci pour votre réponse. Par souci de brièveté, je n'ai pas expliqué que chaque histoire de main pour chaque main de poker est d'environ 20 lignes. Il a une ligne qui dira que c'est le début d'une nouvelle main, alors il y aura quelques lignes qui vous diront quels sont les enjeux, etc., comme dans mon post original. Ensuite, il y aura quelques lignes décrivant qui sont les joueurs et leurs tailles de pile, puis il décrira le jeu. – Joe

+0

Le problème avec un seul objet qui lit cette ligne est que l'information sur différents sites est dans un ordre différent, ou sur une ligne différente, ou au format XML. J'ai des idées vagues sur l'implémentation d'une interface et j'ai aussi des usines pour instater le bon type d'analyseur, mais pour le moment ça me fait un peu souffler un peu. – Joe

+0

Bien, OK, pour séparer les préoccupations, vous auriez besoin d'un objet analyseur pour chaque format de données. Donc, il devrait y avoir un analyseur de texte, un analyseur XML, etc. Bien sûr, chacun aurait toujours la même classe de base ... –