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?