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
    Non sono un appassionato di pattern e ne capisco ben poco, ma vorrei porre alcune osservazioni e dare il mio contributo. Hai di fatto creato un oggetto costante ossia essendo le classi delle definizioni di tipi e raltive operazioni possibli, non fai altro che definire uno stato per la classe impedendone la modifica. Ma essendo una costante, non dovrei ottenere sempre lo stesso oggetto, a parità di parametri in ingresso, all'atto della creazione? In altre parole il valore 10 è tale a prescindere dalla variabile a cui è assegnato così come uno stato costate di un oggetto dovrebbe essere tale aprescindere dall'oggetto istanziato ossia l'istanza è sempre la stessa.

    Io avrei svolto il compitino in questo modo:

    Codice PHP:
    <?php

    class OggettoCostante {

        private static 
    $gliOggetti = [];
        private 
    $iDati = [];

        
    /**
         * Crea un nuovo oggetto costante. In $valori vanno specificate coppie
         * [nomeProprietà => valore, ...]. Le proprietà saranno poi accessibili
         * tramite la sintassi $oggetto->nomeProprietà in sola lettaura
         * @param array $valori
         * @return type
         */
        
    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");
            ;
        }

    }

    final class 
    URL extends OggettoCostante {

        
    /**
         * Crea un nuovo oggetto url costante. Il parametro è un array del tipo:
         * ['url' => 'http://www.google.com']
         * @param array $url
         * @throws Exception
         */
        
    public static function creaNuovoOggetto(array $url) {
             if (!isset(
    $url['url']) or !filter_var($url['url'],  FILTER_VALIDATE_URL, array(FILTER_FLAG_SCHEME_REQUIRED,  FILTER_FLAG_HOST_REQUIRED))) {
                throw new 
    Exception("Parametro non correttamente formattato o url non valido.");
            }

            
    $purl parse_url($url['url']);
            
    $scheme $purl['scheme'];
            
    $host $purl['host'];
            
    $path = (isset($purl['path'])) ? $purl['path'] : 'undefined';
            
    $query = (isset($purl['query'])) ? $purl['query'] : 'undefined';

             return 
    parent::creaNuovoOggetto(array('url' => $url['url'], 'scheme'  => $scheme'host' => $host'path' => $path'query' =>  $query));
        }

    }

    //script di test
    try {
        
    $test URL::creaNuovoOggetto(['url' => 'h*t*t*p://www.test.it/index.php?q=paperino']);
        
    $test1 URL::creaNuovoOggetto(['url' => 'h*t*t*p://www.test.it/index.php?q=paperino']);
        
    $test2 URL::creaNuovoOggetto(['url' => 'h*t*t*p://www.test.com/index.php?q=paperino']);
        
    var_dump($test == $test1);
        
    var_dump($test2 == $test1);
         echo 
    $test->url '<br>' $test->scheme '<br>' .  $test->host '<br>' $test->path '<br>' .  $test->query '<br>';
        
    $test->url 'Pippo';
    } catch (
    Exception $e) {
        echo 
    $e->getMessage();
    }
    ?>
    L'output dello script di test è:

    codice:
    boolean true
    boolean false
    h*t*t*p*://w*w*w*.test.it/index.php?q=paperino
    http
    w*w*w*.test.it
    /index.php
    q=paperino
    Non e' ammessa la modifica dello stato dell'oggetto
    in questo modo hai la possibilità di:
    1) accedere alle prorpietà direttametne tramite il loro nome senza permetterene la modifica
    2) poter verificare che lo stato sia lo stesso per due oggetti OggettoCostante, e per ereditarità URL, semplicemente utlizzando l'operatore di confronto == dato che oggetti con uguale stato utilizzano lo stesso oggetto

    in più OggettoCostante è sufficientemente generico da poter essere utilizzato e riutilizzato in ogni circostanza, direttamente o per specializzazione come nel caso di URL riducendo il codice necessario e semplificandone la stesura.

    Ovviamente il tutto è opinabile sebbene questo sia il mio metodo.

    Nota gli * in più sono per nascondere gli url altrimenti non potevo postare

    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  2. #2
    Quote Originariamente inviata da Grino Visualizza il messaggio
    Ovviamente il tutto è opinabile sebbene questo sia il mio metodo.

    Nota gli * in più sono per nascondere gli url altrimenti non potevo postare

    Grazie per il contributo , quando posto la seconda parti chiarisco anche il concetto di immutabilità.

    E' molto più semplice di quello che immagini

    (x i mod, ci saranno circa 3 o 4 parti per questo pattern, le posto qui o faccio 3 topic con i link di riferimento?) Mantengo uniti gli stessi argomenti o meglio se li spezzo?
    Questa volta, più che un voto.. è favoreggiamento.

  3. #3
    Quote Originariamente inviata da Al_katraz984 Visualizza il messaggio
    (x i mod, ci saranno circa 3 o 4 parti per questo pattern, le posto qui o faccio 3 topic con i link di riferimento?) Mantengo uniti gli stessi argomenti o meglio se li spezzo?
    io voto per un topic a pattern, non un topic per parte di pattern
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  4. #4
    Quote Originariamente inviata da Santino83_02 Visualizza il messaggio
    io voto per un topic a pattern, non un topic per parte di pattern
    ho visto che nella modalità avanzata posso mettere anche il titolo del post cosi segnalo le parti... Per me ok tutto su un topic, sentiamo il primo mod che passa cosa dice
    Questa volta, più che un voto.. è favoreggiamento.

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.