 |
 |
1) Introduction sur les « objets » |
|
 |
|
Texte original |
 |
Traducteur : Jérome QUELIN |
|
 |
|
 |
 |
 |
 |
 |
 |
|
 |
|
 |
 |
 |
The boundary between a use case and an
actor can point out the existence of a
user interface, but it does not
define such a user interface. For a process of defining and creating user
interfaces, see Software for Use by Larry Constantine and Lucy Lockwood,
(Addison-Wesley Longman, 1999) or go to www.ForUse.com.
|
 |
La frontière entre un cas d'utilisation et un acteur peut
révéler l'existence d'une interface utilisateur, mais ne définit pas
cette interface utilisateur. Pour une méthode de définition et de création
d'interfaces utilisateur, se référer à Software for Use de Larry
Constantine et Lucy Lockwood, (Addison-Wesley Longman, 1999) ou sur
www.ForUse.com.
|
 |
 |
 |
Although it’s a black art, at this
point some kind of basic scheduling is important. You now
have an overview of what you’re building, so you’ll probably be able
to get some idea of how long it will take. A lot of factors come into play here.
If you estimate a long schedule then the company might decide not to build it
(and thus use their resources on something more reasonable—that’s a
good thing). Or a manager might have already decided how long the project
should take and will try to influence your estimate. But it’s best to have
an honest schedule from the beginning and deal with the tough decisions early.
There have been a lot of attempts to come up with accurate scheduling techniques
(much like techniques to predict the stock market), but probably the best
approach is to rely on your experience and intuition. Get a gut feeling for how
long it will really take, then double that and add 10 percent. Your gut feeling
is probably correct; you can get something working in that time. The
“doubling” will turn that into something decent, and the 10 percent
will deal with the final polishing and
details[12].
However you want to explain it, and regardless of the moans and manipulations
that happen when you reveal such a schedule, it just seems to work out that
way.
|
 |
