Vous êtes sur la page 1sur 35

LOG4430 :

Architecture logicielle et
conception avancée
Yann-Gaël Guéhéneuc
Cours 3 – Bibliothèques et chargement
dynamique de composants

Département de génie informatique et de génie logiciel


École Polytechnique de Montréal © Guéhéneuc, 2012
Plan

1. Introduction
2. Bibliothèques et cadriciels
• Types d’interconnexions
• Problèmes légaux
• Problèmes techniques
3. Sous-classage
• Crochets et gabarits
• Patrons de conception
4. Chargement dynamique
• Méta-classes
• Protocoles de méta-objets (MOP)
2/35
• MOP à la compilation, à l’exécution
1. Introduction

 Aucun logiciel de grande taille n’est


développé depuis zéro aujourd’hui
– Sauf dans le cas de développement en « salle
blanche »

 Utilisation de
– « Bouts de code »
– Structures + fonctions / Classes + méthodes
– Bibliothèques 3/35
Introduction

 Utilisation de
– « Bouts de code »
– Structures + fonctions / Classes + méthodes
– Bibliothèques

 Problèmes
– Légaux
– Techniques
4/35
2. Bibliothèques et cadriciels

 « Bibliothèque [library] logicielle est un ensemble


de fonctions utilitaires, regroupées et mises à
disposition afin de pouvoir être utilisées sans avoir
à les réécrire » [Wikipedia]

 Exemples
– La bibliothèque de classes Java (!)
– La STL de C++ (!!)

5/35
Bibliothèques et cadriciels

 « Un cadriciel [framework] est un espace de


travail modulaire. C'est un ensemble de
bibliothèques, d'outils et de conventions
permettant le développement de
programmes. » [Wikipedia]

 Exemples
– La STL de C++
– JUnit
– Eclipse Equinox OSGi 6/35
Bibliothèques et cadriciels

 Types d’interconnexions
– Chainage des liens (linking)
– Duplication de processus (fork)
– Sous-classage
– Protocole de communication (IPC)
– Chargement dynamique

7/35
Bibliothèques et cadriciels

 Chainage des liens (linking)


(A contraster avec les langages avec machine virtuelle)
– Typiquement en C/C++
– Plusieurs fichiers .o, un seul fichier « .exe »

8/35
Bibliothèques et cadriciels

Duplication de
final StringBuffer commandLine = new StringBuffer();

 commandLine.append("..\\DOT\\bin\\dotty ");
commandLine.append(aFilePath);

processus (fork) final Process process =


Runtime.getRuntime().exec(commandLine.toString());

(Dans presque final OutputMonitor errorStreamMonitor =


new OutputMonitor(…, process.getErrorStream(),…);

n’importe quel langage) errorStreamMonitor.start();


final OutputMonitor inputStreamMonitor =

– Réelle duplication du new OutputMonitor(…,process.getInputStream(),…);


inputStreamMonitor.start();

processus
try {

– Appel au système pour }


process.waitFor();

la création d’un catch (final InterruptedException ie) {

nouveau processus
ie.printStackTrace(
Output.getInstance().errorOutput());
}

if (process.exitValue() != 0) {

} 9/35
Bibliothèques et cadriciels

