Généricité - wiki.univ-cotedazur.fr

33
Généricité Philippe Collet Master 1 IFI 2016-2017 P. Collet 1

Transcript of Généricité - wiki.univ-cotedazur.fr

Page 1: Généricité - wiki.univ-cotedazur.fr

Généricité

PhilippeCollet

Master1IFI

2016-2017

P. Collet 1

Page 2: Généricité - wiki.univ-cotedazur.fr

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

Page 3: Généricité - wiki.univ-cotedazur.fr

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

Page 4: Généricité - wiki.univ-cotedazur.fr

•  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)

Page 5: Généricité - wiki.univ-cotedazur.fr

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

Page 6: Généricité - wiki.univ-cotedazur.fr

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

Page 7: Généricité - wiki.univ-cotedazur.fr

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

Page 8: Généricité - wiki.univ-cotedazur.fr

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

Page 9: Généricité - wiki.univ-cotedazur.fr

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

Page 10: Généricité - wiki.univ-cotedazur.fr

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

Page 11: Généricité - wiki.univ-cotedazur.fr

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

Page 12: Généricité - wiki.univ-cotedazur.fr

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

Page 13: Généricité - wiki.univ-cotedazur.fr

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

Page 14: Généricité - wiki.univ-cotedazur.fr

GénéricitédynamiqueOO

•  Unobjetatoujoursunpointeursursaclassepourlelookupdesméthodes

•  Unobjetestdoncporteurd’informa;onssursespropriétés(refléxivité)etsurcellesdesesco-instances

•  Toutobjetestdoncprototypedesontype

P. Collet 14

Page 15: Généricité - wiki.univ-cotedazur.fr

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

Page 16: Généricité - wiki.univ-cotedazur.fr

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

Page 17: Généricité - wiki.univ-cotedazur.fr

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

Page 18: Généricité - wiki.univ-cotedazur.fr

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> { … }

Page 19: Généricité - wiki.univ-cotedazur.fr

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));

Page 20: Généricité - wiki.univ-cotedazur.fr

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

Page 21: Généricité - wiki.univ-cotedazur.fr

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

Page 22: Généricité - wiki.univ-cotedazur.fr

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

Page 23: Généricité - wiki.univ-cotedazur.fr

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

Page 24: Généricité - wiki.univ-cotedazur.fr

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

Page 25: Généricité - wiki.univ-cotedazur.fr

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

Page 26: Généricité - wiki.univ-cotedazur.fr

Guidedesurvie:principePECS

•  PECS:Producerextends,Consumersuper– U;liserFoo<?extendsT>pourunproducerdeT– U;liserFoo<?superT>pourunconsumerdeT– Seulementapplicableauxparamètresdesméthodes

– Pasdejokerdanslestypesderetour

P. Collet 26

Page 27: Généricité - wiki.univ-cotedazur.fr

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

Page 28: Généricité - wiki.univ-cotedazur.fr

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

Page 29: Généricité - wiki.univ-cotedazur.fr

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

Page 30: Généricité - wiki.univ-cotedazur.fr

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

Page 31: Généricité - wiki.univ-cotedazur.fr

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

Page 32: Généricité - wiki.univ-cotedazur.fr

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

Page 33: Généricité - wiki.univ-cotedazur.fr

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