Ankündigung

Einklappen
Keine Ankündigung bisher.

OOP Umsetzung

Einklappen

Neue Werbung 2019

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

  • OOP Umsetzung

    Hi Leute,

    ich habe jetzt mal nen Fall wo mir OOP sicher sehr nützlich sein kann, nur es hapert etwas an der Umsetzung, nicht von der Syntax her sondern von der Logik.

    Folgende situation:

    Code:
    - Klasse Buchungen
    - Klasse Arbeitszeiten (bzw. Abwesenheitszeiten)
    - Klasse Spesen
    Das ganze ist im Prinzip eine n:1:n Beziehung, in der o.g. Reihenfolge. Es geht im Prinzip um die Datenbank, kommt also jemand daher und bucht eine neue Tätigkeit, so muss der Mutterdatensatz erstellt, bzw geupdatet werden.

    Es muss also untereinander kommuniziert werden und das unter allen 3en. Wie setzte ich das am schlausten um? Oder denke ich in eine falsche Richtung?

    Gruß
    Cy


  • #2
    Hallo cycap,

    sind die von dir Beschriebenen Klassen echte Domain-Objekte? Worauf ich hinaus will ist einfach die Abgrenzung der Objekte. Oft kann / sollte man verschiedene gemeinsam genutzte Attribute auch in eigene (weitere) Objekte auslagern.

    Was die Umsetzung an sich angeht, muss die Datenschicht die in der Anwendung vorhandenen Domain-Objekten speichern / bearbeiten / löschen können. Weiterhin müssen die Beziehungen verarbeitet werdenb können. Dabei müssen Kompositionen entsprechend so aufgelöst werden können, dass die Datenkonsistenz sichergestellt ist. Das Ganze kann man abstrakt und generisch implementieren, oft reicht aber auch eine konkrete Umsetzung.

    Beschreib mir mal bitte deine Anforderungen genauer (kleines UML-Klassendiagramm), dann mache ich mir mal ein wenig mehr Gedanken.

    Da der Thread meiner Ansicht nach kein Anfänger-Thread ist, habe ich das mal nach Profi verschoben.
    Viele Grüße,
    Dr.E.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1. Think about software design before you start to write code!
    2. Discuss and review it together with experts!
    3. Choose good tools (-> Adventure PHP Framework (APF))!
    4. Write clean and reusable software only!
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Kommentar


    • #3
      Zitat von cycap Beitrag anzeigen
      Das ganze ist im Prinzip eine n:1:n Beziehung
      Es gibt nur eine Arbeitszeit? Was ist mit Pausen? Kategorien? Um welche Art von Buchungen geht es?

      Zitat von cycap Beitrag anzeigen
      kommt also jemand daher und bucht eine neue Tätigkeit, so muss der Mutterdatensatz erstellt, bzw geupdatet werden
      Welcher, wieso?

      Zitat von cycap Beitrag anzeigen
      Es muss also untereinander kommuniziert werden und das unter allen 3en.
      Eine Burger-King Krone und ne kleine Pommes fuer cycap!

      Beschreib doch mal ein bisschen genauer ..
      "Mein Name ist Lohse, ich kaufe hier ein."

      Kommentar


      • #4
        Eine Burger-King Krone und ne kleine Pommes fuer cycap!
        Das stand ja auch vorher unter Einsteiger und wer liest da schon gerne Romane? Und ich konnt ja nicht wissen das sich das zu einer größeren Diskussion entwickelt, aber umso besser wenn sich jetzt die Profis damit beschäftigen

        Bisher habe ich versucht das ganze möglichst einfach darzustellen, aber das funktioniert wohl nicht, also jetzt das ganze nochmal detailliert.

        Das Datenbanklayout existiert bereits (lässt sich auch ändern) und deshalb kann ich euch daran wohl gut zeigen wie es aussehen soll. Habs anfangs mit ner Berechnung versucht die in einem bestimmtem Zeitintervall durchläuft, ohne OOP.

        Ich habe jetzt aber folgende Gründe das ganze zu ändern und OOP zu nutzen:
        - ich will lieber immer aktuelle Daten haben statt auf die Berechnung warten zu müssen
        - die Berechnung bisher war unübersichtlich und fehleranfällig
        - die Berechnung im Zeitintervall kostet irgendwann ne Menge Performance

        Ich habe vor einiger Zeit mal eine Zeichnung angefertigt wie die Spesenberchenung funktioniert, siehe hier. Man beachte hier auch die wichtige 0-Uhr grenze.

        Die Tabellen workblocks (arbeitszeiten) und awayblocks (spesen) sind eigentlich nur Zusammenfassungen, die ich erstelle um den Export und die Berechnungen zu erleichtern. Die eigentlichen Daten sind also die Buchungen.

        Und nun zu den Tabellen (vereinfacht) mit Beispielen:

        Buchungen:
        Code:
        id| type  | id_user | time               | id_taetigkeit | id_kostenstelle | id_source
        --------------------------------------------------------------------------------------
        1 | work  | 1       |2008-01-01 08:00:00 |     12        |       1234      | 1
        2 | pause | 1       |2008-01-01 12:00:00 |    NULL       |       NULL      | 1 
        3 | work  | 1       |2008-01-01 13:00:00 |     12        |       1234      | 1 
        4 | end   | 1       |2008-01-01 17:00:00 |    NULL       |       NULL      | 1 
        5 | work  | 1       |2008-01-02 08:00:00 |     12        |       4430      | 1 
        6 | work  | 1       |2008-01-02 09:00:00 |     10        |       1234      | 1 
        7 | work  | 1       |2008-01-02 12:00:00 |     12        |       1234      | 1 
        8 | end   | 1       |2008-01-02 16:00:00 |    NULL       |       NULL      | 1
        Hierbei legt die id_source fest ob der daraus erstellte Block spesenberechtigt ist. Ob Arbeitsende = Übernachtung hab ich bisher daran fest gemacht ob bei einer 'end' Buchung eine gewisse Tätigkeit angegeben ist, würd sich aber auch genau so über einen neuen Type machen lassen. Aus Platzgründen hab ich jetzt mal id_workblock weg gelassen.

        Workblocks:
        Code:
        id| id_user | time_start          | time_end            | sum_pause | is_spesen
        1 |  1      | 2008-01-01 08:00:00 | 2008-01-01 17:00:00 | 60        | 1
        2 |  1      | 2008-01-02 08:00:00 | 2008-01-02 16:00:00 | 0         | 1
        Da hier jetzt keine Übernachtung, keine 0-Uhr Grenze und beide Datensäte Spesenberechtigt sind sieht die Spesentabelle praktisch genau so aus:

        Awayblocks:
        Code:
        id| id_user | time_start          | time_end            | id_land
        1 |  1      | 2008-01-01 08:00:00 | 2008-01-01 17:00:00 | 1
        2 |  1      | 2008-01-02 08:00:00 | 2008-01-02 16:00:00 | 2
        Das land wird hier nachträglich von den Mitarbeitern eingepflegt.


        Soo und wenn nun eine Buchung hinzukommt oder sich ändert, dann sollen auch die beiden Elterndatensätze geändert bzw. angelegt werden und genau das ist die Problemstelle. Ich hoffe Ihr versteht mein Problem jetzt etwas besser.

        Kommentar


        • #5
          Du solltest zunaechst vermeiden Informationen doppelt abzulegen; das wuerde dann zugleich dein "Elternproblem" loesen.

          Kannst du die "Buchungen" nicht aus der Tabelle entfernen, wenn du sie in die *blocks uebertragen hast? Ich wuerde Buchungen jetzt eher als Zustand ansehen, den du auch ueberwachen solltest, in dem du auf Konsistenz pruefst (darf END auf END folgen?). Wozu die Pause festhalten, sie ist implizit die Restzeit und erzeugt dir nur moegliche Fehler.

          Ich denke ich wuerde deine Tabelle "Buchungen" also eher als Zustandstabelle verwenden, wobei mir die Software je nach zuletzt hinzugefuegtem Token auch nur eine bestimmte Auswahl an nachfolgenden Token erlaubt (wie gesagt, END auf END macht keinen Sinn).
          Wenn du eine Transaktion abgeschlossen hast (START, PAUSE*, END) wird das ganze uebertragen und je nach dem ob du das moechtest, automatisch pro Tag aufgeteilt. Du kannst nun die Zeit aendern, solange es keine Ueberschneidung mit bisherigen Eintraegen gibt (BETWEEN), das sollte ohne grossen Aufwand moeglich sein.

          Warte aber besser ab, vielleicht gibts da erfahrenere Antworten.

          PS: Versuch dich mal fuer eine Sprache zu entscheiden, time, taetigkeit, end, .. Im Optimalfall heissen deine PHP-Variablen ja auch wie die MySQL-Spalten und dann hast du dir das Denglisch auch gleich noch ins PHP importiert. Nix schoen
          "Mein Name ist Lohse, ich kaufe hier ein."

          Kommentar


          • #6
            Die Buchungen brauche ich ja auch wenn ich zum Beispiel einen Report über die Arbeit zu einer gewissen Kostenstelle oder Tätigkeit haben will, ich kann ja schlecht für jede Tätigekit bzw. KST eine eigene Spalte in der Workblock Tabelle erstellen.

            Kommentar


            • #7
              Wenn ich eine Arbeitszeit eintrage, dann ja nur unter einer Kostenstelle, andernfalls splitte ich eben (manuell) auf, vormittags Photoshoplayouts schnibbeln, nachmittags CSS-Geraffel. Das Programm weiss ja nicht wieviel ich fuer was gebraucht habe.

              Somit kannst du einem workblock doch einfach eine Kostenstelle(n_id) zuordnen, oder nicht?!

              id | start | end | user_id | task_id | account_id | ..

              Jetzt hast du wann (start-end) wer (user_id) woran (task_id) wie (account_id) gearbeitet hat. Mehr brauchst du doch nicht fuer die Berechnung .

              Vielleicht schaust du dir aber auch mal DotProject an, ist ein Management Tool zur Projektverwaltung, mit Kunden, Mitarbeitern, Projekten, Tasks, ..
              "Mein Name ist Lohse, ich kaufe hier ein."

              Kommentar


              • #8
                Zitat von Chriz Beitrag anzeigen
                Wenn ich eine Arbeitszeit eintrage, dann ja nur unter einer Kostenstelle, andernfalls splitte ich eben (manuell) auf, vormittags Photoshoplayouts schnibbeln, nachmittags CSS-Geraffel. Das Programm weiss ja nicht wieviel ich fuer was gebraucht habe.
                Oh hab vergessen zu sagen: Die Buchungen werden ich echtzeit gemacht. Also ich trage nicht am Ende des Tages ein was ich wann gemacht habe, sondern ich "stempel" und gebe dabei Kostenstelle und Tätigkeit an. Das können bei manchen Mitarbeiten schon so 15 Buchungen am Tag werden. Falls sich verstempelt wurde oder etwas vergessen wurde, so lässt sich das nachträglich (mit Genehmigung) machen.

                Wenn ich dich richtig verstanden habe meinst du ich sollte die workblocks weglassen? Die endzeit einer Buchung (=startzeit der nächsten Buchung) speichere ich sowieso schon ab (habs oben nur weg gelassen).

                Nur bei deinem Vorschlag sehe ich das Problem wie ich das mit dem Arbeitsende machen soll, denn das ist ja ausschlaggebend für die Spesenberechnung.

                Kommentar


                • #9
                  Wenn ich mir die Posts so ansehe, machst du genau den Fehler, den ich durch meine Aussage

                  Beschreib mir mal bitte deine Anforderungen genauer (kleines UML-Klassendiagramm)
                  vermeiden wollte: kein sauberes Datenmodell. Du definierst wild Tabellen, die mit der eigentlichen Domain-Datenstruktur wenig zu tun haben und argumentierst damit. Mach dir Bitte Gedanken, welche Objekte deine Anwendung haben soll, dann können wir weiter reden.
                  Viele Grüße,
                  Dr.E.

                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                  1. Think about software design before you start to write code!
                  2. Discuss and review it together with experts!
                  3. Choose good tools (-> Adventure PHP Framework (APF))!
                  4. Write clean and reusable software only!
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                  Kommentar


                  • #10
                    Mach dir Bitte Gedanken, welche Objekte deine Anwendung haben soll, dann können wir weiter reden.
                    Das ist ja genau das Problem. Ich hab ein Konzept wie die Daten später aussehen sollen und was wann passieren soll weiss ich auch, nur wie ich das am schlausten umsetze eben nicht und das ist die Frage die ich in die Runde werfe. Gerne lass ich mich natürlich auch von dem ursprünglichen Konzept abbringen wenn ein anderes einfacher oder sinnvoller ist.

                    Kommentar


                    • #11
                      Naja, meine Aussage war eigentlich, dass du nicht genau weißt, welche Objekte deine Anwendung haben sollte. Mal doch bitte mal ein Klassendiagramm mit entsprechenden Beziehungen und kommentiere die Verwendung und die Bedeutung der Objekte. Du must noch ein wenig mehr abstrahieren, sonst werden die von Chriz geschilderten Probleme wirklich zu nicht ganz einfach lösbaren Themen.

                      Die technische Umsetzung an sich, ist IMHO trivial. Man suche sich einfach eine OR-Mapper-Schicht, die nicht nur Objekte OR-Mappen können, sondern auch im Stande sind Relationen abzubilden. Diesen konfiguriere und verwende man in der Datenschicht seiner Anwendung. Wenn du möchtest, kannst du die Objekte des OR-Mappers in deine eigenen Domain-Objekte mappen oder direkt auf diesen arbeiten.


                      Lass uns bitte erst die Anforderungen klären, für die technische Umsetzung habe ich da was für dich in peto...
                      Viele Grüße,
                      Dr.E.

                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      1. Think about software design before you start to write code!
                      2. Discuss and review it together with experts!
                      3. Choose good tools (-> Adventure PHP Framework (APF))!
                      4. Write clean and reusable software only!
                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                      Kommentar


                      • #12
                        Naja es ist halt das erste Problem was ich wirklich in OOP umzusetzen versuche. Zu deinem ersten Absatz: Naja ich dachte halt jede Tabelle ist eine Klasse, dann instanziere ich $buchungen = new buchungen(); und sage $buchungen->add(...); was dann je nach Buchung eine Methode der Elternklasse aufruft und so weiter...

                        Bei deinem zweiten Absatz versteh ich nur Bahnhof vielleicht doch zu den Anfängern zurück schieben?

                        Kommentar


                        • #13
                          Sorry, wenn ich hier mal meinen unqualifizierten Kommentar abgebe (Hoffe ich habe nichts überlesen): Von was für einer Art Anwendung reden wir hier eigentlich - von einer Art Verwaltung der unter der geposteten Datenbank-Struktur hinterlegten Daten? Oder von einer Art check-in/check-out Anwendung, mittels der EIN Nutzer seine persönlichen Vorgänge bucht?
                          In letzterem Fall beschränkt sich die Kiste doch einzig auf die Klasse 'Buchung', die ID, Land, aktuelle Kostenstelle etc. vorhält.

                          Die als 'Workblocks' und 'Awayblocks' beschriebenen Strukturen finde ich total unglücklich. Die würde ich allenfalls temporär für die Buchhaltung oder so erstellen.
                          --

                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                          --

                          Kommentar


                          • #14
                            Zitat von nikosch77-new Beitrag anzeigen
                            Sorry, wenn ich hier mal meinen unqualifizierten Kommentar abgebe (Hoffe ich habe nichts überlesen): Von was für einer Art Anwendung reden wir hier eigentlich - von einer Art Verwaltung der unter der geposteten Datenbank-Struktur hinterlegten Daten? Oder von einer Art check-in/check-out Anwendung, mittels der EIN Nutzer seine persönlichen Vorgänge bucht?
                            In letzterem Fall beschränkt sich die Kiste doch einzig auf die Klasse 'Buchung', die ID, Land, aktuelle Kostenstelle etc. vorhält.

                            Die als 'Workblocks' und 'Awayblocks' beschriebenen Strukturen finde ich total unglücklich. Die würde ich allenfalls temporär für die Buchhaltung oder so erstellen.
                            Den zweiten Fall.

                            Das workblocks und awayblocks verfahren ist eigentlich auch überflüssig, sind ja nur Zusammenfassungen. Allerdings brauche ich die für Stunden- / Spesenzettel (PDF), die sich die Mitarbeiter jederzeit angucken können. Die workblocks werden außerdem noch von der Programmierung meines Kollegen ausgelesen und weiterverarbeitet.

                            Schlag ein besseres verfahren vor, ich bin gern bereit alles umzubauen.

                            Kommentar


                            • #15
                              Möglicherweise wäre hier eine stored procedure oder eine Datenbanksicht besser geeignet, die die Daten bei Bedarf on-the-fly zusammenbaut.
                              --

                              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                              --

                              Kommentar

                              Lädt...
                              X