127
OOP & JAVA S2101B IUT INFO Amiens 2018 Samy Delahaye

OOP & JAVA S2101B - delahayeyourself.info · dino1.roar(); dino2.roar(); 60. Démonstration & TDD 61. TDD ? Repose sur un des principes Test First d'une methode de développement

Embed Size (px)

Citation preview

OOP & JAVA

S2101BIUT INFO Amiens 2018

Samy Delahaye

If Java had true garbage collection, mostprograms would delete themselves uponexecution.

-- Robert Sewell

““

AperçuIntroduction

OOP

Maven

IO

Design Pattern

Swing

JDBC

Pour aller plus loin..

3

Salutations

4

$ whois

Samy Delahaye

delahayeyourself.info

[email protected]

Initiation au monde Java sur un module de 24h“ “

5

Introduction

6

Sun MicroSystems

1982: Création de Sun

1987: Standardisation d'UNIX System V

1995: Technologie Java

1999 - 2008: StarOf�ce, Solaris, VirtualBox,MySQL et bien plus ..

2009: Rachat par oracle

7

Les origines

1990, Utilisation du C++ au sein de Sun

Patrick Naughton envisage une migration versNeXT

Démarrage du projet "Stealth"

Green Project avec l'arrivée de James Gosling etde Mike Sheridan

8

Les origines

Abandon du C++ chez Sun

Compléxité est une source d'erreur

Absence de ramasse-miettes

"Lacunes" du langage (en réalité lacunes des devs)notamment sur des notions de sécurité, de laprogrammation distribuée et du multi-threading

9

Les origines

James Gosling

Envisage de modi�er et d'améliorer C++ etl'appeller C++ ++ - ceci n'est pas une blague

Bill Joy

Envisage de développer un nouveau langagecombinant le meilleur de Mesa et du C, Further“Plus loin”

10

Les origines

Oak (chêne)

en référence selon la légende à un arbre devant lafenêtre de leur bureau

1992 Démonstration de l'OS Green, du langageOak

1994 Nom Oak déjà utilisé par un fabricant decarte vidéo le langage fut renommé Java

11

Les origines

Origine du nom Java

James Gosling, Arthur Van Hoff et AndyBechtolsheim

Just Another Vague Acronym (littéralement “justeun acronyme vague de plus”)

Inventé dans un bar (évidemment) par quelquesmembres de l'équipe, on ne sait pas si il s'agitd'un acronyme:

12

Les origines

Avênement de Java 2

2000 Java 2 Standard Edition (J2SE) devenue JavaSE & Java 2 Enterprise Edition (J2EE) devenueJava EE

200x Améliorations de la JVM, SWING apparaîtcomme une alternative à .NET

2006-2007 Passage en open source du JDK (JREet les outils de dév), du compilateur javac et desenvironnements Java EE

13

Les origines

Avênement de Java 2

2007 – 2008 Android par Google

2009 Rachat de Sun par Oracle

14

Les origines

Philosophie

Simple, orienté objet et familier

Robuste et sûr

Indépendant de la machine employée pourl'éxécution

Performant

Compilé, multi-tâches et dynamique

15

Les origines

Un ramasse-miettes ?

Ou Garbage Collector est appelé régulièrement etautomatiquement pendant l'éxécution duprogramme

Plus la tâches du dev de gérer la mémoire(libération ..) en d'autres termes plus besoind'utiliser de free() !

Possible de lui “suggérer” de se lancer via laméthode System.gc()

16

Les origines

Indépedant vis-à-vis de laplateforme

Un programme Java fonctionne de manièreparfaitement similaire sur différentesarchitectures matérielles

La licence de Sun pour Java insiste ainsi sur le faitque toutes les implémentations doivent êtrecompatibles

17

Les origines

Indépedant vis-à-vis de laplateforme

Des bibliothèques standard fournies par certainséléments de la machine hôte (graphisme,threading, réseau ..) exactement de la mêmemanière sur toutes les architectures. Descompilateurs Java qui compilent le code source“àmoitié” a�n d'obtenir un bytecode Java(langage de type assembleur proche de lamachine et spéci�que à la plateforme Java)

18

Les origines

