2010-01-29 5 views
0

J'utilise actuellement QtextStream de Qt pour lire de nombreux types différents (lire: extension différente) de fichiers texte. Chaque classe « FileReader » Je crée commence à avoir un schéma similaire où il doit readline() comme ceci:Comment est-ce que je devrais refactoriser mon code dans ce cas?

// Get the line's first word as float where each word is delimited by a comma 
fileData.readLine().split(",")[0].toFloat(); 

Vous pouvez imaginer que j'ai des dizaines de ces lignes dans mon programme.

De plus, il est possible que toFloat() peut échouer (par exemple, la valeur lue est non convertible flotter), donc je prévois de modifier la ligne ci-dessus comme ceci:

// Get the line's first word as float where each word is delimited by a comma 
bool convertible; 
fileData.readLine().split(",")[0].toFloat(&convertible); 
if(!convertible) throw std::runtime_error("Error!"); 

De toute évidence, l'OMI, le code le moins maintenable serait simplement répéter le code ci-dessus à chaque ligne que j'utilise readLine(). Ce n'est certainement pas le chemin que je prévois de choisir. (Je souhaiterais que quelqu'un qui pourrait prouver le contraire les avantages de le faire)

Je pourrais penser à quelques façons de refactoriser ce code.

1) Au lieu d'utiliser directement la classe QtextStream de Qt, créez ma propre classe qui possède QTextStream, puis créez une méthode appelée readFirstTokenAsFloat(). À l'intérieur de cette méthode, j'aurais une vérification d'erreur comme indiqué ci-dessus. Ensuite, chaque classe "FileReader" passerait maintenant à utiliser cette nouvelle classe. Les avantages de cette approche, IMO, est qu'il accomplit ce que je veux faire, mais les inconvénients, IMO, est que si je devais faire d'autres choses, ou si je voulais utiliser d'autres méthodes de QTextStream, je violerais le DRY principe (?) en dupliquant les mêmes méthodes, et en interne juste avoir un interligne appelant QTextStream.

2) OU Je pourrais juste hériter de QTextStream. De cette façon, je voudrais simplement étendre ses fonctionnalités, et obtenir également toutes les fonctionnalités de QTextStream. Mais l'héritage est-il une bonne idée dans ce cas?

3) Avez-vous d'autres idées? Je suis sûr que quelqu'un a rencontré quelque chose comme ça. Y a-t-il un nom spécifique pour ce modèle?

Répondre

1

Si vous pensez utiliser toutes les fonctionnalités de QTextStream, alors l'héritage est le chemin à parcourir. L'héritage n'est pas une mauvaise chose en soi, il faut juste éviter dans certains cas. Mais s'il y a au moins une méthode dans QTextStream qui ne devrait pas être appelée du tout, alors cela conduirait probablement à un design bizarre (peut-être qu'une interface aiderait dans ce cas)

Maintenant, si vous utilisez un sous-ensemble des fonctionnalités, puis la composition (approche numéro 1) est la voie à suivre.

Je suggérerais en plus de créer une interface avec la méthode "readFirstTokenAsFloat()" et n'importe quelle autre méthode que vous voulez, puis implémenter l'interface (et l'utiliser sur votre "FileReaders"). De cette façon, vous avez un design moins couplé et plus facile à changer.

Si quelque chose n'était pas clair ou était controversé, n'hésitez pas à poster dans les commentaires, afin que nous puissions améliorer la réponse =).

Questions connexes