Visualizzazione dei risultati da 1 a 10 su 19

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Quote Originariamente inviata da Santino83_02 Visualizza il messaggio
    @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".
    @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

  2. #2
    Quote Originariamente inviata da Grino Visualizza il messaggio
    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.


    se pazienti, con la seconda parte ti mostro che tutto il codice che tu hai scritto è superfluo.
    Questa volta, più che un voto.. è favoreggiamento.

  3. #3
    Quote Originariamente inviata da Grino Visualizza il messaggio
    @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.


    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

  4. #4
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    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.

    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");
            ;
        }

    }
    ?>
    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'è.

    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.

    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");
            ;
        }

    }
    ?>
    Ti piace di più?

    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

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.