Formation Java / Spring Boot pour développeurs COBOL
À l’issue de cette sixième journée, vous derez capable de :
Cette journée est volontairement lente, analogique et explicative. La POO est un changement dans la façon de penser et de programmer, pas une simple nouvelle syntaxe.
En COBOL, vous raisonniez historiquement ainsi :
En Programmation Orientée Objet :
la programmation objet est une collaboration d’objets
La POO, c’est passer d’un monde où le programme agit sur les données… à un monde où les données savent agir sur elles-mêmes.
La première partie du cours est en full Java sans référence à Cobol et la seconde (ci-dessous) fait référence de temps en temps à la syntaxe Cobol (pas pour tous les exemples).
Dans ce cours, on abordera les concepts et la programmation orientée objet :
Lien vers les notions de base pour comprendre la POO
Lien vers les notions de base pour comprendre et manipuler des Collections
Lien vers les notions de base pour découvrir les expressions régulières (semaine 1 ou 2)
Lien vers une synthèse rapide des concepts de la POO
Le cours sur les concepts en POO est indispensable pour bien comprendre la philosophie et le fonctionnement de la programmation orientée objet. On pourrait dire qu’une classe CompteBancaire est la structure, le modèle, la fabrique à compte bancaire réel d’un client.
En COBOL, vous avez souvent une structure de données comme ci-dessous :
01 COMPTE. 05 NUMERO-COMPTE PIC X(12). 05 SOLDE PIC 9(7)V99. 05 STATUT PIC X(1).
En Java, on va créer une classe Compte qui contient :
Définition de la classe (équivalent DATA DIVISION + la logique métier) :
public class Compte { String numeroCompte; BigDecimal solde; String statut; }
Correspondance COBOL :
Une classe ne fait encore rien, elle décrit ce qu’est un Compte.
En Java :
Compte compte1 = new Compte();
Analogie COBOL :
01 COMPTE. : la description MOVE … TO COMPTE : manipulation
En Java, le mot clé new correspond à la création réelle de l’entité. Sans new, l’objet n’existe pas, sauf pour des cas particuliers comme avec la classe String.
new
String
compte1.numeroCompte = "FR001"; compte1.solde = new BigDecimal("1000.00"); compte1.statut = "A";
MOVE "FR001" TO NUMERO-COMPTE MOVE 1000.00 TO SOLDE MOVE "A" TO STATUT
Pour l’instant, Java ressemble beaucoup à COBOL. La vraie différence arrive avec les méthodes.
Problème COBOL classique :
En Java (philosophie POO) :
Un objet doit contrôler ses propres règles métier.
Exemple :
public class Compte { String numeroCompte; BigDecimal solde; void crediter(BigDecimal montant) { solde = solde.add(montant); } void debiter(BigDecimal montant) { solde = solde.subtract(montant); } }
Au lieu de ADD MONTANT TO SOLDE On dit compte1.crediter(montant);
ADD MONTANT TO SOLDE
compte1.crediter(montant);
On demande au compte d’agir, on ne manipule plus directement la donnée.
L’encapsulation permet de respecter les règles métier et d’encapsuler les données et certaines méthodes pour les rendre inaccessibles en dehors de l’objet. La notion de visibilité private est importante dans ce concept que nous voyons dans le cours sur la POO.
private
public class Compte { private BigDecimal solde; public void crediter(BigDecimal montant) { solde = solde.add(montant); } }
private signifie :
En COBOL, tout est global au programme alors que Java permet de fermer l’accès aux données, c’est une protection volontaire et explicite.
En COBOL, l’initialisation est souvent dispersée, en Java c’est contrôlé.
// constructeur Compte de la classe Compte public Compte(String numero, BigDecimal soldeInitial) { this.numeroCompte = numero; this.solde = soldeInitial; }
Explication :
new Compte()
La syntaxe est this.solde = solde; qui veut dire le solde de CE compte est égal à solde.
this.solde = solde;
this signifie cet objet précis, ce compte
this
public class Compte { private String numero; private BigDecimal solde; public Compte(String numero, BigDecimal soldeInitial) { this.numero = numero; this.solde = soldeInitial; } public void crediter(BigDecimal montant) { solde = solde.add(montant); } public void debiter(BigDecimal montant) { solde = solde.subtract(montant); } public BigDecimal getSolde() { return solde; } }
Utilisation :
Compte c1 = new Compte("FR001", new BigDecimal("1000.00")); c1.crediter(new BigDecimal("200.00")); c1.debiter(new BigDecimal("50.00")); System.out.println(c1.getSolde());
Consignes :
Consigne :
public class Compte { private String numero; private BigDecimal solde; public Compte(String numero, BigDecimal soldeInitial) { this.numero = numero; this.solde = soldeInitial; } public void crediter(BigDecimal montant) { solde = solde.add(montant); } public boolean debiter(BigDecimal montant) { if (solde.compareTo(montant) < 0) { return false; } solde = solde.subtract(montant); return true; } public BigDecimal getSolde() { return solde; } }
Lien vers un TP complémentaire sur les notions apprises
ça peut paraitre plus simple en Cobol mais c’est moins robuste.
Aujourd’hui, vous avez créé la première brique métier réelle :
Décisions structurantes :
main()
Le Jour 7 abordera :
Lien vers la proposition de correction