Un objectif que je me donne en développant du code c’est de limiter le nombre de caractères que je dois taper pour réaliser ce que j’ai à livrer.
Bref, il faut tapper le moins de code possible. Ce qui rejoint parfaitement l’objectif du Spartan Programming et facilite par le fait même la maintenance et facilite la compréhension du code.
Voyons la situation classique d’instanciation d’objet :
https://gist.github.com/23638533
Ce que je n’aime pas dans ce code c’est la répétition de la variable smtpServerConfiguration. Tout ce que cela fait, c’est d’ajouter du bruit autour du but actuel du code.
Voilà qu’entre en jeu la désignation chaînée (Fluent Interfaces). Le but de la désignation chaînée est de pouvoir faciliter l’écriture de code en chaînant l’appel des fonctions.
De cette façon :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Configuration smtpServerConfiguration = new Configuration(); | |
smtpServerConfiguration | |
.SetPort(3) | |
.SetServer("bob") | |
.SetTimeout(333); |
La conception d’une classe permettant ce genre d’appels est très simple et sa mise en place est liée étroitement à la programmation orientée objet.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Configuration | |
{ | |
private String _server { get; set; } | |
private int _timeout { get; set; } | |
private int _port { get; set; } | |
public Configuration SetPort(int port) | |
{ | |
_port = port; | |
return this; | |
} | |
public Configuration SetServer(String server) | |
{ | |
_server = server; | |
return this; | |
} | |
public Configuration SetTimeout(int timeout) | |
{ | |
_timeout = timeout; | |
return this; | |
} | |
} |
Pour ceux d’entre-vous qui font du C#, ce genre d’appels doit vous sembler familier. Il s’agit en effet d’un des deux modes de requête possible avec LINQ. La désignation chaînée a été popularisée avec la venue de LINQ dans le monde .NET où il est possible du code comme celui-ci :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var result = session | |
.Query<Wine>() | |
.Where(p => p.Id == wineId)) | |
.First() |
Bel article !
Tu pourrais même optimiser ta dernière requête LINQ comme ceci:
var result = session
.Query()
.First(p => p.Id == wineId))
En effet!
Mon objectif était, cependant, plus de démontrer de quoi ça avait l’air dans le concret :)