Protocole de
public void example(String wsdlURI) throws Exception {

 TraderServicePort trader = null;


if (wsdlURI == null) {
trader = new

communication (IPC) TraderServiceImpl().getTraderServicePort();


}
else {

(Dans presque
trader = new

TraderServiceImpl(wsdlURI).getTraderServicePort();

n’importe quel langage) }

String [] stocks = {"BEAS", "MSFT", "AMZN", "HWP" };

– Utilisation d’appels à for (int i=0; i<stocks.length; i++) {


int shares = (i+1) * 100;

des procédures log("Buying "+shares+" shares of


"+stocks[i]+".");

distantes (RPC)
TradeResult result = trader.buy(stocks[i],
shares);
log("Result traded "+result.getNumberTraded()
+" shares of "+result.getStockSymbol());
– Utilisation de protocole }

bien définis : CORBA,


for (int i=0; i<stocks.length; i++) {
int shares = (i+1) * 100;
log("Selling "+shares+" shares of

COM "+stocks[i]+".");
TradeResult result = trader.sell(stocks[i],
shares);

– Engouement pour les


log("Result traded "+result.getNumberTraded()
+" shares of "+result.getStockSymbol());
}

services Web }
[http://edocs.bea.com/wls/docs70/webserv/client.html#1049007]
10/35
Bibliothèques et cadriciels

 Problèmes légaux
[Daniel M. German and Ahmed E. Hassan ;
License Integration Pattern: Dealing with
Licenses Mismatches in Component-based
Development ; ICSE, May 2009, ACM Press]
– Licences
• BSD
• GPL
• Apache
• …
11/35
Bibliothèques et cadriciels

 Problèmes légaux
– Une licence est un ensemble de droits
– Chaque droit est un ensemble de conjonctions
– Exemple
• Licence « BSD originale »
• Droit de « distribuer des produits dérivés en binaire »
• Conjonctions
– « La redistribution […] doit reproduire la note de droit
d’auteur ci-dessus […] »
– « Tous les produits publicitaires doivent inclure […] »
– « Ni le nom de l’auteur ni ceux des contributeurs […] » 12/35
Bibliothèques et cadriciels

 Problèmes légaux
– Soit un program S compose de deux
composants C1 et C2
– S, C1 et C2 ont chacune une licence
– Ces licences ne sont compatibles que si leurs
droits sont compatibles

13/35
Bibliothèques et cadriciels

 Problèmes légaux
– Exemple
• S est MPL 1.1 et C1 et C2 sont GPL 2
• GPL stipule que « Tous produits dérivés de C1 (C2)
doit être sous licence GPL 2 »
• S est MPL 1.1
• L’intégration de C1 et C2 dans S est impossible

14/35
Bibliothèques et cadriciels

 Problèmes techniques
– « Liens » à la compilation, à l’exécution
– Performance
– Maintenabilité
– Sécurité

15/35
Sous-classage

En deux mots
public class OutputMonitor extends Thread {

 …
public OutputMonitor(…) {

– Dans les langages this.setName(threadName);


this.setPriority(Thread.MAX_PRIORITY);

orientés objets, la forme …

la plus courante
}

d’utilisation de « public void run() {


try {

composant » int value = 0;


byte[] bytes;
char lastWrittenChar;
while ((value = this.inputStream.read()) > 0) {
synchronized (System.err) {
synchronized (System.out) {
if (value != 13 && value != 10) {
lastWrittenChar = (char) value;

}}
}
}
catch (final IOException ioe) { 16/35

Sous-classage

 Crochets (hooks) et gabarits (templates)


– Points chauds (hot spots) = crochets
– Points gelés (frozen spots) = gabarits

– Crochets sont des méthodes abstraites ou qui


peuvent/doivent être spécialisés par le client

– Gabarits sont des méthodes qui appellent des


crochets et qui décrivent le « quoi »
17/35
Sous-classage

 Exemple
– JUnit, un cadriciel pour
écrire et exécuter des
tests unitaires

18/35
Sous-classage
public abstract class TestCase
extends Assert implements Test {

public void runBare() throws Throwable {


setUp();

Gabarit
try {

 runTest();
}
finally {
tearDown();
}
}

protected void setUp() throws Exception {


}

 Crochets protected void tearDown() throws Exception {


}

}

19/35
Sous-classage

 Patrons de conception [Gamma et al.]


– Usine abstraite (Abstract Factory)

– Adapteur (Adapter)

– Pont (Bridge)

– Constructeur (Builder)

20/35
Sous-classage

 Patrons de conception [Gamma et al.]


– Décorateur (Decorator)

– Méthode usine (Factory Method)

– Itérateur (Iterator)

– Observateur (Observer)

21/35
Sous-classage

 Patrons de conception [Gamma et al.]


– Méthode gabarit (Template Method)

– Visiteur (Visitor)

22/35
Chargement dynamique

 En deux mots
– Dans différents langage de programmation (Lisp,
C++, Java, Smalltalk…), c’est la possibilité de
lier un « bout de code » au programme pendant
l’exécution du programme

– En Java, c’est la possibilité de lier une classe,


créer une instance de cette classe et exécuter
une de ces méthodes pendant l’exécution du
programme 23/35
Chargement dynamique

En deux mots
public final class WrapperMain {

 public static void main(String[] args) {


try {

– Exemple, classe Class toBeRun = Class.forName(args[0]);


Method mainMethod =

enveloppante toBeRun.getMethod("main", new Class[] { String[].class });

(wrapper)
final long startTime = System.currentTimeMillis();
mainMethod.invoke(null, new Object[] { new String[0] });
final long endTime = System.currentTimeMillis();
System.out.println();
System.out.println(endTime - startTime);
}
catch (final Exception e) {
e.printStackTrace(Output.getInstance().errorOutput());
}
}
}

24/35
Chargement dynamique

 En deux mots
– Introspection
• Capacité d’un programme à s’observer
– Intercession
• Capacité d’un programme à se modifier

25/35
The link ed image cannot be display ed. The file may hav e been mov ed, renamed, or deleted. Verify that the link points to the correct file and location.

Chargement dynamique

 Meta-classes
– La classe « Class » est la classe Aristote (Ἀριστοτέλης)
*-384 †-322

dont les instances sont des classes


– La classe « Class » est en fait un méta-classe

– Une méta-classes est une classe qui décrit les


classes, comme une classe décrit des instances

26/35
The link ed image cannot be display ed. The file may hav e been mov ed, renamed, or deleted. Verify that the link points to the correct file and location.

Chargement dynamique

 Meta-classes
– Une méta-méta-classes est une classe qui…
– Une méta-méta-méta-classes est une classe qui…

[http://www.developper.com] 27/35
The link ed image cannot be display ed. The file may hav e been mov ed, renamed, or deleted. Verify that the link points to the correct file and location.

Chargement dynamique

 Meta-classes
– Java permet l’introspection
– Class mandataire (Proxy) pour approximer
l’intercession : interception des appels de
méthodes
InvocationHandler handler = new MyInvocationHandler(...);
Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), new Class[] { Foo.class });
Foo proxy = (Foo) proxyClass.getConstructor(new Class[] { InvocationHandler.class }).newInstance(new Object[] { handler });

Assert.assertTrue(proxy instanceof Foo);


try {
Foo f = (Foo) proxy;

}
catch (final ClassCastException e) {

}

[http://www.webreference.com/internet/reflection/2.html] 28/35
The link ed image cannot be display ed. The file may hav e been mov ed, renamed, or deleted. Verify that the link points to the correct file and location.

Chargement dynamique

 Meta-classes
– Class gestionnaire d’appels (InvocationHandler)

[http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/InvocationHandler.html] 29/35
The link ed image cannot be display ed. The file may hav e been mov ed, renamed, or deleted. Verify that the link points to the correct file and location.

Chargement dynamique

 Meta-classes
– Smalltalk 80 permet l’intercession
• Tout est objet
• Deux types d’objets : ceux qui peuvent avoir des
instances et ce qui ne peuvent pas
• Chaque classes a sa propre méta-classe
• Les méta-classes sont toutes instances de la classe
« Metaclass »
• Les méta-classes sont des sous-classes de « Class »

30/35
The link ed image cannot be display ed. The file may hav e been mov ed, renamed, or deleted. Verify that the link points to the correct file and location.

Chargement dynamique

 Meta-classes static
– Smalltalk 80 permet l’intercession
• Pas de méthodes « statiques »
• Les méthodes de classes sont définies dans la méta-
classe (comme les méthodes d’instance sont définies
dans la classe)
• Idem pour les variables d’instance de classe

• Les variables de classes sont des variables


d’instances pour les classes (!)
DILBER: ©1989 United Feature Syndicate, Inc. 31/35
The link ed image cannot be display ed. The file may hav e been mov ed, renamed, or deleted. Verify that the link points to the correct file and location.

Chargement dynamique
public class AClass { Object subclass: #ReferenceCountingClass
instanceVariableNames: ‘’
private static int ReferenceCount = 0; classVariableNames: ‘ReferenceCount’
poolDictionaries: ‘’
public AClass() {
AClass.ReferenceCount++; ReferenceCountingClass class>>new
} ReferenceCount := ReferenceCount + 1.
^self basicNew initialize
public static int getReferenceCount() {
return AClass.ReferenceCount;
}
}

 Compter le nombre d’instances créées en


Java et en Smalltalk

32/35
Chargement dynamique

 Protocoles de méta-
objets (MOP)
– Règles pour changer
Sémantique du langage
– « Interpréteur »

33/35
Chargement
dynamique
MOP à la compilation
public class Hello instantiates VerboseClass {

 public static void main( String[] args ) {


hello();
}

– OpenJava static void hello() {

}
System.out.println( "Hello, world." );

import openjava.mop.*;
import openjava.ptree.*;

public class VerboseClass instantiates Metaclass extends OJClass {


public void translateDefinition() throws MOPException {
OJMethod[] methods = getDeclaredMethods();
for (int i = 0; i < methods.length; ++i) {
Statement printer = makeStatement(
"System.out.println( \"" + methods[i] +
" is called.\" );"
);
methods[i].getBody().insertElementAt( printer, 0 );
}
}
}

Michiaki Tatsubori ; An Extension Mechanism for the Java Language ; Master of Engineering Dissertation, 34/35
Graduate School of Engineering, University of Tsukuba, February 1999
Chargement dynamique

 MOP au chargement des classes


– Javassist
 MOP à l’exécution
– MetaXa (MetaJava)

 Programmation orientée aspects


35/35

Vous aimerez peut-être aussi