OVH Cloud OVH Cloud

Genericite et classes similaires...

2 réponses
Avatar
Fabien LE LEZ
Bonjour,

Je suis en ce moment confronté à une interrogation qui revient de
temps en temps.

A partir de la class TEdit de OWL, qui représente une boîte d'édition
(= une endroit où l'utilisateur peut taper du texte), j'ai dérivé une
classe EditTime, qui n'accepte que des entrées sous la forme
hh:mm:ss.xxx. Il s'agit d'un code assez court (~70 lignes).
Je dois maintenant faire la même chose avec une date. Et là, j'ai deux
choix devant moi :
- soit faire le code de la nouvelle classe, en m'aidant de celui
la classe existante, mais totalement indépendant
- soit refondre la classe existante pour la rendre plus
générique, la transformer en classe abstraite, et faire dériver
EditTime et EditDate de cette classe abstraite

La deuxième solution est sans doute celle préconisée par les bons
usages, à cause des possibilités d'évolution, mais :
- la première solution est nettement plus rapide
- la classe EditTime existant est à la fois simple et stable,
d'où peu d'évolution possible, d'autant que si je veux faire quelque
chose de vaguement ressemblant, j'ai plus vite fait de pondre un
nouveau code -- il ne s'agit de d'une dizaine de lignes de code.

Voilà voilà, j'aimerais avoir vos avis, vos expériences, etc.

Merci d'avance, et bonne journée !



--
;-)

http://www.gotw.ca/gotw/063.htm
http://www.gotw.ca/gotw/067.htm#2

2 réponses

Avatar
kanze
Fabien LE LEZ wrote in message
news:...

Je suis en ce moment confronté à une interrogation qui revient de
temps en temps.

A partir de la class TEdit de OWL, qui représente une boîte d'édition
(= une endroit où l'utilisateur peut taper du texte), j'ai dérivé une
classe EditTime, qui n'accepte que des entrées sous la forme
hh:mm:ss.xxx. Il s'agit d'un code assez court (~70 lignes). Je dois
maintenant faire la même chose avec une date. Et là, j'ai deux choix
devant moi :
- soit faire le code de la nouvelle classe, en m'aidant de celui
la classe existante, mais totalement indépendant
- soit refondre la classe existante pour la rendre plus
générique, la transformer en classe abstraite, et faire dériver
EditTime et EditDate de cette classe abstraite

La deuxième solution est sans doute celle préconisée par les bons
usages, à cause des possibilités d'évolution, mais :
- la première solution est nettement plus rapide
- la classe EditTime existant est à la fois simple et stable,
d'où peu d'évolution possible, d'autant que si je veux faire quelque
chose de vaguement ressemblant, j'ai plus vite fait de pondre un
nouveau code -- il ne s'agit de d'une dizaine de lignes de code.


D'où tiens-tu que la deuxième solution est celle préconisée ? La
généricité, c'est comme l'optimisation -- il ne faut jamais la faire
trop tôt. En fait, *si* tu trouves, et *après* que tu as trouvé qu'il y
a beaucoup en commun entre plusieurs de ces classes, tu peux faire du
refactoring.

Et je doute qu'une classe de base commune soit la bonne solution pour la
refactoring. Une classe de base commune indique, en général, une
interface commune et une substitutabilité. Je verrais plutôt un délégué
pour la partie de l'implémentation commune. (En passant, dans ton cas
précis, je crois que le délégué est tout fait : boost::regex.)

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
Jean-Marc Bourguet
writes:

Fabien LE LEZ wrote in message
news:...

Je suis en ce moment confronté à une interrogation qui revient de
temps en temps.

A partir de la class TEdit de OWL, qui représente une boîte d'édition
(= une endroit où l'utilisateur peut taper du texte), j'ai dérivé une
classe EditTime, qui n'accepte que des entrées sous la forme
hh:mm:ss.xxx. Il s'agit d'un code assez court (~70 lignes). Je dois
maintenant faire la même chose avec une date. Et là, j'ai deux choix
devant moi :
- soit faire le code de la nouvelle classe, en m'aidant de celui
la classe existante, mais totalement indépendant
- soit refondre la classe existante pour la rendre plus
générique, la transformer en classe abstraite, et faire dériver
EditTime et EditDate de cette classe abstraite

La deuxième solution est sans doute celle préconisée par les bons
usages, à cause des possibilités d'évolution, mais :
- la première solution est nettement plus rapide
- la classe EditTime existant est à la fois simple et stable,
d'où peu d'évolution possible, d'autant que si je veux faire quelque
chose de vaguement ressemblant, j'ai plus vite fait de pondre un
nouveau code -- il ne s'agit de d'une dizaine de lignes de code.


D'où tiens-tu que la deuxième solution est celle préconisée ? La
généricité, c'est comme l'optimisation -- il ne faut jamais la faire
trop tôt. En fait, *si* tu trouves, et *après* que tu as trouvé qu'il y
a beaucoup en commun entre plusieurs de ces classes, tu peux faire du
refactoring.

Et je doute qu'une classe de base commune soit la bonne solution pour la
refactoring. Une classe de base commune indique, en général, une
interface commune et une substitutabilité. Je verrais plutôt un délégué
pour la partie de l'implémentation commune. (En passant, dans ton cas
précis, je crois que le délégué est tout fait : boost::regex.)


Si j'ai bonne memoire -- du temps ou je faisais du Pascal -- il y
avait un delegue du genre TValidator prevu pour ca... n'a-t'il pas ete
transpose en C++?

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org