Une des exigences de l'ingénierie du logiciel est la production de
composants assemblables et utilisables dans plusieurs réalisations,
comme dans toute autre activité industrielle. La mise en uvre de
cette exigence dans un langage de programmation est permise, d'une part
par la notion de module, d'autre part par des règles d'écriture
et d'usage de ces modules.
Plusieurs langages, notamment Modula 2 et Ada, ont été conçus autour de
la notion de module. L'idée est qu'un programme est formé à partir de
plusieurs modules ; les entités définies dans chaque module sont
classées en deux catégories : publiques ou privées. Les
entités publiques d'un module sont déclarées dans son interface
et sont exportables vers les autres modules, lesquels déclarent
dans leurs interfaces les entités qu'ils importent. Les modules
exportant des entités offrent des services dont sont
clients les modules qui les importent. En outre, la distinction
public/privé permet une discipline de noms : les noms privés, n'étant
pas connus à l'extérieur de leur module, peuvent être réutilisés sans
risque par d'autres modules. Le langage disposant actuellement de la
meilleure notion de module semble être Ocaml. Java met en uvre la
modularité à travers des mécanismes d'accessibilité et d'abstraction
portant sur ses paquets et ses types.
Loin d'être simplement un nouveau langage, Java est au cur d'une
nouvelle technologie, qui se déploie à la fois de façon matérielle
(futures cartes à puce, systèmes embarqués) et de façon logicielle sous
forme d'API spécialisée (Application Programming Interface), par
exemple pour l'accès aux bases de données, la programmation réseau ou
pour le graphique.
L'utilisation des APIs fait que de nombreuses applications
traditionnellement difficiles à programmer deviennent très simples.
Cependant, leur utilisation demande une certaine compréhension de leur
organisation, ce qui est l'un des objectifs de cette partie. Cette
organisation résulte d'une part de traits du langage Java (les
packages, les interfaces, les règles d'accessibilité,
les hiérarchies de types) et d'autre part, de l'application systématique
de certaines méthodes de conception, qui identifient des situations
typiques et des façons de les aborder et de les résoudre. Le besoin de
recourir à de telles méthodes de conception n'est pas propre à
l'informatique. La notion de pattern a été
développée à la fin des années 1970 par un architecte, Christopher
Alexander, qui les définit ainsi :
<<A pattern is a careful description of a perennial solution to a recurring problem within a building context, describing one of the configurations which brings life to a building. A pattern language is a network of patterns that call upon one another. An individual house might, for example, call upon the patterns described under the names of half-hidden garden, light from two sides in every room, variation of ceiling height, bed alcove, etc. Patterns help us remember insights and knowledge about design and can be used in combination to create designs.>>
Cette notion s'est vue réappropriée par des informaticiens, une dizaine d'années plus tard, et constitue actuellement l'une des approches les plus intéressantes de l'architecture des systèmes logiciels. Tant ces traits du langage que les patterns sont utiles à la programmation d'applications, pour peu que l'on s'efforce de les programmer proprement en respectant certains critères : indépendance de l'interface et de l'implémentation, facilité de modification ou de réutilisation, etc. Les choix que l'on fait quand on écrit un programme peuvent souvent se lire comme le choix d'un pattern contre un autre. Cette partie présentera quelques uns de ces patterns : fabrication, itération, décoration, visitation (?), etc.