Bien que cela tienne plus de l'art obscur, à ce point
un calendrier de base est important. On dispose maintenant d'une vue d'ensemble de ce qu'on
construit, on peut donc se faire une idée du temps nécessaire à sa
réalisation. Un grand nombre de facteurs entre en jeu ici. Si on estime un calendrier trop
important, l'entreprise peut décider d'abandonner le projet (et utiliser leurs ressources
sur quelque chose de plus raisonnable - ce qui est une bonne chose). Ou un directeur peut
avoir déjà décidé du temps que le projet devrait prendre et voudra
influencer les estimations. Mais il vaut mieux proposer un calendrier honnête et prendre les
décisions importantes au début. Beaucoup de techniques pour obtenir des calendriers
précis ont été proposées (de même que pour prédire
l'évolution de la bourse), mais la meilleure approche est probablement de se baser sur son
expérience et son intuition. Proposer une estimation du temps nécessaire pour
réaliser le système, puis doubler cette estimation et ajouter 10 pour cent.
L'estimation initiale est probablement correcte, on peut obtenir un système
fonctionnel avec ce temps. Le doublement transforme le délai en quelque chose de
décent, et les 10 pour cent permettront de poser le vernis final et de traiter les
détails [12]. Peu importe comment on l'explique et
les gémissements obtenus quand on révèle un tel planning, il semble juste que
ça fonctionne de cette façon.
|
 |
 |
 |
Phase 2: How will we build it?
|
 |
Phase 2 : Comment allons-nous le construire ?
|
 |
 |
 |
In this phase you must come up with a
design that describes what the classes look like and how they will interact. An
excellent technique in determining classes and interactions is the
Class-Responsibility-Collaboration
(CRC) card. Part of the value of this tool is that it’s so low-tech: you
start out with a set of blank 3 x 5 cards, and you write on them. Each card
represents a single class, and on the card you write:
|
 |
Dans cette phase on doit fournir une conception qui décrive ce
à quoi les classes ressemblent et comment elles interagissent. Un bon outil pour
déterminer les classes et les interactions est la méthode des
cartes Classes-Responsabilités-Collaboration (CRC). L'un des avantages de cet
outil est sa simplicité : on prend des cartes vierges et on écrit dessus au fur
et à mesure. Chaque carte représente une classe, et sur la carte on écrit
:
|
 |
 |
 |
- The name of the class.
It’s important that this name capture the essence of what the class does,
so that it makes sense at a
glance.
- The
“responsibilities” of the class: what it should do. This can
typically be summarized by just stating the names of the member functions (since
those names should be descriptive in a good design), but it does not preclude
other notes. If you need to seed the process, look at the problem from a lazy
programmer’s standpoint: What objects would you like to magically appear
to solve your
problem?
- The
“collaborations” of the class: what other classes does it interact
with? “Interact” is an intentionally broad term; it could mean
aggregation or simply that some other object exists that will perform services
for an object of the class. Collaborations should also consider the audience for
this class. For example, if you create a class Firecracker, who is going
to observe it, a Chemist or a Spectator? The former will want to
know what chemicals go into the construction, and the latter will respond to the
colors and shapes released when it
explodes.
|
 |
- Le nom de la classe. Il est important que le nom de cette classe
reflète l'essence de ce que la classe fait, afin que sa compréhension soit
immédiate.
- Les « responsabilités » de la
classe : ce qu'elle doit faire. Typiquement, cela peut être résumé par le
nom des fonctions membres (puisque ces noms doivent être explicites dans une bonne
conception), mais cela n'empêche pas de compléter par d'autres notes. Pour s'aider, on
peut se placer du point de vue d'un programmeur fainéant : quels objets voudrait-on
voir apparaître pour résoudre le problème ?
- Les « collaborations » de la classe : avec
quelles classes interagit-elle ? « Interagir » est intentionnellement
évasif, il peut se référer à une agrégation ou indiquer qu'un
autre objet existant va travailler pour le compte d'un objet de la classe. Les collaborations
doivent aussi prendre en compte l'audience de cette classe. Par exemple, si on crée une
classe Pétard, qui va l'observer, un Chimiste ou un
Spectateur ? Le premier voudra connaître la composition chimique,
tandis que le deuxième sera préoccupé par les couleurs et le bruit produits
quand il explose.
|
 |
 |
 |
You may feel like
the cards should be bigger because of all the information you’d like to
get on them, but they are intentionally small, not only to keep your classes
small but also to keep you from getting into too much detail too early. If you
can’t fit all you need to know about a class on a small card, the class is
too complex (either you’re getting too detailed, or you should create more
than one class). The ideal class should be understood at a glance. The idea of
CRC cards is to assist you in coming up with a first cut of the design so that
you can get the big picture and then refine your design.
|
 |
On pourrait se dire que les cartes devraient être plus grandes
à cause de toutes les informations qu'on aimerait mettre dessus, mais il vaut mieux les
garder les plus petites possibles, non seulement pour concevoir de petites classes, mais aussi pour
éviter de plonger trop tôt dans les détails. Si on ne peut pas mettre toutes
les informations nécessaires à propos d'une classe sur une petite carte, la classe
est trop complexe (soit le niveau de détails est trop élevé, soit il faut
créer plus d'une classe). La classe idéale doit être comprise en un coup
d'oeil. L'objectif des cartes CRC est de fournir un premier jet de la conception afin de saisir le
plan général pour pouvoir ensuite affiner cette conception.
|
 |
 |
 |
One of the great benefits of CRC cards is
in communication. It’s best done real time, in a group, without computers.
Each person takes responsibility for several classes (which at first have no
names or other information). You run a live simulation by solving one scenario
at a time, deciding which messages are sent to the various objects to satisfy
each scenario. As you go through this process, you discover the classes that you
need along with their responsibilities and collaborations, and you fill out the
cards as you do this. When you’ve moved through all the use cases, you
should have a fairly complete first cut of your design.
|
 |
L'un des avantages des cartes CRC réside dans la communication. Il
vaut mieux les réaliser en groupe, sans ordinateur. Chacun prend le rôle d'une ou
plusieurs classes (qui au début n'ont pas de nom ni d'information associée). Il
suffit alors de dérouler une simulation impliquant un scénario à la fois, et
décider quels messages sont envoyés aux différents objets pour satisfaire
chaque scénario. Au fur et à mesure du processus, on découvre quelles sont les
classes nécessaires, leurs responsabilités et collaborations, et on peut remplir les
cartes. Quand tous les scénarios ont été couverts, on devrait disposer d'une
bonne approximation de la conception.
|
 |
 |
 |
Before I began using CRC cards, the most
successful consulting experiences I had when coming up with an initial design
involved standing in front of a team—who hadn’t built an OOP project
before—and drawing objects on a whiteboard. We talked about how the
objects should communicate with each other, and erased some of them and replaced
them with other objects. Effectively, I was managing all the “CRC
cards” on the whiteboard. The team (who knew what the project was supposed
to do) actually created the design; they “owned” the design rather
than having it given to them. All I was doing was guiding the process by asking
the right questions, trying out the assumptions, and taking the feedback from
the team to modify those assumptions. The true beauty of the process was that
the team learned how to do object-oriented design not by reviewing abstract
examples, but by working on the one design that was most interesting to them at
that moment: theirs.
|
 |
Avant d'utiliser les cartes CRC, la meilleure conception initiale que j'ai
fourni sur un projet fut obtenue en dessinant des objets sur un tableau devant une équipe -
qui n'avait jamais participé à un projet de POO auparavant. Nous avons discuté
de la communication entre ces objets, effacé et remplacé certains d'entre eux par
d'autres objets. De fait, je recréais la méthode des cartes CRC au tableau.
L'équipe (qui connaissait ce que le projet était censé faire) a effectivement
créé la conception ; et de ce fait ils la contrôlaient. Je me contentais
de guider le processus en posant les bonnes questions, proposant quelques hypothèses et
utilisant les réponses de l'équipe pour modifier ces hypothèses. La
beauté de la chose fut que l'équipe a appris à bâtir une conception
orientée objet non en potassant des exemples abstraits, mais en travaillant sur la
conception qui les intéressait au moment présent : celle de leur
projet.
|
 |
 |
 |
Once you’ve come up with a set of
CRC cards, you may want to create a more formal description of your design using
UML[13]. You
don’t need to use UML, but it can be helpful,
especially if you want to put up a diagram on the wall for everyone to ponder,
which is a good idea. An alternative to UML is a textual description of the
objects and their interfaces, or, depending on your programming language, the
code
itself[14].
|
 |
Une fois qu'on dispose d'un ensemble de cartes CRC, on peut vouloir une
description plus formelle de la conception en utilisant UML "fnB13">[13]. L'utilisation d'UML n'est pas une obligation, mais cela peut être utile,
surtout si on veut afficher au mur un diagramme auquel tout le monde puisse se
référer, ce qui est une bonne idée. Une alternative à UML est une
description textuelle des objets et de leur interface, ou suivant le langage de programmation, le
code lui-même [14].
|
 |
 |
 |
UML also provides an additional
diagramming notation for describing the dynamic model of your system. This is
helpful in situations in which the state transitions of a system or subsystem
are dominant enough that they need their own diagrams (such as in a control
system). You may also need to describe the data structures, for systems or
subsystems in which data is a dominant factor (such as a
database).
|
 |
UML fournit aussi une notation pour décrire le modèle
dynamique du système. Cela est pratique dans les cas où les états de
transition d'un système ou d'un sous-sytème sont suffisamment importants pour
nécessiter leurs propres diagrammes (dans un système de contrôle par exemple).
On peut aussi décrire les structures de données, pour les systèmes ou
sous-systèmes dans lesquels les données sont le facteur dominant (comme une base de
données).
|
 |
 |
 |
You’ll know you’re done with
Phase 2 when you have described the objects and their interfaces. Well, most of
them—there are usually a few that slip through the cracks and don’t
make themselves known until Phase 3. But that’s OK. All you are concerned
with is that you eventually discover all of your objects. It’s nice to
discover them early in the process, but OOP provides enough structure so that
it’s not so bad if you discover them later. In fact, the design of an
object tends to happen in five stages, throughout the process of program
development.
|
 |
On sait que la Phase 2 est terminée quand on dispose de la
description des objets et de leur interface. Ou du moins de la majorité d'entre eux - il y
en a toujours quelques-uns qu'on ne découvre qu'en Phase 3 , mais cela ne fait rien. La
préoccupation principale est de découvrir tous les objets. Il est plus
agréable de les découvrir le plus tôt possible, mais la POO est assez souple
pour pouvoir s'adapter si on en découvre de nouveaux par la suite. En fait, la conception
d'un objet se fait en cinq étapes.
|
 |
 |
 |
Five stages of object
design
|
 |
Les cinq étapes de la conception d'un objet
|
 |
 |
 |
The design life of an object is not
limited to the time when you’re writing the program. Instead, the design
of an object appears over a sequence of stages. It’s helpful to have this
perspective because you stop expecting perfection right away; instead, you
realize that the understanding of what an object does and what it should look
like happens over time. This view also applies to the design of various types of
programs; the pattern for a particular type of program emerges through
struggling again and again with that problem (This is chronicled in the book
Thinking in Patterns with Java, downloadable at
www.BruceEckel.com). Objects, too, have their patterns that emerge
through understanding, use, and reuse.
|
 |
La conception d'un objet n'est pas limitée à la phase de
codage du programme. En fait, la conception d'un objet passe par une suite d'étapes. Garder
cela à l'esprit permet d'éviter de prétendre à la perfection
immédiate. On réalise que la compréhension de ce que fait un objet et de ce
à quoi il doit ressembler se fait progressivement. Ceci s'applique d'ailleurs aussi à
la conception de nombreux types de programmes ; le modèle d'un type de programme
n'émerge qu'après s'être confronté encore et encore au problème
(se référer au livre Thinking in Patterns with Java,
téléchargeable sur www.BruceEckel.com). Les objets aussi ne se
révèlent à la compréhension qu'après un long
processus.
|
 |
 |
 |
1. Object
discovery. This stage occurs during the
initial analysis of a program. Objects may be discovered by looking for external
factors and boundaries, duplication of elements in the system, and the smallest
conceptual units. Some objects are obvious if you already have a set of class
libraries. Commonality between classes suggesting base classes and inheritance
may appear right away, or later in the design process.
|
 |
1. Découverte de l'objet. Cette étape se
situe durant l'analyse initiale du programme. Les objets peuvent être découvert en
cherchant les facteurs extérieurs et les frontières, la duplication
d'éléments dans le système, et les plus petites unités conceptuelles.
Certains objets sont évidents si on dispose d'un ensemble de bibliothèques de
classes. La ressemblance entre les classes peut suggérer des classes de base et
l'héritage peut en être déduit immédiatement, ou plus tard dans la phase
de conception.
|
 |
 |
 |
2. Object
assembly. As you’re building an
object you’ll discover the need for new members that didn’t appear
during discovery. The internal needs of the object may require other classes to
support it.
|
 |
2. Assemblage des objets. Lors de la construction d'un
objet, on peut découvrir le besoin de nouveaux membres qui n'était pas apparu durant
l'étape de découverte. Les besoins internes d'un objet peuvent requérir
d'autres classes pour les supporter.
|
 |
 |
 |
3. System
construction. Once again, more
requirements for an object may appear at this later stage. As you learn, you
evolve your objects. The need for communication and interconnection with other
objects in the system may change the needs of your classes or require new
classes. For example, you may discover the need for facilitator or helper
classes, such as a linked list, that contain little or no state information and
simply help other classes function.
|
 |
3. Construction du système. Une fois de plus, un
objet peut révéler des besoins supplémentaires durant cette étape. Au
fur et à mesure de l'avancement du projet, les objets évoluent. Les besoins de la
communication et de l'interconnexion avec les autres objets du système peuvent changer les
besoins des classes ou demander de nouvelles classes. Par exemple, on peut découvrir le
besoin de classes d'utilitaires, telles que des listes chaînées, qui contiennent peu
ou pas d'information et sont juste là pour aider les autres classes.
|
 |
 |
 |
4. System
extension. As you add new features to a
system you may discover that your previous design doesn’t support easy
system extension. With this new information, you can restructure parts of the
system, possibly adding new classes or class hierarchies.
|
 |
4. Extension du système. Si on ajoute de nouvelles
fonctionnalités au système, on peut se rendre compte que sa conception ne facilite
pas l'extension du système. Avec cette nouvelle information, on peut restructurer certaines
parties du système, éventuellement en ajoutant de nouvelles classes ou de nouvelles
hiérarchies de classes.
|
 |
 |
 |
5. Object
reuse. This is the
real stress test for a class. If someone tries to reuse it in an entirely new
situation, they’ll probably discover some shortcomings. As you change a
class to adapt to more new programs, the general principles of the class will
become clearer, until you have a truly reusable type. However, don’t
expect most objects from a system design to be reusable—it is perfectly
acceptable for the bulk of your objects to be system-specific. Reusable types
tend to be less common, and they must solve more general problems in order to be
reusable.
|
 |
5. Réutilisation des objets. Ceci est le test final
pour une classe. Si quelqu'un tente de réutiliser une classe dans une situation
entièrement différente, il y découvrira certainement des imperfections. La
modification de la classe pour s'adapter à de nouveaux programmes va en
révéler les principes généraux, jusqu'à l'obtention d'un type
vraiment réutilisable. Cependant, il ne faut pas s'attendre à ce que tous les objets
d'un système soient réutilisables - il est tout à fait légitime que la
majorité des objets soient spécifiques au système. Les classes
réutilisables sont moins fréquentes, et doivent traiter de problèmes plus
génériques pour être réutilisables.
|
 |
 |
 |
Guidelines for object
development
|
 |
Indications quant au développement des objets
|
 |
 |
 |
These stages suggest some guidelines when
thinking about developing your classes:
|
 |
Ces étapes suggèrent quelques règles de base
concernant le développement des classes :
|
 |
 |
 |
- Let a specific problem
generate a class, then let the class grow and mature during the solution of
other
problems.
- Remember,
discovering the classes you need (and their interfaces) is the majority of the
system design. If you already had those classes, this would be an easy
project.
- Don’t
force yourself to know everything at the beginning; learn as you go. This will
happen anyway.
- Start
programming; get something working so you can prove or disprove your design.
Don’t fear that you’ll end up with procedural-style spaghetti
code—classes partition the problem and help control anarchy and entropy.
Bad classes do not break good
classes.
- Always keep
it simple. Little clean objects with obvious utility are better than big
complicated interfaces. When decision points come up, use an Occam’s Razor
approach: Consider the choices and select the one that is simplest, because
simple classes are almost always best. Start small and simple, and you can
expand the class interface when you understand it better. As time goes on,
it’s difficult to remove elements from a
class.
|
 |
- Quand un problème spécifique génère une
classe, la laisser grandir et mûrir durant la résolution d'autres
problèmes.
- Se rappeler que la conception du système consiste principalement
à découvrir les classes dont on a besoin (et leurs interfaces). Si on dispose
déjà de ces classes, le projet ne devrait pas être
compliqué.
- Ne pas vouloir tout savoir dès le début ; compléter
ses connaissances au fur et à mesure de l'avancement du projet. La connaissance viendra de
toutes façons tôt ou tard.
- Commencer à programmer ; obtenir un prototype qui marche afin
de pouvoir approuver la conception ou au contraire la dénoncer. Ne pas avoir peur de se
retrouver avec du code-spaghetti à la procédurale - les classes partitionnent le
problème et aident à contrôler l'anarchie. Les mauvaises classes n'affectent
pas les classes bien conçues.
- Toujours rester le plus simple possible. De petits objets propres avec une
utilité apparente sont toujours mieux conçus que ceux disposant de grosses interfaces
compliquées. Quand une décision doit être prise, utiliser l'approche du «
rasoir d'Occam » : choisir la solution la plus simple, car les classes simples sont presque
toujours les meilleures. Commencer petit et simple, et étendre l'interface de la classe
quand on la comprend mieux. Il est toujours plus difficile d'enlever des éléments
d'une classe.
|
 |
 |
 |
Phase 3: Build the core
|
 |
Phase 3 : Construire le coeur du système
|
 |
 |
 |
This is the initial conversion from the
rough design into a compiling and executing body of code that can be tested, and
especially that will prove or disprove your architecture. This is not a one-pass
process, but rather the beginning of a series of steps that will iteratively
build the system, as you’ll see in Phase 4.
|
 |
Ceci est la conversion initiale de la conception brute en portion de code
compilable et exécutable qui peut être testée, et surtout qui va permettre
d'approuver ou d'invalider l'architecture retenue. Ce n'est pas un processus qui se fait en une
passe, mais plutôt le début d'une série d'étapes qui vont construire le
système au fur et à mesure comme le montre la Phase 4.
|
 |
 |
 |
Your goal is to find the core of your
system architecture that needs to be implemented in order to generate a running
system, no matter how incomplete that system is in this initial pass.
You’re creating a framework that you can build on with further iterations.
You’re also performing the first of many system integrations and tests,
and giving the stakeholders feedback about what their system will look like and
how it is progressing. Ideally, you are also exposing some of the critical
risks. You’ll probably also discover changes and improvements that can be
made to your original architecture—things you would not have learned
without implementing the system.
|
 |
Le but ici est de trouver le coeur de l'architecture du système qui
a besoin d'être implémenté afin de générer un système
fonctionnel, sans se soucier de l'état de complétion du système dans cette
passe initiale. Il s'agit ici de créer un cadre sur lequel on va pouvoir s'appuyer pour les
itérations suivantes. On réalise aussi la première des nombreuses
intégrations et phases de tests, et on donne les premiers retours aux clients sur ce
à quoi leur système ressemblera et son état d'avancement. Idéalement,
on découvre quelques-uns des risques critiques. Des changements ou des améliorations
sur l'architecture originelle seront probablement découverts - des choses qu'on n'aurait pas
découvert avant l'implémentation du système.
|
 |
 |
 |
Part of building the system is the
reality check that you get from testing against your requirements analysis and
system specification (in whatever form they exist). Make sure that your tests
verify the requirements and use cases. When the core of the system is stable,
you’re ready to move on and add more
functionality.
|
 |
Une partie de la construction du système consiste à
confronter le système avec l'analyse des besoins et les spécifications du
système (quelle que soit la forme sous laquelle ils existent). Il faut s'assurer en effet
que les tests vérifient les besoins et les cas d'utilisations. Quand le coeur du
système est stable, on peut passer à la suite et ajouter des fonctionnalités
supplémentaires.
|
 |
 |
 |
Phase 4: Iterate the use cases
|
 |
Phase 4 : Itérer sur les cas d'utilisation
|
 |
 |
 |
Once the core framework is running, each
feature set you add is a small project in itself. You add a feature set during
an iteration, a reasonably short period of
development.
|
 |
Une fois que le cadre de base fonctionne, chaque fonctionnalité
ajoutée est un petit projet en elle-même. On ajoute une fonctionnalité durant
une itération, période relativement courte du
développement.
|
 |
 |
 |
How big is an iteration? Ideally, each
iteration lasts one to three weeks (this can vary based on the implementation
language). At the end of that period, you have an integrated, tested system with
more functionality than it had before. But what’s particularly interesting
is the basis for the iteration: a single use case. Each use case is a package of
related functionality that you build into the system all at once, during one
iteration. Not only does this give you a better idea of what the
scope of a use case should be, but
it also gives more validation to the idea of a use case, since the concept
isn’t discarded after analysis and design, but instead it is a fundamental
unit of development throughout the software-building process.
|
 |
Combien de temps dure une itération ? Idéalement, chaque
itération dure entre une et trois semaines (ceci peut varier suivant le langage
d'implémentation choisi). A la fin de cette période, on dispose d'un système
intégré et testé avec plus de fonctionnalités que celles dont il
disposait auparavant. Mais ce qu'il est intéressant de noter, c'est qu'un simple cas
d'utilisation constitue la base d'une itération. Chaque cas d'utilisation est un ensemble de
fonctionnalités qu'on ajoute au système toutes en même temps, durant une
itération. Non seulement cela permet de se faire une meilleure idée de ce que
recouvre ce cas d'utilisation, mais cela permet de le valider, puisqu'il n'est pas abandonné
après l'analyse et la conception, mais sert au contraire tout au long du processus de
création.
|
 |
 |
 |
You stop iterating when you achieve
target functionality or an external deadline arrives and the customer can be
satisfied with the current version. (Remember, software is a subscription
business.) Because the process is iterative, you have many opportunities to ship
a product rather than a single endpoint; open-source projects work exclusively
in an iterative, high-feedback environment, which is precisely what makes them
successful.
|
 |
Les itérations s'arrêtent quand on dispose d'un système
comportant toutes les fonctionnalités souhaitées ou qu'une date limite arrive et que
le client se contente de la version courante (se rappeler que les commanditaires dirigent
l'industrie du logiciel). Puisque le processus est itératif, on dispose de nombreuses
opportunités pour délivrer une version intermédiaire plutôt qu'un
produit final ; les projets open-source travaillent uniquement dans un environnement
itératif avec de nombreux retours, ce qui précisément les rend si
productifs.
|
 |
 |
 |
An iterative development process is
valuable for many reasons. You can reveal and resolve critical risks early, the
customers have ample opportunity to change their minds, programmer satisfaction
is higher, and the project can be steered with more precision. But an additional
important benefit is the feedback to the stakeholders, who can see by the
current state of the product exactly where everything lies. This may reduce or
eliminate the need for mind-numbing status meetings and increase the confidence
and support from the
stakeholders.
|
 |
Un processus de développement itératif est intéressant
pour de nombreuses raisons. Cela permet de révéler et de résoudre des risques
critiques très tôt, les clients ont de nombreuses opportunités pour changer
d'avis, la satisfaction des programmeurs est plus élevée, et le projet peut
être piloté avec plus de précision. Mais un bénéfice additionnel
particulièrement important est le retour aux commanditaires du projet, qui peuvent voir
grâce à l'état courant du produit où le projet en est. Ceci peut
réduire ou éliminer le besoin de réunions soporifiques sur le projet, et
améliore la confiance et le support des commanditaires.
|
 |
 |
 |
Phase 5: Evolution
|
 |
Phase 5 : Evolution
|
 |
 |
 |
This is the point in the development
cycle that has traditionally been called
“maintenance,” a
catch-all term that can mean everything from “getting it to work the way
it was really supposed to in the first place” to “adding features
that the customer forgot to mention” to the more traditional “fixing
the bugs that show up” and “adding new features as the need
arises.” So many misconceptions have been applied to the term
“maintenance” that it has taken on a slightly deceiving quality,
partly because it suggests that you’ve actually built a pristine program
and all you need to do is change parts, oil it, and keep it from rusting.
Perhaps there’s a better term to describe what’s going
on.
|
 |
Cette phase du cycle de développement a traditionnellement
été appelée « maintenance », un terme fourre-tout qui peut
tout vouloir dire depuis « faire marcher le produit comme il était supposé le
faire dès le début » à « ajouter de nouvelles
fonctionnalités que le client a oublié de mentionner » au plus
traditionnel « corriger les bugs qui apparaissent » et « ajouter
de nouvelles fonctionnalités quand le besoin s'en fait sentir ». Le terme
« maintenance » a été la cause de si nombreux malentendus qu'il
en est arrivé à prendre un sens péjoratif, en partie parce qu'il
suggère qu'on a fourni un programme parfait et que tout ce qu'on a besoin de faire est d'en
changer quelques parties, le graisser et l'empêcher de rouiller. Il existe peut-être un
meilleur terme pour décrire ce qu'il en est réellement.
|
 |
 |
 |
I’ll use the term
evolution[15].
That is, “You won’t get it right the first time, so give yourself
the latitude to learn and to go back and make changes.” You might need to
make a lot of changes as you learn and understand the problem more deeply. The
elegance you’ll produce if you evolve until you get it right will pay off,
both in the short and the long term. Evolution is where your program goes from
good to great, and where those issues that you didn’t really understand in
the first pass become clear. It’s also where your classes can evolve from
single-project usage to reusable resources.
|
 |
J'utiliserai plutôt le terme évolutionname="fnB15">[15]. C'est à dire, « Tout ne sera pas parfait dès le
premier jet, il faut se laisser la latitude d'apprendre et de revenir en arrière pour faire
des modifications ». De nombreux changements seront peut-être nécessaires
au fur et à mesure que l'appréhension et la compréhension du problème
augmentent. Si on continue d'évoluer ainsi jusqu'au bout, l'élégance obtenue
sera payante, à la fois à court et long terme. L'évolution permet de passer
d'un bon à un excellent programme, et clarifie les points restés obscurs durant la
première passe. C'est aussi dans cette phase que les classes passent d'un statut
d'utilité limitée au système à ressource
réutilisable.
|
 |
 |
 |
What it means to “get it
right” isn’t just that the program works according to the
requirements and the use cases. It also means that the internal structure of the
code makes sense to you, and feels like it fits together well, with no awkward
syntax, oversized objects, or ungainly exposed bits of code. In addition, you
must have some sense that the program structure will survive the changes that it
will inevitably go through during its lifetime, and that those changes can be
made easily and cleanly. This is no small feat. You must not only understand
what you’re building, but also how the program will evolve (what I call
the vector of change). Fortunately,
object-oriented programming languages are particularly adept at supporting this
kind of continuing modification—the boundaries created by the objects are
what tend to keep the structure from breaking down. They also allow you to make
changes—ones that would seem drastic in a procedural program—without
causing earthquakes throughout your code. In fact, support for evolution might
be the most important benefit of OOP.
|
 |
Ici, « jusqu'au bout » ne veut pas simplement dire
que le programme fonctionne suivant les exigences et les cas d'utilisation. Cela veut aussi dire
que la structure interne du code présente une logique d'organisation et semble bien
s'assembler, sans abus de syntaxe, d'objets surdimensionnés ou de code inutilement
exposé. De plus, il faut s'assurer que la structure du programme puisse s'adapter aux
changements qui vont inévitablement arriver pendant sa durée vie, et que ces
changements puissent se faire aisément et proprement. Ceci n'est pas une petite
caractéristique. Il faut comprendre non seulement ce qu'on construit, mais aussi comment le
programme va évoluer (ce que j'appelle le vecteur changement). Heureusement,
les langages de programmation orientés objet sont particulièrement adaptés
à ce genre de modifications continuelles - les frontières créées par
les objets sont ce qui empêchent la structure du programme de s'effondrer. Ils permettent
aussi de faire des changements - même ceux qui seraient considérés comme
sévères dans un programme procédural - sans causer de ravages dans l'ensemble
du code. En fait le support de l'évolution pourrait bien être le
bénéfice le plus important de la programmation orientée objet.
|
 |
 |
 |
With evolution, you create something that
at least approximates what you think you’re building, and then you kick
the tires, compare it to your requirements, and see where it falls short. Then
you can go back and fix it by redesigning and reimplementing the portions of the
program that didn’t work
right[16].
You might actually need to solve the problem, or an aspect of the problem,
several times before you hit on the right solution. (A study of
Design Patterns is usually
helpful here. You can find information in Thinking in Patterns with Java,
downloadable at www.BruceEckel.com.)
|
 |
Avec l'évolution, on crée quelque chose qui approche ce qu'on
croit avoir construit, on le compare avec les exigences et on repère les endroits où
cela coince. On peut alors revenir en arrière et corriger cela en remodélisant et
réimplémentant les portions du programme qui ne fonctionnaient pas
correctement [16]. De fait, on peut avoir besoin de
résoudre le problème ou un de ses aspects un certain nombre de fois avant de trouver
la bonne solution (une étude de Design Patterns s'avère
généralement utile ici). On pourra trouver plus d'informations dans Thinking in
Patterns with Java, téléchargeable à
www.BruceEckel.com).
|
 |
 |
 |
Evolution also occurs when you build a
system, see that it matches your requirements, and then discover it wasn’t
actually what you wanted. When you see the system in operation, you find that
you really wanted to solve a different problem. If you think this kind of
evolution is going to happen, then you owe it to yourself to build your first
version as quickly as possible so you can find out if it is indeed what you
want.
|
 |
Il faut aussi évoluer quand on construit un système, qu'on
voit qu'il remplit les exigences et qu'on découvre finalement que ce n'était pas ce
qu'on voulait. Quand on se rend compte après avoir vu le système en action qu'on
essayait de résoudre un autre problème. Si on pense que ce genre d'évolution
est à prendre en considération, alors on se doit de construire une première
version aussi rapidement que possible afin de déterminer au plus tôt si c'est
réellement ce qu'on veut.
|
 |
 |
 |
Perhaps the most important thing to
remember is that by default—by definition, really—if you modify a
class, its super- and subclasses will still function. You need not fear
modification (especially if you have a built-in set of unit tests to verify the
correctness of your modifications). Modification won’t necessarily break
the program, and any change in the outcome will be limited to subclasses and/or
specific collaborators of the class you
change.
|
 |
La chose la plus importante à retenir est que par défaut -
par définition, plutôt - si on modifie une classe, ses classes parentes et
dérivées continueront de fonctionner. Il ne faut pas craindre les modifications
(surtout si on dispose d'un ensemble de tests qui permettent de vérifier les modifications
apportées). Les modifications ne vont pas nécessairement casser le programme, et tout
changement apporté sera limité aux sous-classes et / ou aux collaborateurs
spécifiques de la classe qu'on change.
|
 |
 |
 |
Plans pay off
|
 |
Les plans sont payants
|
 |
 |
 |
Of course you wouldn’t build a
house without a lot of carefully drawn plans. If you build a deck or a dog house
your plans won’t be so elaborate, but you’ll probably still start
with some kind of sketches to guide you on your way. Software development has
gone to extremes. For a long time, people didn’t have much structure in
their development, but then big projects began failing. In reaction, we ended up
with methodologies that had an intimidating amount of structure and detail,
primarily intended for those big projects. These methodologies were too scary to
use—it looked like you’d spend all your time writing documents and
no time programming. (This was often the case.) I hope that what I’ve
shown you here suggests a middle path—a sliding scale. Use an approach
that fits your needs (and your personality). No matter how minimal you choose to
make it, some kind of plan will make a big improvement in your project as
opposed to no plan at all. Remember that, by most estimates, over 50 percent of
projects fail (some estimates go up to 70 percent!).
|
 |
Bien sûr on ne bâtirait pas une maison sans une multitude de
plans dessinés avec attention. Si on construit un pont ou une niche, les plans ne seront pas
aussi élaborés, mais on démarre avec quelques esquisses pour se guider. Le
développement de logiciels a connu les extrêmes. Longtemps les gens ont
travaillé sans structure, mais on a commencé à assister à
l'effondrement de gros projets. En réaction, on en est arrivé à des
méthodologies comprenant un luxe de structure et de détails, destinées
justement à ces gros projets. Ces méthodologies étaient trop intimidantes pour
qu'on les utilise - on avait l'impression de passer son temps à écrire des documents
et aucun moment à coder (ce qui était souvent le cas). J'espère que ce que je
vous ai montré ici suggère un juste milieu. Utilisez une approche qui corresponde
à vos besoins (et votre personnalité). Même s'il est minimal, la
présence d'un plan vous apportera beaucoup dans la gestion de votre projet. Rappelez-vous
que selon la plupart des estimations, plus de 50 pour cent des projets échouent (certaines
estimations vont jusqu'à 70 pour cent).
|
 |
 |
 |
By following a plan—preferably one
that is simple and brief—and coming up with design structure before
coding, you’ll discover that things fall together far more easily than if
you dive in and start hacking. You’ll also realize a great deal of
satisfaction. It’s my experience that coming up with an elegant solution
is deeply satisfying at an entirely different level; it feels closer to art than
technology. And elegance always pays off; it’s not
a frivolous pursuit. Not only does it give you a program that’s easier to
build and debug, but it’s also easier to understand and maintain, and
that’s where the financial value
lies.
|
 |
En suivant un plan - de préférence un qui soit simple et
concis - et en produisant une modélisation de la structure avant de commencer à
coder, vous découvrirez que les choses s'arrangent bien mieux que si on se lance comme
ça dans l'écriture. Vous en retirerez aussi une plus grande satisfaction. Suivant mon
expérience, arriver à une solution élégante procure une satisfaction
à un niveau entièrement différent ; cela ressemble plus à de l'art
qu'à de la technologie. Et l'élégance est toujours payante, ce n'est pas une
vaine poursuite. Non seulement on obtient un programme plus facile à construire et
débugguer, mais qui est aussi plus facile à comprendre et maintenir, et c'est
là que sa valeur financière réside.
|
 |
 |
 |
 |
 |
 |
 |
 |
|
 |
 |
 |