Private class data

La programmation avec design patterns

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com
Parfois moins on sait, mieux c'est. On protège non pas seulement soi-même, mais aussi d'autres personnes. Cette illustration trouve son utilité dans le patron de conception appelé private class data.

Private class data (données de classe privées) est un design pattern structurel. Il vise à séparer les attributs d'une classe des attributs d'une autre classe. Les attributs deviennent alors finaux, sans aucune possibilité de modification. Ce patron de conception est également connu sous le nom PrivateIMPLementation (implémentation privée, sous l'acronyme PIMPL).

La finalité des attributs se traduit par l'absence des setters et des méthodes susceptibles de modifier des valeurs des attributs d'une classe contenant uniquement des valeurs. Pour mieux comprendre cette séparation, on peut imaginer un millionnaire qui veut cacher le fait d'être riche. Il veut également se protéger contre tous les faux-amis et ne veut pas dépenser ses millions. Du coup, dans le patron données de classe privées, on aura deux classes. La première classe représentera le millionnaire. Il s'agira d'une représentation physique de la personne. La deuxième classe contiendra les attributs que cette personne ne souhaite pas dévoiler au monde. Elle aura donc un attribut indiquant le montant de la fortune, mais elle n'aura pas de possibilité de modifier ce montant.

Comme on pouvait voir à travers ce descriptif, les attributs sont initialisés juste au moment de la construction de l'objet secret. Ils ne peuvent pas être modifiés ultérieurement. Cette absence de manipulation garantit un meilleur contrôle sur les données, et donc, une meilleure stabilité de l'application à travers l'immutabilité de ces objets. Cette séparation influence également les types d'objets. Ils deviennent du type final after constructor (finaux après le constructeur).

Plusieurs fois on a déjà mentionné le mot final. Cependant, ce patron de conception ne correspond pas à une simple déclaration des attributs avec ce mot-clé. Souvent d'ailleurs, cette déclaration est impossible. Imaginons la situations où certains attributs peuvent, mais ne doivent pas être initialisés. Si l'on les précède avec le mot-clé final, on aura toujours l'obligation de les initialiser. Par contre, si l'on utilisera le private class data, on pourra traduire leur finalité par un seul setter qui contrôlera la modification de valeur. Ce contrôle peut s'expliquer par exemple à travers une simple vérification si un attribut est différent que l'état "non-initialisé".

Exemple du private class data
Le code qui présentera private class data séparera les secrets d'une famille de la famille elle-même.


class FamilySecrets {
private final String firstSecret;
private final String secondSecret;

public FamilySecrets(String firstSecret, String secondSecret) {
this.firstSecret = firstSecret;
this.secondSecret = secondSecret;
}

public String getFirstSecret() {
return this.firstSecret;
}

public String getSecondSecret() {
return this.secondSecret;
}

}

C'est la classe private class data car on y retrouve que les attributs. En plus, ils sont finaux car on les initialise à chaque fois. On remarque également la présence des getters. Aucune modification après l'appel du constructeur est possible.


class Family {
private FamilySecrets secrets;

public Family() {
this.secrets = new FamilySecrets("Ghost at the cupboard", "Ferrari in garage");
}

public boolean isMysteriousFamily() {
return (this.secrets.getFirstSecret().indexOf("Ghost") > -1 &&
this.secrets.getSecondSecret().indexOf("Ferrari") > -1);

}

}

La classe Family est une classe normale dont le rôle consiste plutôt à décrire la logique d'une application à la place de contenir les données.


Family family = new Family();
System.out.println("Is this family mysterious ? "+family.isMysteriousFamily());

Le code d'exemple est très court. On peut en déduire que la classe FamilySecrets se trouve au troisième niveau. Elle est donc inaccessible directement par des acteurs non-autorisés (comme le code client ci-dessus). Juste pour la formalité, le résultat affiché sur l'écran :

Is this family mysterious ? true


Private class data permet de séparer la logique des données d'une application. Deux classes sont alors créées, une contenant la logique et l'autre les données. Le risque d'influence entre les deux est alors minimalisée. Surtout quand on limite les opérations entre elles à la lecture.
Bartosz KONIECZNY 09-03-2014 16:53 design patterns
Moi

Développeur d'applications Internet et journaliste passionné par l'adjectif français. Un aigle polonais orienté vers la progression, volant très haut et écoutant du zouk après les matches du foot français.

Vous appréciez mon travail ?

Pour contribuer au développement de ce site, ou pour remercier pour des articles rédigés, vous pouvez faire un don.

Un conseil Symfony1

Comment afficher tous les paramètres d'une requête ?

Pour afficher tous les paramètres d'une requête, il suffit d'appeler la méthode getParameterHolder()->getAll() .