Désignation chaînée
En génie logiciel, une désignation chaînée ou chaînage de méthodes (fluent pattern) consiste à agir en une seule instruction sur plusieurs méthodes du même objet, dans un but de plus grande lisibilité.
L'idée principale est qu'au lieu de qualifier chaque méthode par le nom de l'objet correspondant, ce qui conduisait à une lourdeur de style, ce nom d'objet reste par défaut actif dans toute l'instruction en cours. L'économie de verbosité est du même ordre (bien que sur des principes différents) que celle que permettait l'expression with en langage Pascal et en Visual Basic
Le contexte est :
- défini par la valeur de retour de la méthode appelée
- transmis à la méthode suivante
- terminé par le retour d'un contexte vide.
Le code est ainsi à la fois plus concis et plus clair.
Exemples
C++
Le mécanisme des entrées-sortie caractères de C++ par << et >> permet le chaînage de méthodes :
std::cout << "Hello world!" << std::endl
PHP
Voici un exemple en PHP :
<?php
class car {
private $speed;
private $color;
private $doors;
public function setSpeed($speed){
$this->speed = $speed;
return $this;
}
public function setColor($color) {
$this->color = $color;
return $this;
}
public function setDoors($doors) {
$this->doors = $doors;
return $this;
}
}
// Exemple avec chaînage de méthodes
$myCar = new car();
$myCar->setSpeed(100)->setColor('blue')->setDoors(5);
// Exemple sans chaînage de méthodes
$myCar2 = new car();
$myCar2->setSpeed(100);
$myCar2->setColor('blue');
$myCar2->setDoors(5);
?>
Java
public class Car {
private int speed;
private String color;
private int doors;
/* Constructeur */
public Car setSpeed(int speed)c {
this.speed = speed;
return this;
}
public Car setColor(String color) {
this.color = color;
return this;
}
public Car setDoors(int doors) {
this.doors = doors;
return this;
}
}
Exemple sans le chainage des méthodes
Car car = new Car()
car.setSpeed(100);
car.setColor("blue");
car.setDoors(5);
Exemple avec le chainage des méthodes
Car car = new Car();
car.setSpeed(100).setColor(blue).setDoors(5);