Ankündigung

Einklappen
Keine Ankündigung bisher.

Verständnis: Design Patterns, Factorys, Singletons u. byRef

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #46
    Ein Fehler vom Autor vielleicht?
    Papier ist geduldig.

    Kommentar


    • #47
      warum nicht gleich so?
      danke
      Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

      Kommentar


      • #48
        Zitat von HStev
        warum nicht gleich so?
        Die Frage kann ich nur zurückgeben.

        Kommentar


        • #49
          Ich hab mich in all meinen Fragen auf die statische Factory in einer abtracten Klasse bezogen ich kann gern alles mal in einen Post zitieren...

          aber darum gehts ja nicht wir haben das als Fehler im Buch abgetan und damit is gut
          Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

          Kommentar


          • #50
            Ja eben, und Dir wurde mehrfach gesagt "nicht statisch". Auch mit Begründungen.
            Warum Du Dich dann so an dem Buch festhälst, verstehe ich nicht. Entweder steht da eine gute Bgründung drin oder Du darfst ruhig mal Buchgeschriebenes anzweifeln.

            Kommentar


            • #51
              Es hat niemand bis gerade eben gesagt das es absolut unmöglich ist...bzw. es als Fehler bezeichnet und ich persöhnlich stecke noch nicht so tief in der Matierie um mir dabei auch nur zu 70% sicher sein zu können das es n Fehler ist
              Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

              Kommentar


              • #52
                Stehen in dem Buch denn keine Erläuterungen zum Vorgehen drin? Möglichst sprachfern, da es sich um Konzepte handelt, die nicht unbedingt an eine Sprache gebunden sind.
                Vielleicht auch Verweise auf verwandte Themen oder andere Quellen?
                Dann ist es zumindest nicht optimal zum Lernen.

                Kommentar


                • #53
                  Ich hab lieber sprachgebundene Sachen, ist für mich verständlicher. Die Design Patterns sind mir ja soweit klar nur das Beispiel für die Abstrakte Factory hatte mich verwirrt. Aber ich bin mir da drinn noch nicht sicher auch bei Abstrakten Klassen bin ich mir bwusst wofür die sind usw. aber ich arbeitete einfach zu wenig damit um zu wissen das da statische Methoden nicht möglich sind.
                  Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

                  Kommentar


                  • #54
                    Naja ich weiß noch nicht so recht, ich persöhnlich finde dafür kein richtiges Anwendungsbeispiel. Als Beispiel mal eine MySQL Klasse die ein Connection Object erwartet. Wäre das schon eine abstracte Factory?
                    Eigentlich doch nicht weil das Object doch schon vorher instanziert wird aber das ganze anders lösen wirds schon wieder unschön.

                    PHP-Code:
                    <?php
                    $con 
                    = new MySQLConnection('localhost''root''''test');
                    $Query1 = new MySQLQuery($con);
                    $Query2 = new MySQLQuery(new MySQLPeristentConnection('localhost''root''''test'));
                    $Query3 = new MySQLQuery(new MySQLConnection('throw_an_exception''root''''test'));

                    abstract class 
                    MySQLConnectionBase 
                    {
                        protected 
                    $connection    NULL;
                        
                        final public function 
                    getConnection()
                        {    
                            if (!
                    $this->connection)
                                throw new 
                    MySQLNotConnected();
                                
                            return 
                    $this->connection;
                        }
                        
                        final public function 
                    __construct($host$user$pass$database$flags NULL$port 3306
                        {
                            
                    $this->connect($host$user$pass$flags$port);
                            
                            
                    $this->setDatabase($database);
                        }
                        
                        abstract public function 
                    connect($host$user$pass$flags NULL$port 3306);
                        
                        public function 
                    setDatabase($dbname
                        {
                            if (!
                    $this->connection)
                                throw new 
                    MySQLNotConnected();
                                
                            if (!@
                    mysql_select_db($dbname$this->connection))
                                throw new 
                    MySQLCannotSelectDatabase();
                        }
                    }

                    class 
                    MySQLConnection extends MySQLConnectionBase
                    {
                        public function 
                    connect($host$user$pass$flags NULL$port 3306)
                        {
                            if (
                    $this->connection)
                                
                    $newConn FALSE;
                            else
                                
                    $newConn TRUE;
                                
                            
                    $this->connection = @mysql_connect $host.":".$port $user$pass$newConn$flags);
                            
                            if (!
                    $this->connection)
                                throw new 
                    MySQLNotConnected($this);
                        }
                    }

                    class 
                    MySQLPeristentConnection extends MySQLConnectionBase
                    {
                        public function 
                    connect($host$user$pass$flags NULL$port 3306)
                        {            
                            
                    $this->connection = @mysql_pconnect $host.":".$port $user$pass$flags);
                            
                            if (!
                    $this->connection)
                                throw new 
                    MySQLNotConnected($this);
                        }
                    }

                    class 
                    MySQLQuery
                    {
                        protected 
                    $CON     NULL;
                        
                        public function 
                    __construct(MySQLConnectionBase $connection)
                        {
                            
                    $this->CON $connection;
                        }
                        
                        public function 
                    execute($sql)
                        {
                        }
                        
                        public function 
                    prepare()
                        {
                        }
                    }

                    class 
                    MySQL_Exception_Base                         extends Exception 
                    {
                        public function 
                    __construct($param NULL
                        {
                            if (
                    is_array($param))
                            {
                                if (isset(
                    $param['error']) AND isset($param['errno']))
                                    
                    parent::__construct($param['error'], $param['errno']);
                                    
                                if (isset(
                    $param['error']) AND !isset($param['errno']));
                                    
                    parent::__construct($param['error']);
                                
                                if (!isset(
                    $param['error']) AND isset($param['errno']));
                                    
                    parent::__construct(''$param['errno']);
                            }
                            elseif (
                    $param == NULL)
                            {
                                
                    parent::__construct();
                            }
                              elseif (
                    $param instanceof MySQLConnectionBase)
                              {
                                
                    $error mysql_error($param->getConnection());
                                
                    $errno mysql_errno($param->getConnection());
                                    
                                
                    parent::__construct($error$errno);
                            }
                            else
                            {
                                
                    trigger_error("param must be an array or a MySQLConnectionBase instance"E_USER_ERROR);
                            }
                        }
                    }

                    class 
                    MySQLNotConnected                         extends MySQL_Exception_Base {}
                    class 
                    MySQLCannotSelectDatabase                 extends MySQL_Exception_Base {}
                    ?>
                    Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

                    Kommentar


                    • #55
                      $con = new MySQLConnection
                      Du triffst die Wahl, ob MySQLConnection oder MySQLPeristentConnection selbst fest eingebaut im Code an der Stelle, an der Du ein neues Objekt benötigst. Da ist also gar keine Fabrik im Spiel, ergo auch keine abstrakte Fabrik.

                      Kommentar


                      • #56
                        PHP-Code:
                        <?php
                        ...
                        $Query2 = new MySQLQuery(new MySQLPeristentConnection('localhost''root''''test'));
                        ...
                        ?>
                        PHP-Code:
                        <?php
                        ...
                        doSomething(new FooFactoryEven); 
                        ...
                        ?>
                        ja soweit klar aber in deinen Beispiel übergibst du doch auch new FooFactoryEven oder new FooFactoryOdd kommt das im Endeffekt nicht aufs selbe Ergbenis?
                        Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

                        Kommentar


                        • #57
                          Nein, das kommt nicht auf das selbe hinaus.
                          Du übergibst das fertige Arbeitsobjekt.
                          Ich übergebe etwas, dass die Objekte erst erstellt. Und dieses etwas nennt man Fabrik.
                          Wenn Du also das Fabrikmuster benutzen willst, musst Du eine Fabrik haben. Keine Factory kein Factory Pattern.

                          Kommentar


                          • #58
                            nein, für eine factory bräuchtest du auch eine factory-methode.
                            also:

                            PHP-Code:
                            class Factory {
                             ...
                            public function 
                            getConnection() {
                                   if( 
                            bla ) return new MySQLPeristentConnection('localhost''root''''test');
                                   if(
                            blu)    return new MySQLConnection('throw_an_exception''root''''test');
                              }
                             ......
                            }
                            // usage:
                            $factory = new Factory();
                            $con $factory -> getConnection();
                            $Query1 = new MySQLQuery($con);
                            $Query2 = new MySQLQuery($factory -> getConnection());
                            $Query3 = new MySQLQuery($factory -> getConnection()); 
                            kannst du jetzt den vorteil einer factory sehen?
                            im 'usage example' bekommst du jetzt praktisch auf die nase gebunden, was passiert:
                            die komplette entscheidung, welche verbindung denn jetzt überhaupt genommen wird, liegt in der factory, und dein 'benutzungscode' weiß gar nicht, was für ein objekt es verwendet und wird dadurch wiederverwendbar. du kannst, durch änderung des codes an einer einzigen stelle, eine klasse im kompletten system austauschen.

                            ... und verwendst statt dem schlüsselwort 'new' immer nur $factory -> getConnection() .

                            es geht wirklich nur darum, das schlüsselwort 'new' im code möglichst zu vermeiden - idealerweise taucht "new className" nur jeweils ein einziges mal im system auf.

                            ich wiederhole nochmal das prizip der 'factory', denn ohne das verständnis des factory-patterns versteht man die abstract factory eh auch nicht.


                            die 'abstract' factory löst das problem, gruppen von gemeinsam genutzten objekten zueinander passend zu erzeugen.

                            mehr dazu:

                            http://en.wikipedia.org/wiki/Abstract_factory_pattern

                            ... mit schönen beispielen.

                            Kommentar


                            • #59
                              In Bezug auf Abstracte Factory - Beispiel 5.3

                              Zitat von Bruchpilot
                              Ein Fehler vom Autor vielleicht?
                              Papier ist geduldig.
                              Ich hab grad einfach das Beispiel ausprobiert weil ich an einen Punkt angekommen bin wo ich genau das gebrauchen konnte und siehe da es funktioniert, wahrscheinlich macht PHP hier wieder ne Ausnahme die niemand aktzeptieren will
                              Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält.

                              Kommentar


                              • #60
                                Zwischen "möglich" und "richtig" liegen Welten.
                                Was Du beschreibst, geht auch in Java und C und und und.

                                Die Frage ist nur: Willst Du Abstrakte Fabriken (im gebräuchlichen Sinn) haben oder nicht?

                                wahrscheinlich macht PHP hier wieder ne Ausnahme die niemand aktzeptieren will
                                Nein, der Autor macht mit der Bezeichnung "abstrakte Fabrik" an der Stelle eine Ausnahme, die sonst niemand akzeptieren will.
                                Aber wenn diese Vorgehensweise Dein Problem löst, schön. Einfach nur im Hinterkopf behalten: "Das ist keine abstrakte Fabrik nach der gängigen Definition des Begriffs"

                                Kommentar

                                Lädt...
                                X