Bonnes pratiques Orienté Objet et Java J.M. Vanel Conseil informatique, architecture http://jmvanel.free.fr/ 2005-12
Plan Exemple avec interface et classe métier Exemple de test JUnit Notion d'objet Nommage des classes et des méthodes Utilisation des interfaces Utilisation des fabriques Architecture applicative en couches Traçabilité des fonctionalités et de leurs implémentations
Exemple d'interface métier /** Compte en banque */ public interface Compte { /** solde en centimes */ public long solde(); public void deposer(long somme); public void retirer(long somme) throws NonAuthorise; } Interface = Comportement pur (aucune implémentation) Contrat entre l'appelant et l'appelé solde() est un accesseur : il ne modifie pas l'état de l'objet; on utilise souvent la convention de nommage «JavaBeans» getSolde() deposer() et retirer() sont des modifieurs : ils modifient l'état de l'objet
Exemple d'objet métier /** Compte en banque : compte courant, sans intérêt, sans découvert autorisé. */ public CompteCourant implements Compte { /** solde en centimes */ private long solde; public long solde(){return solde;} public void deposer( long somme) { solde += somme; } // ... Commentaire Javadoc qui précise la sémantique de la classe. Les champs doivent toujours être privés. Le nommage de l'argument somme reflète sa signification.
Exemple d'objet métier - 2 nouveau_solde permet de factoriser une expression qui apparaît 2 fois. NonAuthorise est une exception métier; on y ajoute toutes les informations nécessaires pour traiter l'exception public void retirer(long somme) throws NonAuthorise { long nouveau_solde = solde-somme; if( nouveau_solde < 0 ) { throw new NonAuthorise( NonAuthorise.DECOUVERT_NON_AUTHORISE , this ); } solde = nouveau_solde;
Exemple de test JUnit setUp() est appelée avant chaque test, et sert à initialiser les données de test. Chaque méthode de test a un nom qui commence par test; elles sont appelées par Junit par introspection. Les assertions servent à affirmer ce que l'on sait être vrai. import junit.framework.TestCase; public class TestCompteCourant extends TestCase { private CompteCourant compte; protected void setUp() throws Exception { compte = new CompteCourant(); } public void testDeposer() { compte.deposer(111); assertEquals( "test dépot simple", 111, compte.getSolde() );
Exemple de test Junit - 2 Suite de la classe TestCompteCourant. Les exceptions font partie du comportement de la classe et doivent être testées . public void testRetirer() throws NonAuthorise { compte.deposer(111); compte.retirer(111); assertEquals("on vide complètement le compte", 0, compte.getSolde() ); try { compte.retirer(1); fail( "Une exception doit être lancée si on veut faire un découvert" ); } catch (NonAuthorise e) { }
Notion d'objet Entité correspondant à un objet du monde réel, ou à un concept, et encapsulant des données, un état et un comportement. Généralise les notions : Ligne d'une base de données relationnelle Struct du langage C
Notion de classe ensemble des objets qui ont même types de données et comportement Une classe a des compétences claires et délimitées pour lesquelles il rend un service complet et fiable; elle est donc réutilisable dans différents contextes
Exemples de classes Banque Compte +solde(): Devise Mutuelle Banque Compte +solde(): Devise Assure' +taux(): double +crediter(int montant) +deposer(montant:Devise) +retirer(montant:Devise) Prestation +montant(Assure'): int Math Simulation On retient de l’objet ce qui s’applique au domaine d’activité, à ce qu’on veut faire avec le logiciel: c’est une modélisation. Pour une classe « Assuré », le point de vue du logiciel d’une mutuelle sera différent de celui d’une clinique. Matrice Animal +avancer(Direction) +multiplierPar(Matrice): Matrice +crier() +inverser(): Matrice +manger(Animal) +procreer(avec:Animal): Animal
Bonnes pratiques - classes Dissimulation des informations Utiliser les conventions de nommage JavaBeans Limiter au maximum les méthodes et champs statiques
Traçabilité des fonctionalités et de leurs implémentations