Spéci�cations

Java SE: Standard Edition

Java EE: Entreprise Edition

Java ME: Micro Edition

19

Les origines

Cycle de vie

Écriture du �chier code source .java Compilation en .class Interprétation du class par la JVM

20

Quelques bases

21

Programming today is a race between softwareengineers striving to build bigger and betteridiot-proof programs, and the Universe trying toproduce bigger and better idiots. So far, theUniverse is winning.― Rick Cook, The Wizardry Compiled

““

22

HelloWorld Tellement original

public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World !") ; }}

(À l'époque des dinosaures)

$ javac HelloWorld.java$ export CLASSPATH = .$ java HelloWorld

23

Démonstration

24

Great Success

25

Le langage Java

Depuis le début on parle de Java

Java est le nom d'une marque

On parle de technologie Java

Environnements,

Frameworks,

Standards,

Implémentation,

Et Langage

26

Le langage Java

Orienté objet

Familier (hérité du langage C)

Béné�cie d'un ramasse miette

Multi processus

Portable

.java: �chier source java

Java est case-sensitive

27

Analyse

package helloworld;

public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World !"); }}

28

package ?C'est une façon d'organiser notre logiciel

Semblables au répertoires

package helloworld;

L'instruction package doit toujours être déclareren début de �chier source

Chaque package porte un nom, ce nom est soit unsimple identi�cateur ou une suite d'identi�cateursséparés par des points.

Importer une classe en dehors du package via: import paquet.subpaquet 29

A l'intérieur du package

public class HelloWorld

Mot clé class utilisé pour dé�nir une classe enJava

Java est un langage fortement typés

JavaStyle: lowerCamelCase

30

A l'intérieur du package

public static void main(String[] args)

Point d'entrée de notre programme

public : pas de limite d'accessibilité

static : une méthode de classe et nond'instance

void : mot clé pour informer que la méthode neretourne aucune valeur

String[] args : Arguments passer en ligne decommande

31

A l'intérieur de la méthode

System.out.println("Hello World !");

32

Types de base et variableSystem.out.println("Hello World !");

Utilisons une variable

String name = "Luke Skywalker"; // use your name hereSystem.out.println(String.format("Hello %s", name));

33

Stringsstring string1; // current value is nullstring1 = "Hello";string string2 = "Hello";

Variablesint v_count = 0;boolean v_Flag = true;char v_Char = 'S';

34

Les collections de taille �xeint[] v_ArrInt = new int[10];int v_ArrInt = new int[10];int v_ArrInt[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}v_arrInt.lenght;v_ArrInt[4] = 2;

Comportements

Les index vont de 0 à taille – 1

Un tableau ne peut être redimensionné

Chaque élément du tableau prend sa valeur pardéfaut

35

Les collections de taillevariable

ArrayList v_List = new ArrayList();v_List.add(12);v_List.get(v_Index);v_List.size();v_List.remove(v_Index);

La classe Abstraite AbstractList est fournie pourimplémenter les collections de taille variable

36

Les boucleswhile (true) { //*ceci est ignoble System.out.println("PWNED");}

for (int i =0: I < 42; i++) { System.out.println(i);}

for (int v_Int : v_ListInt) { } //Iterator !

37

Les conditionsif (v_Flag){ //do something}else if(!v_Flag){ //do something}else{ /* impossible, why ? */ //do something}

switch(v_Int){ case 1: //do something break; default: //do something break;} 38

Les exceptionstry{ //do something}catch(Exception v_Exception){ /* multiple catch */ //do something}finally{ //do something}

39

Les Objets

Développons avec Class

40

Requirements

comprendre parfaitement les mots clés les pluscourants (conditions, tests, pass, etc);

comprendre parfaitement les fonctions;

comprendre la notion de référence;

41

Introduction

Existe des tas de manières de programmer:

Des styles

Des formes que l'on donne au code

Programmation procédurale, fonctionnelle,orientée �ux, par contrat, etc.

42

Introduction

Programmation orientée objet ou POO (OOP):

Un point de vue

un outil

un paradigme

Utilisé en Java, C#, Ruby, Python, ..

43

Introduction

La programmation orienté objet, c’est un style deprogrammation qui permet de regrouper aumême endroit le comportement (les fonctions) etles données (les structures) qui sont faites pouraller ensemble.

44

C’est tout. C’est une simplequestion d’organisation du

programme.

45

Qu'est ce qu'un objet ?

46

Un objet est un... truc. Un machin. Un bidule.Samy Delahaye - 2017

““

47

Qu'est-ce qu'un objet ?Dé�nition �oue

Un object peut être n'importe quoi que vousdécidiez de coder

Ce truc possède telle donnée, et fait telle choseavec

En Java quasiment tout est un objet:

chaîne, liste, fonction, etc ..

48

Créer des objetsDécrire à quoi ressemble votre object

public class Dinosaur{}

Fabriquer un object à partir de cette description

Dinosaur monDinosaure = new Dinosaur();System.out.println(monDinosaure);System.out.println(monDinosaure.toString());

49

MéthodesUn nom pour dire “cette fonction est dans uneclasse”.

public class Dinosaur { public void roar(){ System.out.println("Grr"); }}//monDinosaure.Roar();

50

Méthodes et signaturesGrâce au signature on peut adapter le comportementde nos méthodes

public class Dinosaur{

public void roar(){ System.out.println("Grr"); }

public void roar(String sound){ System.out.println(sound); }}

51

Méthodes et signaturesmonDinosaure.roar(); // Comportement primitifmonDinosaure.roar("Hello"); // Comportement distingué

Les signatures sont l'une des fonctionnalités lesplus utiles en POO, utiliser les !

52

Attributs

la classe est ici tronqué

public class Dinosaur{ private String sound; //All methods}

Les attributs sont la mémoire de notre objet, unattribut est un bout de neurone qui contient desinformations sur notre objet.

53

Attributspublic class Dinosaur{ private String sound = "Rrrrr";

public void roar(){ System.out.println(this.sound); }}//

monDinosaure.roar(); // Affiche RrrrrmonDinosaure.sound; // Produit une erreur

la classe est ici tronqué

54

Attributs et portéesprivate: Accessible uniquement à l'intérieur de laclasse/namespace

public: Accessible de partout

protected: Accessible à l'intérieur de la classe etdes classes dérivées

55

Getter & Setterpublic class Dinosaur{

public String sound; public String getSound(){ return this.sound; } public void setSound(String sound){ this.sound = sound; }}//

monDinosaure.roar(); // Affiche une ligne videmonDinosaure.getSound; // Affiche une ligne vide

56

Getter & Setterpublic class Dinosaur{ private String defaultSound = "Grr"; public void Roar() { if (this.sound == null || this.sound.isEmpty() ) { System.out.println(this.defaultSound); } else { System.out.println(this.sound); } }}

57

ConstructeurOn souhaite généralement donner un état dedépart à tout nouvel objet créé,

Il existe une méthode appellé automatiquement àchaque instantiation d'une classe: Leconstructeur

58

Constructeurclass Dinosaur{ private string defaultSound = "Grr"; public string sound;

public Dinosaur(){ this.sound = this.defaultSound; }

public Dinosaur(String sound){ this.sound = sound; }}

59

ConstructeurDinosaur dino1 = new Dinosaur();Dinosaur dino2 = new Dinosaur("Hello!");dino1.roar();dino2.roar();

60

Démonstration & TDD

61

TDD ?Repose sur un des principes Test First d'unemethode de développement agile intituléeExtreme Programing appelé aussi XP.

Mise au point à la �n des années 90

Extreme Programming Explained par Kent Beck

L'écriture des tests automatisés dirige l'écriture ducode source

62

Principe du TDDRédaction des tests unitaires avant de procéder àl'implémentation du code source

Démarche à suivre RGR:

Red: écrire un code de test et les faire échouer

Green: écrire le code métier qui valide le test

Refactor: remaniement du code a�n d'enaméliorer la qualité

63

Cycle de développement1. Ecriture d'un premier test

2. Exécuter le test et véri�er qu'il échoue

3. Ecriture de l'implémentation pour faire passer letest

4. Exécution des tests a�n de contrôler que les testspassent

5. Refactor du code

64

Avantages:Les tests sont réellement écrit

Clari�cation du fonctionnement

Véri�cation démontable, répétable et automatisé

absence de régression

65

ExempleOn souhaite créer un jeu d'action ou le hérosprincipal est un dinosaure. Il est demandé à ceque le dinosaure puisse tourner dans le sens desaiguilles d'une montre (Orientation nord, est, sudet ouest). De plus il est précisé que le dinosauredoit débuter le jeu à la position nord.

66

Classe de testpackage helloworld;

import org.junit.Test;import static org.junit.Assert.*;

public class HelloWorldTest {

@Test public void createDinosaur(){ Dinosaur dinosaur = new Dinosaur(); assertEquals(Orientation.North, dinosaur.getOrientation()); } }

67

Exemple d'énumérationpublic enum Orientation { North, East, West, South;}

68

Héritage

69

HéritagePar défault toutes les classes en Java hérite deObject

class Dinosaur{}

class Dinosaur extends Object{}

L'héritage c'est transmettre son patrimoine.L’héritage est un moyen de factoriser du code,c’est à dire que si on a le même code à deuxendroits, l’héritage permet de centraliser ce codeà un seul endroit.

70

HéritageUn exemple:

Dinosaur.java

public class Dinosaur{

}

Triceratops.java

class Triceratops extends Dinosaur{

}

71

Héritage

final public class EtudiantAS extends Asticot{

}

Empêcher la dérivation Ne pas transmettre sonpatrimoine en somme

72

Surchagepublic class Dinosaur{ }

monDino = new Dinosaur();System.out.println(monDino);System.out.println(monDino.toString());

73

Surchagepublic class Dinosaur{ @Override public String toString() { return "Hello I'm a dinosaur"; }}

monDino = new Dinosaur();System.out.println(monDino);System.out.println(monDino.toString());

74

Le polymorphismeUn bien grand mot

Le polymorphisme c'est l'identi�cation àl'exécution du code qui doit être exécuté.

75

Le polymorphismepublic class Human{ public String talk(){ return "Encore du travail ?!"; }}

public class Jedi extends Human{ public String talk(){ return this.quote; }}

public class StormTrooper extends Human{}

76

Le polymorphismeHuman v_Human = new Human() ;Jedi v_Jedi = new Jedi() ;StormTrooper = v_STP = New StormTrooper() ;v_Human.talk() ; //output ?v_Jedi.talk() ; //output ?v_STP.talk() ; //output ?v_Human = v_Jedi ;v_Human.talk() ; //output ?v_Human = v_STP ;v_Human.talk() ; //output ?

77

Méthodes & Classesabstraites

Si une classe contient une méthode abstraite alorscelle-ci doit être abstraite.

Il n'est alors pas possible de l'instancier.

Elle permet de dé�nir un état générique et uncomportement générique.

Nécessaire d'intégrer une méthode dans uneclasse mais pour laquelle on ne peut fournir ducode.

78

Méthodes & Classesabstraitespublic abstract class Human{ public abstract String talk(){}}

public class Jedi extends Human{ public String talk(){ return this.quote; }}

79

Interface, remplir un contratpublic interface Warrior{ void fight() ;}

public class Jedi extends Human implement Warrior{ public void fight(){ //do something }}

80

Design Pattern

Briller en société

81

Un design Pattern

Les principaux: Factory, Decorator, Iterator,Observer, Singleton, ..

Un patron de conception (ou design pattern) estun arrangement caractéristique de modules,reconnu comme bonne pratique en réponse à unproblème de conception d'un logiciel. Il décritune solution standard, utilisable dans laconception de différents logiciels.

82

Singleton, une instanceuniquepublic final class DatabaseManager{ private static DatabaseManager instance = null; private DatabaseManager(){ super(); } public final static DatabaseManager getInstance(){ if (null == instance){ instance = new DatabaseManager(); } return instance; }}

83

Les exceptions

Con�rme la régle ?

84

Les exceptions

Un exemple commun: NullReferenceException

int a = 20 ;int b = 0 ;System.out.println(a/b) ;

>>> Exception in thread “main” >>> java.lang.ArithmeticException: / by zero

Une exception est une erreur se produisant dansun programme qui conduit le plus souvent àl'arrêt de celui-ci.

85

Les exceptionsint a = 20, b = 0 ;try{ System.out.println(a/b) ;}catch(ArithmeticException ex){ System.out.println(''ERROR'' + e.getMessage()) ;}finally{ System.out.println(''ALWAYS EXECUTE'') ;}

86

Nos propres exceptionspublic class StormTrooper{ private int HP ; /* other methods and attributes */}

L'attribut hp ne doit pas être négatif.

87

Nos propres exceptionspublic class HPException extends Exception{ public HPException(){ System.out.println("HP must be positive or equal to 0") ; }}

public class StormTrooper{ public void setHP(int p_HP){ if(p_HP < 0) throw new HPException() ; m_HP = p_HP ; }}

88

Swing

Alors on dance ?

89

Des interfaces graphiquesAWT: Abstract Window Toolkit, emploie lescomposants natif de la plateforme

SWING: Utilise AWT comme base, offre lapossibilité de créer des GUI identitques quel quesoit le SE

JavaFX: apparu avec Java8 en mars 2014, unepure API Java qui ne décolle pas ou peu

90

Swing

91

Découverte: JFrame

public class MainFrame extends Jframe{ public MainFrame(){ setTitle("Simple example"); setSize(300, 200); setDefaultCloseOperation(EXIT_ON_CLOSE); }}

92

Découverte: JFrame, JPanel, JButton ..

public class MainFrame extends Jframe{

JPanel panel = new JPanel(); Jbutton button = new Jbutton("Hello World");

public MainFrame(){ ... this.panel.setLayout(new FlowLayout( FlowLayout.LEFT)); this.panel.add(this.button); this.add(panel); }}

la classe est ici tronqué, il s'agit d'ajout de code etnon de remplacement

93

Découverte: JFrame, JPanel, JButton ..

public class MainFrame extends Jframe{ ... public MainFrame(){ ... this.button.addActionListener(this); } @Override public void actionPerformed(ActionEvent ae){ System.out.println(ae.getActionCommand()); JOptionPane.showMessageDialog(null, "Hello World"); }}

la classe est ici tronqué94

Exercice I: MillionDollarApplication

95

Exercice II: MillionDollarApplication II

96

Exercice III: More or Less *again

97

InputOutput *IO

98

Les �ux d'entrée/sortie (IO)Une entrée/sortie en Java consiste en un échangede données entre le programme et une autresource (mémoire, �chier, le programme lui-même..)

En Java on utilise des objets spéci�ques appellés“Stream”

99

Les �ux d'entrée/sortie (IO)Toute opération sur les IO doit suivre le schémasuivant :

Ouverture > Lecture|Ecriture > Fermeture duFlux

Deux catégorie de �ux:

d'entrées IN (lecture)

de sorties OUT (écriture)

100

Pour information: l'object File

File file = new File("myFile.md");file.getAbsolutePath();file.getName();file.exists();file.isDirectory();file.isFile();

101

Lire un �chierFileInputStream fis = null;BufferedInputStream bis = null;DataInputStream dis = null;

fis = new FileInputStream("/home/sam/test.txt");bis = new BufferedInputStream(fis);dis = new DataInputStream(bis);

while(dis.available() != 0){ System.out.println(dis.readLine());}

dis.close();bis.close();fis.close();

102

ObjectInputStream &ObjectOutputStream

Pour écrire un ou plusieurs objets dans un �chiers,on utilise la sérialisation cad la représentationd'un objet sous la forme d'un String.

Pour rendre un objet sérialisable, il suf�t d'utiliserl'interface Serializable

public class myObject implements Serializable {}

Serializable est ce qu’on appelle une interfacemarqueur

103

ObjectInputStream &ObjectOutputStreamDinosaur nessy = new Dinosaur("Nessy");FileOutputStream fos = null;BufferedOutputStream bos = null;ObjectOutputStream oos = null;fos = new FileOutputStream("/home/sam/dinosaurs.txt");bos = new BufferedOutputStream(fos);oos = new ObjectOutputStream(bos);oos.writeObject(nessy);/*Fermeture des descripteurs */

104

ObjectInputStream &ObjectOutputStream

Si notre classe contient une instance d'un objetnon sérialisable, nous avons deux options:

Rendre notre objet sérialisable

Spéci�er que l’objet ne doit pas êtré sérialiséevia transient

105

Maven

106

MavenApache Maven est un outil pour la gestion etl'automatisation de production des projets logicielsJava en général et Java EE en particulier.

L'objectif recherché est comparable ausystème make sous Unix :

produire un logiciel à partir de ses sources,

en optimisant les tâches réalisées à cette �n et

en garantissant le bon ordre de fabrication.

107

POM(.xml)

Pom (Project Object Model)

Chaque projet est con�guré via un �chier pom.xmlqui contient les informations nécessaires à Mavenpour traiter le projet:

nom du projet,

numéro de version,

dépendances vers d'autres projets,

bibliothèques nécessaires à la compilation,

noms des contributeurs, 108

POM(.xml)<?xml version="1.0" encoding="UTF-8"?><project ..> .. <dependencies> </dependencies> <build> </build></project>

109

POM(.xml)Ajout d’une librairie

<dependencies> <dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version>3.18.0</version> </dependency></dependencies>

110

JDBC

111

Qu’est ce à dire que ceci ?JDBC (Java DataBase Connectivity) permet auxapplications Java d’accéder par le biais d’uneinterface commune à des sources de données pourlesquelles il existe des pilotes JDBC.

Contenu dans deux package: java.sql et javax.sql

112

Qu’est ce à dire que ceci ?

113

Une notion: les StatementsStatement requête basique (simple SELECT parexemple)

PreparedStatement requête complexe contenantdes paramétres, sécurise nos requêtes

CallableStatement utiliser pour éxécuter uneprocédure stockée au sein deu SGBD(R)

114

Phase I: La connexionClass.forName("org.sqlite.JDBC");Connection connextion = DriverManager.getConnection(String.format("jdbc:sqlite:%s", databasePath));

115

Phase II: Execution d'unerequeteString query = "SELECT * FROM dinosaurs";Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery(query);while (resultSet.next()) { resultSet.getString("name"); resultSet.getInt("id");}

116

Phase III: Fermeture du �uxresultSet.close();statement.close();connextion.close();

117

Multi Threading

118

Un threadou �l (d'exécution), tâche ou processus léger.

Les threads sont classiquement utilisés avecl’interface graphique (Graphical user interface) d’unprogramme, pour des attentes asynchrones dans lestélécommunications ou encore pour des programmesde calcul intensif (comme l’encodage d’une vidéo, lessimulations mathématiques, ...).

119

Thread en JavaIl existe deux façons en Java pour créer un nouveauThread:

une classe héritée de Thread

une classe implémentant l’interface Runnable etinstancier un objet Thread avec l’implémentationde cette interface

120

Thread en Javapublic class Test{ public static void main(String[] args){ System.out.println(Thread.currentThread() .getName()); }}

121

Thread en Javapublic class MyThread extends Thread{ public MyThread(String name){ super(name); } public void run(){ for(int i =0; i<10: i++){ System.out.println(this.getName()); } }}

122

Thread en JavaMyThread t1,t2;t1 = new MyThread("Luke");t2 = new MyThread("Ben");t1.start();t2.start();

123

Thread en JavaUn thread peut présenter plusieurs états :

NEW : lors de sa création

RUNNABLE : en cours

TERMINATED : toutes les tâches achevées

TIMED_WAITING : en pause

WAITING : en attente indé�nie

BLOCKED : Placer en sommeil par l'ordonnanceur

La méthode getState() d'un thread permet deconnaitre son état. 124

Thread via Runnable en JavaPourquoi utiliser l’interface Runnable plutôtque d'hérité de Thread ?

Pas d'héritage mutliple en Java

public class Test implements Runnable{ public void run(){ //DO Something }}new Thread(new Test()).start();

125

Synchroniser ses threadsIndiquer à la JVM qu’un thread est en train d’utiliserdes données qu’un autre thread est susceptibled’altérer.

Utilisation du mot clé synchronized au sein d'uneméthode ou en signature de méthode.

126

The End ..

127