Ankündigung

Einklappen
Keine Ankündigung bisher.

"Singleton per ID" und neues Object

Einklappen

Neue Werbung 2019

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

  • "Singleton per ID" und neues Object

    Hallo,

    der Titel ist etwas verwirrend, es geht hier um 2 Konzepte die ich gerne besprechen möchte.

    Erstes Konzept ist der Singleton per ID

    Sagen wir ich habe eine Tabelle namens "server" und eine entsprechende Klasse namens Server. Da die Instanzen der klasse Server mit allen möglichen Daten über JOINS und auch teilweise SSH von anderen Servern Daten nachläd möchte ich natürlich nicht, dass ein und derselbe Server mehrmals Instanziert werden muss damit die selben Daten nicht wieder und wieder gelesen werden müssen. Das habe ich in etwa so gelöst:

    PHP-Code:
    class Server {
      private static 
    $instances = array();
      private function 
    __construct($id){
        
    //get all Data usw...
      
    }

      public function 
    byId($id){
        if(!
    array_key_exists($idself::$instances)){
          
    self::$instances[$id] = new self($id);
        }
        return 
    self::$instances[$id];
      }

    Die Frage ist nun, ob das ein praktisch sinnvolle Möglichkeit ist pro ID nur eine Instanz zuzulassen oder ob es noch andere/bessere Möglichkeiten gibt.



    Dann die Frage zu neu erstellten Einträgen in der Tabelle "Server".
    Natürlich hat der Controller in der Tabelle selbst nichts zusuchen daher habe ich mir die Erstellung eines Servers eigentlich in etwa so vorgestellt:
    PHP-Code:
    //Server bekommt eine neue staische Methode namens "new" wodurch eine neue "leere" Instanz erstellt wird.

    $server Server::new();
    $server->setIP("xyz");
    $server->setIrgendwas("ghj");
    $server->save(); 
    Wobei innerhalb der Methode "save" dann geprüft wird, ob es bereits eine ID gibt, wenn ja den alten Datensatz updaten, wenn nein einen neuen erstellen.

    So, das sind so meine beiden Gedanken zu den zwei Themen und die besten Möglichkeiten die mir dazu eingefallen sind, allerdings würde ich mich von euch jetzt gerne beschimpfen lassen wie dumm die beiden Ideen doch sind und wie ich es hätte besser machen können
    [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

  • #2
    Hallöchen,

    so wie sich das anhört, möchtest du einen Cache für deine Server-Objekte aufbauen. Die beste Stelle dafür ist der Ort, an dem diese Objekte für gewöhnlich erzeugt werden. Im Falle einer Repository-Klasse wäre diese bspw. der richtige Ort. Das könnte vielleicht so aussehen:
    PHP-Code:
    class ServerEntity{
        public 
    $id;
        public 
    $hostname;
    }

    interface 
    ICachedRepository{
        function 
    fromCache($id);
        function 
    cache(Entity $object);
    }

    class 
    ServerRepository implements ICachedRepository{
        
    /** Cache */
        
    private static $_cache = [];
        private function 
    fromCache($id){
            return isset(
    self::$_cache[$id]) ? self::$_cache[$id] : null;
        }
        private function 
    cache(ServerEntity $object){
            
    self::$_cache[$object->id] = $object;
        }

        
    /** Get */
        
    public function get($id){
            if(!
    $object $this->fromCache($id)){
                
    // SQL etc.
            
    }
            return 
    $object;
        }

        
    /** Store */
        
    public function store(ServerEntity $object){
            if(!
    $object->id){
                
    // insert
            
    } else{
                
    // update
            
    }
        }

    Verwenden würde man das dann üblicherweise so:
    PHP-Code:
    $servers = new ServerRepository();
    $server $servers->get(123);
    $server->hostname 'localhost';
    $servers->store($server); 
    Dabei sind alle Datenbankoperationen in die Repository-Klasse ausgelagert. Die Entität interessiert nur ihr Zustand und nicht wie sie diesen erlangt oder persistiert.

    Viele Grüße,
    lotti
    [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

    Kommentar


    • #3
      Das heißt, die Instanzierung wird sozusagen in eine (cached) Factory/Repository ausgelagert...

      Was ich etwas bei PHP vermisse ist das "package private" aus Java :/
      [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

      Kommentar


      • #4
        Dafür schreibst du bei PHP nicht alles 3-mal und die Syntax ist verständlich (siehe Arrays)
        [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

        Kommentar


        • #5
          Die Javasyntax von Arrays ist auch verständlich. Sie ist nur streng typisiert:
          Code:
          byte[] array = new byte[10] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
          Strenge Typisierung macht automatisch zusätzlichen Code erforderlich. Idr profitierst du davon aber.

          @LottiKarotti: Sollte CachedRepository nicht eher eine Spezialisierung von Repository sein? Wobei ich gerade nicht sicher bin, ob man so gegen LSP verstösst... Jedenfalls könnte man sowas auch via Proxy lösen.

          Kommentar


          • #6
            Naja, ich weis nicht ob das nicht sogar übertypisiert ist. Du schreibst ja auch nicht

            boolean abool = boolean true;

            Weshalb dann zwi Mal []?
            [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

            Kommentar


            • #7
              Zitat von ChristianK Beitrag anzeigen
              Weshalb dann zwi Mal []?
              Die Variable ist vom Typ Byte[] (=Byte unbestimmter Länge).
              Wert ist Byte[] der Länge 10. Hätte aber auch ein Abkömmling von Byte sein könnten. Stichwort Polymorphism.

              Kommentar


              • #8
                Hallöchen,

                Zitat von rkr Beitrag anzeigen
                @LottiKarotti: Sollte CachedRepository nicht eher eine Spezialisierung von Repository sein? Wobei ich gerade nicht sicher bin, ob man so gegen LSP verstösst... Jedenfalls könnte man sowas auch via Proxy lösen.
                wie ich bereits schrieb: "Das könnte vielleicht so aussehen: (...)". Viele Wege führen hier nach Rom. Wichtig war mir persönlich nur, dass die Entität nichts mehr damit zu tun hat und das Caching abgegeben wird. Meines Erachtens nach wäre hier sogar der Einsatz von Traits eine Überlegung wert. Eine weitere Schicht um Objekte zu cachen würde ich persönlich vermeiden wollen.

                Viele Grüße,
                lotti
                [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                Kommentar


                • #9
                  Zitat von rkr Beitrag anzeigen
                  Hätte Byte groß schreiben müssen.
                  Die Variable ist vom Typ Byte[] (=Byte unbestimmter Länge).
                  Wert ist Byte[] der Länge 10. Hätte aber auch ein Abkömmling von Byte sein könnten. Stichwort Polymorphism.
                  Und da beginnt man doch Java zu lieben. Du erstellst also etwas mit unbestimmter Länge, dass dann doch eine ganz klar definierte Länge hat ?

                  Das könnte man wirklich einfacher fassen:

                  Code:
                  byte[] aByteArray = {1, 2, 3};
                  [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                  Kommentar


                  • #10
                    Zitat von ChristianK Beitrag anzeigen
                    Und da beginnt man doch Java zu lieben. Du erstellst also etwas mit unbestimmter Länge, dass dann doch eine ganz klar definierte Länge hat ?
                    Es gibt nach wie vor eine Methode (.length), mit der du an die Länge kommst.

                    Das Beispiel anders ausgedrückt:

                    Code:
                    Interface[] array = new Implementation[10];
                    Code:
                    private void soSomething(Interface[] array) {
                    	array.length;
                    }

                    Kommentar


                    • #11
                      Genau genommen ist es in Java so, dass Arrays als Klassen umgesetzt sind weswegen nach dem Gleichheitszeichen ein "new classname[]" steht. Und genau deswegen kann man auch die Länge bestimmen, nicht wie bei C wo man sich selbst drum kümmern muss dass man nicht übers Array hinausließt/schreibt...
                      [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

                      Kommentar


                      • #12
                        Hallöchen,

                        Zitat von rkr Beitrag anzeigen
                        Es gibt nach wie vor eine Methode (.length), mit der du an die Länge kommst.
                        wenn ich ChristianK richtig verstanden habe, ging es ihm viel mehr darum dass die Syntax zum Definieren eines Arrays absoluter unfug ist:
                        Code:
                        byte[] array = new byte[10] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
                        Wieso muss hier explizit die Länge (byte[10]) angegeben werden, obwohl der darauf folgende Ausdruck doch eindeutig exakt 10 Elemente enthält. Einfacher wäre doch:

                        Code:
                        byte[] array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
                        Viele Grüße,
                        lotti
                        [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                        Kommentar


                        • #13
                          Zitat von lottikarotti Beitrag anzeigen
                          Code:
                          byte[] array = new byte[10] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
                          Wieso muss hier explizit die Länge (byte[10]) angegeben werden, obwohl der darauf folgende Ausdruck doch eindeutig exakt 10 Elemente enthält.
                          Die einzige Möglichkeit hier "sinnvoll" zu kürzen wäre:
                          Code:
                          byte[] array = new byte[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
                          Code:
                          Interface[] var = new Implementation[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
                          Oder wie es in C# geht:

                          Code:
                          var array = new byte[10] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

                          Kommentar


                          • #14
                            Hallöchen,

                            Zitat von flummbumm
                            Sorry, aber eine andere Sprache ohne die geringsten Grundlagenkenntnisse und dann noch auf Unwahrheiten basierend zu kritisieren, dafür fehlt mir das Verständnis.
                            ich wollte lediglich verdeutlichen was ChristianK mit seinem Post gemeint hat, da rkr irgendwie an ihm vorbeigeredet hat. Wie Java das in der Realität handhabt weiß ich nicht und will ich auch gar nicht wissen

                            Viele Grüße,
                            lotti
                            [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

                            Kommentar


                            • #15
                              Zitat von flummbumm
                              Sorry, aber eine andere Sprache ohne die geringsten Grundlagenkenntnisse und dann noch auf Unwahrheiten basierend zu kritisieren, dafür fehlt mir das Verständnis.

                              @rkr: .length ist keine Methode, sondern eine öffentliche Instanzvariable.
                              Nun mal langsam mit den jungen Pferden. Wenn man in Java ein Feld mit unbekannter Größe benötigt nutzt man auch keine herkömmlichen Arrays (in Java Array Objekte), sondern Listen. Das List Interface lässt da z.B. die Zuweisung einer ArrayList zu oder LinkedList. Das ganze wird da über Generics gehandhabt.

                              Wenn man in Java die größe eines Arrays oder List haben will nutzt man die Methode size().

                              Desweiteren ist length in Java keine Instanzvariable sondern eine Objektmethode.

                              Beispiel Java Code.
                              Code:
                              String myString = "Hallo Welt";
                              System.out.println(myString.length());
                              Aber hier über Java zu diskutieren ist sowieso Humbug, denn wir sind hier in einem PHP Forum.

                              Gruß der Litter
                              Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
                              [URL]http://www.lit-web.de[/URL]

                              Kommentar

                              Lädt...
                              X