LOG4430 : Architecture logicielle et conception avancée Yann-Gaël Guéhéneuc © G
LOG4430 : Architecture logicielle et conception avancée Yann-Gaël Guéhéneuc © Guéhéneuc, 2012 Département de génie informatique et de génie logiciel École Polytechnique de Montréal Cours 3 – Bibliothèques et chargement dynamique de composants Plan 1. Introduction 2. Bibliothèques et cadriciels • Types d’interconnexions • Problèmes légaux 2/35 • 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) • 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 » 3/35 blanche » Utilisation de – « Bouts de code » – Structures + fonctions / Classes + méthodes – Bibliothèques Introduction Utilisation de – « Bouts de code » – Structures + fonctions / Classes + méthodes 4/35 – Bibliothèques Problèmes – Légaux – Techniques 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] 5/35 à les réécrire » [Wikipedia] Exemples – La bibliothèque de classes Java (!) – La STL de C++ (!!) 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 6/35 permettant le développement de programmes. » [Wikipedia] Exemples – La STL de C++ – JUnit – Eclipse Equinox OSGi Bibliothèques et cadriciels Types d’interconnexions – Chainage des liens (linking) – Duplication de processus (fork) – Sous-classage 7/35 – Sous-classage – Protocole de communication (IPC) – Chargement dynamique 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 – Plusieurs fichiers .o, un seul fichier « .exe » Bibliothèques et cadriciels Duplication de processus (fork) (Dans presque n’importe quel langage) final StringBuffer commandLine = new StringBuffer(); commandLine.append("..\\DOT\\bin\\dotty "); commandLine.append(aFilePath); final Process process = Runtime.getRuntime().exec(commandLine.toString()); final OutputMonitor errorStreamMonitor = new OutputMonitor(…, process.getErrorStream(),…); errorStreamMonitor.start(); 9/35 n’importe quel langage) – Réelle duplication du processus – Appel au système pour la création d’un nouveau processus errorStreamMonitor.start(); final OutputMonitor inputStreamMonitor = new OutputMonitor(…,process.getInputStream(),…); inputStreamMonitor.start(); try { process.waitFor(); } catch (final InterruptedException ie) { ie.printStackTrace( Output.getInstance().errorOutput()); } if (process.exitValue() != 0) { … } Bibliothèques et cadriciels Protocole de communication (IPC) (Dans presque n’importe quel langage) public void example(String wsdlURI) throws Exception { TraderServicePort trader = null; if (wsdlURI == null) { trader = new TraderServiceImpl().getTraderServicePort(); } else { trader = new TraderServiceImpl(wsdlURI).getTraderServicePort(); } 10/35 n’importe quel langage) – Utilisation d’appels à des procédures distantes (RPC) – Utilisation de protocole bien définis : CORBA, COM – Engouement pour les services Web [http://edocs.bea.com/wls/docs70/webserv/client.html#1049007] String [] stocks = {"BEAS", "MSFT", "AMZN", "HWP" }; for (int i=0; i<stocks.length; i++) { int shares = (i+1) * 100; log("Buying "+shares+" shares of "+stocks[i]+"."); TradeResult result = trader.buy(stocks[i], shares); log("Result traded "+result.getNumberTraded() +" shares of "+result.getStockSymbol()); } for (int i=0; i<stocks.length; i++) { int shares = (i+1) * 100; log("Selling "+shares+" shares of "+stocks[i]+"."); TradeResult result = trader.sell(stocks[i], shares); log("Result traded "+result.getNumberTraded() +" shares of "+result.getStockSymbol()); } } 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 11/35 Licenses Mismatches in Component-based Development ; ICSE, May 2009, ACM Press] – Licences • BSD • GPL • Apache • … Bibliothèques et cadriciels Problèmes légaux – Une licence est un ensemble de droits – Chaque droit est un ensemble de conjonctions 12/35 – 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 […] » Bibliothèques et cadriciels Problèmes légaux – Soit un program S compose de deux composants C1 et C2 – S, C et C ont chacune une licence 13/35 – S, C1 et C2 ont chacune une licence – Ces licences ne sont compatibles que si leurs droits sont compatibles 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 C (C ) 14/35 • 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 Bibliothèques et cadriciels Problèmes techniques – « Liens » à la compilation, à l’exécution – Performance 15/35 – Maintenabilité – Sécurité Sous-classage En deux mots – Dans les langages orientés objets, la forme la plus courante public class OutputMonitor extends Thread { … public OutputMonitor(…) { this.setName(threadName); this.setPriority(Thread.MAX_PRIORITY); … } 16/35 la plus courante d’utilisation de « composant » public void run() { try { 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) { … Sous-classage Crochets (hooks) et gabarits (templates) – Points chauds (hot spots) = crochets – Points gelés (frozen spots) = gabarits 17/35 – 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 » Sous-classage Exemple – JUnit, un cadriciel pour écrire et exécuter des tests unitaires 18/35 tests unitaires Sous-classage Gabarit public abstract class TestCase extends Assert implements Test { public void runBare() throws Throwable { setUp(); try { runTest(); } 19/35 Crochets } finally { tearDown(); } } protected void setUp() throws Exception { } protected void tearDown() throws Exception { } … } Sous-classage Patrons de conception [Gamma et al.] – Usine abstraite (Abstract Factory) – Adapteur (Adapter) 20/35 – Adapteur (Adapter) – Pont (Bridge) – Constructeur (Builder) Sous-classage Patrons de conception [Gamma et al.] – Décorateur (Decorator) – Méthode usine (Factory Method) 21/35 – Méthode usine (Factory Method) – Itérateur (Iterator) – Observateur (Observer) Sous-classage Patrons de conception [Gamma et al.] – Méthode gabarit (Template Method) – Visiteur (Visitor) 22/35 – Visiteur (Visitor) 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 23/35 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 Chargement dynamique En deux mots – Exemple, classe enveloppante (wrapper) public final class WrapperMain { public static void main(String[] args) { try { Class toBeRun = Class.forName(args[0]); Method mainMethod = toBeRun.getMethod("main", new Class[] { String[].class }); final long startTime = System.currentTimeMillis(); mainMethod.invoke(null, new Object[] { new String[0] }); 24/35 (wrapper) 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()); } } } Chargement dynamique En deux mots – Introspection • Capacité d’un programme à s’observer – Intercession 25/35 – Intercession • Capacité d’un programme à se modifier The linked image cannot be displayed. The file may have been moved, renamed, or deleted. Verify that the link points to the correct file and location. Chargement dynamique Meta-classes – La classe « Class » est la classe dont les instances sont des classes – La classe « Class » est en fait un méta-classe Aristote (Ἀριστοτέλης) *-384 †-322 26/35 – 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 The linked image cannot be displayed. The file may have been moved, 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… 27/35 [http://www.developper.com] The linked image cannot be displayed. The file may have been moved, 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 28/35 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] The linked image uploads/Ingenierie_Lourd/ cours-3-bibliotheques-et-chargement-dynamique.pdf
Documents similaires
-
70
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Jul 01, 2022
- Catégorie Heavy Engineering/...
- Langue French
- Taille du fichier 0.3948MB