Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56

    Evitare cicli infiniti con l'incapsulamento

    Se ad esempio devo istanziare Titanic e Leonardo Di Caprio, e gli attributi $protagonist e $best_film, sono rispettivamente delle istanze di Actor e Film, in fase di creazione degli oggetti mi trovo in un loop infinito.

    C'è un pattern per evitare queste situazioni?

    Codice PHP:
    class Film
    {
      private 
    $title;
      private 
    $year;
      private 
    $protagonist;
    }

    class 
    Actor
    {
      private 
    $name;
      private 
    $surname;
      private 
    $best_film;

    Ultima modifica di iJoker; 27-01-2014 a 02:40

  2. #2
    Di cosa stiamo parlando? Quale loop
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    per motivi di sintesi avevo tralasciato le funzioni di creazione delle istanze, adesso le ho messe.

    Codice PHP:
    class Film
    {
      private 
    $title;
      private 
    $year;
      private 
    $protagonist// ISTANZA DELLA CLASSE ACTOR

      
    public static function createById($id)
      {
        
    $film = new Film();
        
    $result mysql_query("SELECT * FROM film WHERE id=".$id;);
        
    $row mysql_fetch_row($result)
        
    $film->title $row['title'];
        
    $film->year $row['year'];
        
    $this->protagonist Actor::createById($row['id_protagonist']);
        return 
    $film;
      }
    }

    class 
    Actor
    {
      private 
    $name;
      private 
    $surname;
      private 
    $best_film// ISTANZA DELLA CLASSE FILM

      
    public static function createById($id)
      {
        
    $actor = new Actor();
        
    $result mysql_query("SELECT * FROM actor WHERE id=".$id;);
        
    $row mysql_fetch_row($result)
        
    $actor->name $row['name'];
        
    $actor->surname $row['surname'];
        
    $actor->best_film Film::createById($row['id_best_film']);
        return 
    $actor;
      }

    Ultima modifica di iJoker; 27-01-2014 a 02:51

  4. #4
    Se fai in modo che Actor e Film si ricordino le istanze che creano, allora puoi interrompere la ricorsione, altrimenti non puoi o altrimenti togli il load dell'utente da Film
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    Se io invece nel film salvo solamente l'id dell'attore può essere una buona soluzione?
    In questo modo però non ci sarebbero oggetti incapsulati in altri oggetti.

  6. #6
    Quote Originariamente inviata da iJoker Visualizza il messaggio
    Se io invece nel film salvo solamente l'id dell'attore può essere una buona soluzione?
    In questo modo però non ci sarebbero oggetti incapsulati in altri oggetti.
    Potresti usare un Laxy Load, ovvero carichi l'utente in Film solo quando in film richiami il metodo getActor, viceversa in Actor. Cmq te lo dico pure a te: se stai facendo questa cosa per studio, va bene (anche se ad occhio dovresti studiare un bel pò di teoria), se stai facendo un qualcosa di lavoro evita e usa una framework già pronto per gestire la persistenza (Doctrine? chi ha detto Doctrine? io dico Doctrine ). Sopratutto quei metodi statici, per me, sono una pugnalata al cuore con tanto di ravanata di coltello, usa classi repository esterne per istanziare oggetti Film e Actor, che risulteranno semplici oggetti con solo getter e setter
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    Quote Originariamente inviata da Santino83_02 Visualizza il messaggio
    Potresti usare un Laxy Load, ovvero carichi l'utente in Film solo quando in film richiami il metodo getActor, viceversa in Actor. Cmq te lo dico pure a te: se stai facendo questa cosa per studio, va bene (anche se ad occhio dovresti studiare un bel pò di teoria), se stai facendo un qualcosa di lavoro evita e usa una framework già pronto per gestire la persistenza (Doctrine? chi ha detto Doctrine? io dico Doctrine ). Sopratutto quei metodi statici, per me, sono una pugnalata al cuore con tanto di ravanata di coltello, usa classi repository esterne per istanziare oggetti Film e Actor, che risulteranno semplici oggetti con solo getter e setter
    Questa cosa la sto facendo per studio/lavoro, inoltre sto leggendo il libro di Craig Larman che mi consigliasti tu per PM un po' di tempo fa e sto cercando di capire i vari patterns. Comunque mi piacerebbe provare Doctrine (sperando che il suo uso non pregiudichi l'apprendimento dei patterns) ma non ho ben capito come si fa ad installarlo.

  8. #8
    ciao!
    mi intrometto un attimo perchè vedo che spesso citi Doctrine.
    nello specifico parli di Database Abstraction Layer o Object Relational Mapper?

  9. #9
    Quote Originariamente inviata da fermat Visualizza il messaggio
    ciao!
    mi intrometto un attimo perchè vedo che spesso citi Doctrine.
    nello specifico parli di Database Abstraction Layer o Object Relational Mapper?
    Doctrine (propel non lo conosco ma penso che sia lo stesso) fornisce api per entrambi i livelli, quindi dipende che ti serve. In alcuni progetti uso direttamente l'orm, in qualcosa di piu semplice mi è bastato solo il dbal. nel caso specifico jocker sta facendo un orm
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  10. #10
    Quote Originariamente inviata da Santino83_02 Visualizza il messaggio
    Doctrine (propel non lo conosco ma penso che sia lo stesso) fornisce api per entrambi i livelli, quindi dipende che ti serve. In alcuni progetti uso direttamente l'orm, in qualcosa di piu semplice mi è bastato solo il dbal. nel caso specifico jocker sta facendo un orm
    ok grazie per il chiarimento!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.