@Grino
Due value object sono uguali non perchè sono la stessa istanza ma perchè il loro valore è lo stesso. Tutto quel casino che praticamente è un singleton mi sembra "fuori pattern".
@Grino
Due value object sono uguali non perchè sono la stessa istanza ma perchè il loro valore è lo stesso. Tutto quel casino che praticamente è un singleton mi sembra "fuori pattern".
IP-PBX management: http://www.easypbx.it
Old account: 2126 messages
Oldest account: 3559 messages
@Santino83_02
Quello che ho cercato di dire, ma non sei stato in grado di capire è, perchè se ho due oggetti con uno stato interno invariabile (immutabile o che non cambia nel tempo) devo istanziare due aree di memoria distinte?
Ne alloco solo una e se tenti di creare un nuovo oggetto con lo stesso stato di uno già esistente (immutabile essendo un value object) ti restituisco quello già creato, altrimenti te ne creo uno nuovo e lo trattengo internamente per restituirlo qualora chiedessi un'ulteriore oggetto con il medesimo stato.
In più, supponendo che wikipedia sia affidabile, per il value object troviamo scritto:
In computer science, a value object is a small object that represents a simple entity whose equality isn't based on identity: i.e. two value objects are equal when they have the same value, not necessarily being the same object
Il fatto che si dica che due value object "non debbano necessariamente essere lo stesso oggetto" non vuol dire che se mi chiedi un'oggetto con un stato X n volte io non possa restituirti la stessa istanza contenente lo stato X. E se mi chiedi un oggetto m volte con stato Y io non possa restituiti m volte sempre la stessa istanza di un oggetto con stato Y.
Il fatto che io restituisca a parità di stato sempre la stessa istanza ha come effetto secondario che potrai confrontare indistintamente i due oggetti o tramite il loro stato interno (proprietà per proprietà) o tramite il riferimento all'oggetto che è sempre lo stesso.
Mi dispiace contraddirti ma non è un singleton considerato che, come da script d'esempio in cui il secondo boolean di test ritorna false (var_dump($test2 == $test1);), cercando di creare oggetti costanti con stato interno diverso ottieni istanze diverse, come dire che 10 non è ugaule a 11. Il singleton crea un'unica istanza dell'oggetto e ritorna sempre quella. La mia classe invece crea n oggetti distinti se distinto è lo stato che cerchi di assegnare in prima istanza.
I pattern non sono la bibbia ma sono buone prassi. Se i pattern dovessero essere punto di arrivo della programmazione, oggi scriveremmo ancora spaghetti code. Se programmare vuol dire applicare cecamente un pattern, allora è giusto che i programmatori guadagnino una miseria poichè svolgono un banalissimo lavoro meccanico, ma non credo sia così.
In più ho difficoltà a credere che tu non riesca a leggere e capire il codice che ho scritto, visto le competenze che hai più volte dimostrato, al punto da definirlo un casino.
![]()
Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
Lavori e Lavoretti
Si bel pippone di spiegazione, ma il discorso è che non è che perchè voglio un oggetto "immutabile" allora devo usare quella sottospecie di singleton e istanziare ogni volta ogni oggetto con una factory... di Value Object "con gli stessi valori" ne puoi avere seimila, non stà nel pattern impedire che due value object abbiano gli stessi valori, dice solo che il value object deve essere immutabile e che due value object sono uguali se uguali i valori. Il discorso se istanziare o meno N volte un value object dipende da 1) che cosa rappresenta questo value object e 2) da quanti effettivamente ne stai istanziando e 3) ma quante volte vorrai utilizzarlo un value object? in un app web poi... quante ne istanzierai? 1? 2? 3?
Cmq il mio intervento era semplicemente per dire che la tua implementazione risolve delle specifiche ben precise (non ripetere due volte lo stesso value object) e impone che lo stesso due oggetti che devono usare una istanza del value object puntano entrambi alla stessa istanza, cosa nello specifico inutile e che potrebbe anche risultare controproducente in alcuni casi. Tutto quà... lungi da me l'idea di darti del cretino (cosa che per altro tu hai fatto tranquillamente), dicevo solo che l'implementazione (alias: tutto quel casino... alias alias: tutto quel popò di roba ... alias alias alias: tutte quelle righe di codice) andava secondo me fuori dagli scopi del pattern e che era del tutto opinabile (cosa per altro detta anche da te medesimo). punto.
IP-PBX management: http://www.easypbx.it
Old account: 2126 messages
Oldest account: 3559 messages
Non ti darei mai del cretino, a volte però sei un po' frettoloso nel sentenziare.
Tu scrivi:.il value object deve essere immutabile e che due value object sono uguali se uguali i valori
Esattamente quello che fa la mia classe, cercando di non allocare memoria in più. Oviamente con un piccolo overhead d'esecuzione, ma si sa, più sei veloce in esecuzione e più memoria usi, meno memoria usi e meno sei veloce in esecuzione. Quanti ne alloco in un'applicazione web? Non lo so, la sorte sorride a chi si prepara. Infine non mi sembra di aver scritto così tanto codice.
Il resto è lo script di test e l'adattamento della classe d'esempio specifica di Al_katraz, ma la classe può essere utilizzata così com'è.Codice PHP:<?php
class OggettoCostante {
private static $gliOggetti = [];
private $iDati = [];
public static function creaNuovoOggetto(array $valori) {
$hash = hash("sha256", serialize($valori)); //tengo le dita incrociate
if (!isset(self::$gliOggetti[$hash]))
self::$gliOggetti[$hash] = new OggettoCostante($valori);
return self::$gliOggetti[$hash];
}
private function __construct(array $valori) {
foreach ($valori as $nomeProprieta => $valore) {
if (is_object($valore))
$valore = clone $valore;
$this->iDati[$nomeProprieta] = $valore;
}
}
public function __get($name) {
if (isset($this->iDati[$name]))
return $this->iDati[$name];
throw new Exception("La proprieta non e' definita");
}
public function __set($name, $value) {
throw new Exception("Non e' ammessa la modifica dello stato dell'oggetto");
;
}
}
?>
Se poi non ti piace il fatto che restituisca la stessa istanza a parità di stato, posso strappare via quella parte e rendere pubblico il costruttore. Così ci saranno i soli 3 metodi __construct __get e __set.
Ti piace di più?Codice PHP:<?php
class OggettoCostante {
private $iDati = [];
public function __construct(array $valori) {
foreach ($valori as $nomeProprieta => $valore) {
if (is_object($valore))
$valore = clone $valore;
$this->iDati[$nomeProprieta] = $valore;
}
}
public function __get($name) {
if (isset($this->iDati[$name]))
return $this->iDati[$name];
throw new Exception("La proprieta non e' definita");
}
public function __set($name, $value) {
throw new Exception("Non e' ammessa la modifica dello stato dell'oggetto");
;
}
}
?>
Santino, ti voglio bene (detto sinceramente)! E non ti prendo in giro quando dico che so che ne sai a pacchi.
![]()
Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
Lavori e Lavoretti