Upload
others
View
10
Download
0
Embed Size (px)
Citation preview
Généricité
PhilippeCollet
Master1IFI
2016-2017
P. Collet 1
Plan
• Introduc;on• Principesdeparamétrage• Principesdegénéricité• Généricitédansleslangages(àobjets)• Généricitéssta;queetdynamique• GénéricitéenJava5
P. Collet 2
Probléma;quedel’évolu;onlogicielle
• Maîtriserl’évolu;onestl’undesdéfismajeursdugénielogiciel:coûtsdemaintenance,dégrada1ondesqualités,oublis,bogues…
• Maîtriserl’évolu3on,c’est:– introduirelesmodifica1onsqu’ilfaut– rienquecellesqu’ilfaut– partoutoùilfaut– sansaltérerlesqualitésini1ales– etaumoindrecoût…
F Problèmedifficilesurtoutsilelogicielestvolumineuxetcomplexe
P. Collet 3
• Beaucoupdetechniqueslogiciellesvisentàfaciliterlages;ondel’évolu;on:– Éviterladuplica;on(unicitédanslesdéfini;ons)– Masquercequin’estpasu;le(encapsula;on)– Localiseretexpliciterlesdépendances…
• Deuxfamillesdetechniquespourlages;ondel’évolu;on:– Lestechniquesprévisionnellesan1ciperlesévolu1onspossibles,pourlesrendreplusfacilesetplus
sûres
– Lestechniquesadapta3veseffectuerleschangementsdemanière«paresseuse»,aucoupparcoup,
maisdelamanièrelaplusautoma1quepossible
P. Collet 4
Problématique de l’évolution logicielle (2)
Prévisionnelvs.adapta;f• Chaquetechniqueemprunteunepe;tepartdescaractéris;quesdel’autre:– ilyaunpeudeprévisionneldansl’héritage– etunpeud’adapta;fdanslagénéricité!
• Lesdeuxtechniquessecomplètentetpeuventsecombiner:– héritagegénériqueetgénéricitécontrainte
P. Collet 5
Principesdeparamétrage• Définirunparamètreformeld’en;té,abstraitetgénéral,qui
exhibejustecequiestnécessaireetsuffisantpourêtreu;lisé(demanièreformelle)
• Subs;tuerdemanièreautoma;quedesparamètreseffec3fsauparamètreformel,sansrienchangerauxu3lisa3onsduparamètreformel,quidoiventrestervalides
• Sipossible,perme[redesvérifica;ons…
P. Collet 6
Paramétragesurdesvaleurs
• Unevaleurestunconceptsimple:valeurettype• Leparamètreformelesttypéetcachesavaleur• Onpeutl’u;liseretvérifierletypage• Onsubs;tueautoma;quementlavaleureffec;veàtouteslesoccurrences:– simplesubs;tu;onoumacrogénérateur,cpp,sed…
P. Collet 7
Paramétragesurdesvaleurs(2)• Laréactualisa;ondesusagesestfaiteparsimple
subs;tu;on:onpeutfaireduparamétragesurdesvaleurs(den’importequeltype)dansn’importequeldocument
• Mêmesilelangageu;liséneprévoitpasdeparamétrage,avecunmacrogénérateur(m4,cpp,sed…)
• L’intensitédescontrôlesdépenddesconnaissancesdisponibles:– Rien:macrogénérateurs– Typageclassique:vérifica;onssta;quespendantlacompila;on,voire
lareliureoul’exécu;on(typagedynamique)– Asser;ons,spécifica;onsformelles:vérifica;onsdynamiques,
preuves…
P. Collet 8
Principesdegénéricité• Beaucoupdechosessontgénériques:médicaments…
• Enprogramma;on,lagénéricitésignifieunparamétragesub1lsurdestypes
• Quandonparamètresurdesaspectsencoreplussub;ls(structures,métamodèles,etc…)onparled’hypergénéricité
• Objec3fs:avoirdesunitésdecodeparamétréessurdestypes– Factorisa;ondecode– Généra;onautoma;qued’unitésspécialisées– Meilleurelisibilité– Typagesansconcession,sta;queoudynamique
P. Collet 9
Généricitédansleslangages• Langagespionniersimpéra;fs:CLU,LPG,Euclide,Ada
• Langagesàobjets:Eiffel,puisC++,puisJava
• Lagénéricitédansleslangagesestessen;ellementuneap;tudeautypage
• D’oùunerecherchedecompromisentre– flexibilitédesdériva;ons– sûretédescontrôles– coûtàl’exécu;on,àlacompila;on– simplicité,lisibilité
P. Collet 10
Langagesobjetsgénériques(1)• Eiffel(pionnier)
– Héritagemul;plecomplexe– Typesprimi;fsparobjetsexpansés=>pasdelimita1onpourlagénéricité– Pasdetracedegénéricitéaurun1me:unesimpletechniquedetypagesta1que– Généricitétrèslisibleetsimple– Généricitécontrainteparclassesabstraites– Contraintesautoma;queparlikeobjet/likecurrent– Pasd’introspec;ondestypeseffec;fs
P. Collet 11
Langagesobjetsgénériques(2)
• C++– Macro-généra;onàlacompila;onouédi;ondeliens– Contrôlesréalisésàl’édi;ondeliens=>diagnos;cssibyllins
– Complexitédescalculsmasquée,effectuéeàl’instancia;on,surcharge
– Pasdegénéricitécontrainte(généricitéimplicitesurlessignatures)
– Pasd’introspec;ondestypeseffec;fs(pasdepossibilitégaran;ed’introspec;on)
P. Collet 12
Langagesobjetsgénériques(3)
• C#– Instancia;ondestypesgénériquesaurun1me– Généricitécontrainteparclasseetinterface– Contrôledetypeparlecompila;onetintrospec;onpossible
• Java– généricitétardive(10ansaprès)– trèssophis;quée,maiscomplexe
– incohérenceetmanquedeperformancepardescontraintesdecompa;bilité(cast,compa;bilitéavecanciennesclassesnongénériques…)
– problèmedestypesprimi;fsetdestableaux
P. Collet 13
GénéricitédynamiqueOO
• Unobjetatoujoursunpointeursursaclassepourlelookupdesméthodes
• Unobjetestdoncporteurd’informa;onssursespropriétés(refléxivité)etsurcellesdesesco-instances
• Toutobjetestdoncprototypedesontype
P. Collet 14
Principesdelagénéricitédynamique
• Ils’agitenfaitd’unetechniqueprochedupatrondeconcep;on«prototype»
• Leparamètreformelestunevariabled’untypeTa[achéeàunobjet,sous-typedeT
• Onpeutu;lisertouteslespropriétésdeTdanslemodèle• Lasubs;tu;onestdynamique,parsimpleaffecta;on
polymorphe• Contrôlespossibles:parréflexivitédynamique,trèssouples,
maiscoûteux…
P. Collet 15
Exemple:vecteurpolymorphe• Addi;ondedeuxvecteurspolymorphes• V1+• V2=• V3
• Intérêt:– Obtenirplusdesouplessequ’avecuntypagesta;que(oùtousleséléments
sontdumêmetype)– Sansconcessionsurlarigueurdutypage– Touteneffectuantdescontrôlesdynamiques
P. Collet 16
5.147
Baba
5
10
15
3.14
2.007 Ali
Ali Baba
true
false
true
Solu;on1:pasdevérifica;onsta;que
• TouslesélémentssontdetypeObject
• Onvérifieparintrospec;onquedeuxélémentsdemêmeindicesontcompa;blespourl’addi;on
• Onu;liselaméthode«+»dupremierélémentpourajouterlesecond
• C’estpossibledanstoutlangageobjetintrospec;f
P. Collet 17
Solu;on2:vérifica;onsmixtessta;quesetdynamiques
• Onajouteàlasolu;onprécédenteuntypagesta;quenécessaireetsuffisant:touslesélémentssontdetypeMonoïde
P. Collet 18
class PolymorphicVector <Monoid> extends ArrayList<Monoid> { … }
Solu;on2:vérifica;onsmixtessta;quesetdynamiques(2)
• Onpeutcontraindresta;quement:
P. Collet 19
PolymorphicVector <Number>
n On peut contraindre dynamiquement :
class DynamicMonoVector extends ArrayList<Monoid> implements Monoid { Monoid prototype ; // fournit le + Void DynamicMonoVector(Monoid type){ super(); prototype = type; } // Utilisation DynamicMonoVector pvi = new DynamicMonoVector(new Integer(0));
Autrespossibilités
• Encombinantlesapprochessta;quesetdynamiques,ondisposed’ungrandnombredepossibilitéspourchoisir:– ledegrédepolymorphisme:tousdumêmetype,mêmesurtype,mêmetypedeuxàdeux…
– quandondéfinitlacontrainte:àlacompila;onouàl’exécu;on.
P. Collet 20
GénéricitéenJava5LaclasseCollec;on: Public interface Collection<E> extends Iterable<E> { … int size(); boolean isEmpty(); boolean contains(Object o); Iterator<E> iterator(); boolean add(E o); boolean remove(Object o); boolean containsAll(Collection<?> c); boolean addAll(Collection<? extends E> c); boolean removeAll(Collection<?> c); boolean retainAll(Collection<?> c); void clear(); boolean equals(Object o); int hashCode(); }
P. Collet 21
Java5:paramétragegénérique• Déclara;ond’unparamètreformelquiserau;lisédanstoute
laclasse.– U;liserlanota;on<T>justeaprèslenomdelaclasse– U;liserTdansleresteducode– Conven;on:u;liserunele[remajusculecommeiden;fiantdu
paramètre– Tseraremplacéparlaclassedonnéeenparamètreàl’instancia;on
• Onpeutalorslimiterlagénéricitéàuneméthodepar;culière:– U;liserlanota;on<T>justeavantlasignaturedelaméthode– U;liserTdansleresteducodedelaméthode– Tserainféréàpar;rdutypedesargumentsdelaméthode
P. Collet 22
Formesdesdéclara;onsgénériques
• Invariance=Covariance∩ Contravariance:seulelaclasseestacceptée – <A>➨uneclasseA
• Bivariance=Covariance∪ Contravariance:touteslesclassessontacceptées– <?>joker/unknown➨n’importequelleclasse
• Covariance(touteslessous-classessontacceptables)– <AextendsB>touteclasseAquispécialiseB(extends,implements)– <?extendsB>touteclassequispécialiseB(extends,implements)
• Contravariance(touteslessuper-classessontacceptables)– <?superB>touteclassequigénéraliseB
P. Collet 23
Illustra;ons// Invariance List <Integer> l = new ArrayList <Integer>(); // cas ci-dessous refusé : invariance par défaut // List <Number> l1 = l; // possible : covariance List <? extends Number> l1 = l; // bivariance : perte du type List <?> l2 = new ArrayList <Object>(); // contravariance List <? super Number> l3 = new ArrayList <Object>(); for (Number n : l1) { // Erreur : l2 pourrait être une liste de
Double ! // l2.add(n); l3.add(n); // OK
}
P. Collet 24
Illustra;ons(2)// Covariance et contravariance public static <T> void copy(Collection <? extends T> src, Collection <? super T> dest) { for(T t : src) { dest.add(t); }
} List <Integer> l1 = new ArrayList <Integer>(); for(int i=0; i<10; i++) { l1.add(i); }
List <Number> l2 = new ArrayList <Number>(); copy(l1,l2); copy (l2,l1); // Erreur à la compilation // on ne peut pas mettre des Number dans une liste de
Integer
P. Collet 25
Guidedesurvie:principePECS
• PECS:Producerextends,Consumersuper– U;liserFoo<?extendsT>pourunproducerdeT– U;liserFoo<?superT>pourunconsumerdeT– Seulementapplicableauxparamètresdesméthodes
– Pasdejokerdanslestypesderetour
P. Collet 26
PECS:applica;onpublic static <T> void copy(Collection<T> src, Collection<T> dest)
• Danscopy:– srcfournitdesélémentsdetypeT– destconsommedesélémentsdetypeT
public static <T> void copy( Collection <? extends T> src, Collection <? super T> dest)
P. Collet 27
PECS:applica;on(2)public static <E> Set<E> union(Set<E> s1, Set<E> s2)
• Dansunion:– s1ets2sontdesproducersd’élémentsE!
public static <E> Set<E> union(Set<? extends E> s1,
Set<? extends E> s2)
P. Collet 28
Effacementdestypes• LebytecodecomprisparlaJVM5necon;enttoujourspasdetracedegénéricité– Contraintedecompa;bilitéascendante
• LecompilateurJava5:– RemplacelesparamètresparObject(casd’invarianceoudebivariance)oupasletypebornespécifié(co/contra-variance)
– Créedesméthodesàsignature«compa;ble»pouraccepterlesautrescas
– Leproblèmedestypesderetourestrésoluparlacovariance
P. Collet 29
NouveautésJava8:interfacesfonc;onnellesetgénéricité
@Func;onalInterfacepublicinterfaceCreator<T>{Tcreate(StringfirstName,StringlastName);
}
• passertouteméthodedontlasignaturerépondraauxcontraintessuivantes:– deuxparamètresdetypeString– typederetourgénérique
• Javasechargeraeninternedeconver;rl’appeldesortequel’onauratoujoursl’impressiond’appelerlaméthode“create”del’interfaceCreator…
P. Collet 30
Exemples:constructeuretlambdapublicclassName{
privateStringfirstName;privateStringlastName;publicName(StringfirstName,StringlastName){…}
…}publicclassClientCode{
publicTdoSomething(Stringname,Creatorcreator){…creator.create(someName,someOtherName)…}
clientcode.doSomething("DarthVader",Name::new);clientcode.doSomething("DarthVader",(s1,s2)->newName(s1,s2)); P. Collet 31
Java8:packagejava.u;l.func;on• Interfacesavectypegénérique:
– Consumer<T>:opéra;onquiaccepteununiqueargument(typeT)etneretournepasderésultat.
• voidaccept(T);
– Func;on<T,R>:opéra;onquiaccepteunargument(typeT)etretourneunrésultat(typeR).
• Rapply(T);
– Predicate:spécialisa;ondeFunc;onquirendvraisiletestestvrai• booleantest(T);
– Supplier<T>:opéra;onquineprendpasd’argumentetquiretourneunrésultat(typeT).
• Tget();
• Pleind’autresinterfacesfonc;onnellesavecdestypesdebase:IntConsumer,LongToIntFunc;on…
P. Collet 32
Conclusions• Lagénéricitépermetlafactorisa;onetlaréu;lisa;onde
savoirsetsavoirsfairedequalitégaran;e.• Peut-ontoutrendregénérique?Non!• Laréu;lisa;ond’architecturestypespourrésoudreun
problèmetypenepeutpas,leplussouvent,êtredécriteparuneunitégénérique
• Solu;ons:– Patronsdeconcep;on– Infrastructuresspécialisées(Frameworks)– Langagesmé;ers:PAO,CAO,EAO…– Systèmesdédiés:BDs,IDEs…– Lignesdeproduitslogiciels(op;onausecondsemestre…)
P. Collet 33