06-06-2015, 11:02 PM
La question s'étant posée sur le débat East (qui vire à un fourre-tout, et je reconnais y être pour 50%), j'aimerai savoir comment vous définissez les valueobject.
Pour ma part, je pensais initialement qu'un ValueObject était un conteneur de donné dont le seul rôle est de... contenir ces données. Il doit également permettre d'y accéder, et s'il est mutable, de les modifier. Un valueobject immutable (dont les données ne sont pas modifiables) me semble plus approprié mais pas forcément obligatoire.
Donc finalement, c'est un objet avec seulement un constructeur, des getters (soit explicites en PHP, soit "implicite" en Java, en accédant aux attributs public final par exemple), et des setters si besoin (mutable).
Après relecture de la définition: "In computer science, a value object is a small object that represents a simple entity whose equality is not based on identity: i.e. two value objects are equal when they have the same value, not necessarily being the same object.[...]two value objects created equal, should remain equal." (Wikipedia), je me pose quelques questions:
• Tous les valueobjects doivent-ils être obligatoirement immutables, ou certains peuvent-ils l'être s'ils en ont une raison?
• En PHP, on implémenter les getter (et setter, suivant la réponse précédente), mais doit-on implémenter dans le valueobject une méthode testant l'égalité entre deux valueobject?
• Peut-on, dans la suite logique, implémenter des opérateurs de comparaison dans le valueobject ?
• Teste-t-on un valueobject ? S'il n'y a que les getter/setter, ok, c'est useless comme test, mais si on accepte les comparaisons?
• Un valueobject doit-il ne contenir qu'une et une seule donnée (par exemple, la quantité de monnaie) ou peut-il en contenir plusieurs (la valeur faciale d'un billet + sa date d'impression + son numéro de série)
Ces questions se posent dans le cadre des "bonnes pratiques", de sorte que si je parle de valueobject au boulot à un collègue, on ait la même définition.
Pour ma part, je pensais initialement qu'un ValueObject était un conteneur de donné dont le seul rôle est de... contenir ces données. Il doit également permettre d'y accéder, et s'il est mutable, de les modifier. Un valueobject immutable (dont les données ne sont pas modifiables) me semble plus approprié mais pas forcément obligatoire.
Donc finalement, c'est un objet avec seulement un constructeur, des getters (soit explicites en PHP, soit "implicite" en Java, en accédant aux attributs public final par exemple), et des setters si besoin (mutable).
Après relecture de la définition: "In computer science, a value object is a small object that represents a simple entity whose equality is not based on identity: i.e. two value objects are equal when they have the same value, not necessarily being the same object.[...]two value objects created equal, should remain equal." (Wikipedia), je me pose quelques questions:
• Tous les valueobjects doivent-ils être obligatoirement immutables, ou certains peuvent-ils l'être s'ils en ont une raison?
• En PHP, on implémenter les getter (et setter, suivant la réponse précédente), mais doit-on implémenter dans le valueobject une méthode testant l'égalité entre deux valueobject?
• Peut-on, dans la suite logique, implémenter des opérateurs de comparaison dans le valueobject ?
• Teste-t-on un valueobject ? S'il n'y a que les getter/setter, ok, c'est useless comme test, mais si on accepte les comparaisons?
• Un valueobject doit-il ne contenir qu'une et une seule donnée (par exemple, la quantité de monnaie) ou peut-il en contenir plusieurs (la valeur faciale d'un billet + sa date d'impression + son numéro de série)
Ces questions se posent dans le cadre des "bonnes pratiques", de sorte que si je parle de valueobject au boulot à un collègue, on ait la même définition.