Encapsulation

Un principe de la programmation orientée objet

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

Si l'on veut protéger des informations contre une modification inattendue, on doit se référer au principe d'encapsulation. Il est également utilisé, peut-être la plupart de cas incosciemment, par des développeurs PHP.

Qu'est-ce que l'encapsulation en Java ?

Le principe d'encapsulation consiste sur la protection des informations contenues dans un objet. Cette protection peut être représentée par l'absence de possibilité de modifier ces données depuis l'extérieur. On peut accéder à ces informations uniquement par les services proposés. Un peu confus ? Analysons un exemple :

public class NonEncapsulated {
    public static void main(String[] args) {
        Dog dogInst = new Dog("test");
        dogInst.name = "test2";
    }
}

class Dog {
    public String name;
  
    public Dog(String n) {
        name = n;
    }
}

La classe Dog n'est pas encapsulée. Une classe extérieure peut facilement accéder à ses attributs et ainsi provoquer un changement inattendu du comportement du programme. Voici la même classe encapsulée :

public class Encapsulated {
    public static void main(String[] args) {
        Dog dogInst = new Dog("test");
        dogInst.setName("test2");
    }
}

class Dog {
    private String name;
  
    public Dog(String n) {
        name = n;
    }
  
    public void setName(String n) {
        name = n;
    }
  
    private String getName() {
        return name;
    }
}

Quel changement par rapport au premier code ? Tout d'abord on remarque que l'attribut name est devenu privé. Ensuite, pour le modifier on a dû créer la méthode setName(String n). Pour récupérer sa valeur on devra désormais faire appel à getName(). Grâce à cela on a gagné une meilleure contrôle sur les données. On évite ainsi une situation où la modification directe de l'attribut name peut changer d'une manière inattendue le fonctionnement de l'instance Dog.

Par exemple on peut supposer que l'attribut name peut contenir uniquement 4 caractères. Si l'on accepte sa modification depuis l'extérieure, on n'a pas de possibilité de détecter cette contrainte. Par contre, si l'attribut devient privé et il est modifiable uniquement via une fonction, on peut totalement contrôler les données saisies par l'utilisateur.

Quand encapsuler un objet en Java ?

L'encapsulation :
- garantit une meilleure flexibilité du code
- garantit un meilleure contrôle les données (niveaux d'accès)
- aide à concevoir des objets immuables
- permet de mieux gérer les parties du code

Une question ? Une remarque ?

*

*

Un conseil Doctrine

Comment exécuter une requête LIKE ?

Pour créer une requête LIKE avec Doctrin2, on peut utiliser les expressions. Par exemple, on veut récupérer toutes les actualités dont le titre commence par "Comment faire". Le champ correspondant dans le fichier d'entité sera représenté par la variable $newsTitle. On veut également que l'auteur s'appelle "Nick". Voici comment on peut écrire une requête LIKE sous Doctrin2 :

    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb->add('select', 'n.idNews')
    ->add('from', 'PagesNewsBundle:News n')
    ->add('where', $qb->expr()->andx(
      $qb->expr()->eq('n.newsAuthor', '?1'),
      $qb->expr()->like('n.newsTitle', '?2')
    ))
    ->setParameter(1, 'Nick') 
    ->setParameter(2, 'Comment faire%');
    $query = $qb->getQuery();
    $rows = $query->getResult();