MB: Verschachtelte Aussagenlogik in Routinen realisieren

moin,

Ausgangssituation

Es geht mir konkret um Flags die zu Laufzeit gesammelt werden und am Ende vorhanden sind oder nicht. Die Flags lenken so durch Aussagenlogik in einer Kontrollstruktur das Programm.

Abstraktes Beispiel:

Eine Kontrollstruktur mit Metasyntaktischen Variablen dargestellt

if ( $foo and $bar or !( $tok and $qax ) ) {
  doSomeThing();
} else if ( !$foo or $bar and $tok and $qax ) ) {
  anOtherThing();
} else if ( ... ) {
  
}

Anwendungs Beispiel:

Ein anderes sehr konkretes jedoch vereinfachtes Beispiel mit einem SQLGenerator was einen Exception wirft.

$sql = new SQLGenerator();
$sql
  ->from ( new Table ( 'tableA', 'tA' ) )
  ->where( new Comparison ( '=',
    new Column ( 'tA', 'id' ),
    new Numeric ( 2 ) )
  ->getResult( 4, 3 );

Jede SQLGenerator-Methode (z.B. SQLGenerator::where usw.) wird beim Ausführen mit einem Flag gekennzeichnet. Wenn ein Flag beim Aufruf der Methode SQLGenerator::getResult, die das SQLGenerator-Programm beendet, fehlt, wird eine new Exception geworfen, da in diesem Beispiel die SELECT-Klausel in der Angabe nicht aufgerufen wurde.

Zur Frage

  • Gibt es einen besseren Weg zur Lösung als die Abarbeitung der Aussagenlogik in einer Kontrollstruktur (erstes Beispiel)?
  • Ist PHP für verschachtelte Aussagenlogik generell ungeeignet, sodass man Funktionale Programmiersprachen für dieses Problem heranzieht z.B. PHP BuiltIn Funktion sort() in C programmiert?

lgmb

--
Sprachstörung

akzeptierte Antworten

  1. Tach!

    • Gibt es einen besseren Weg zur Lösung als die Abarbeitung der Aussagenlogik in einer Kontrollstruktur (erstes Beispiel)?

    Das Problem löst sich von selbst, wenn man es von der Laufzeit zur Entwicklungszeit verlagert. Wenn bei Fluid Interfaces eine bestimmte Reihenfolge beachtet werden muss, dann sollte man gar nicht from ohne select aufrufen dürfen. Der SQLGenerator darf keine Methode from haben, sondern nur select, weil ein Statement zwingend damit anfangen muss (sowie insert, update, delete und was sonst noch so ein Statement einleiten kann). Das select liefert nicht this, sondern ein Objekt, dass nur from kennt, und was auch immer ein Select-Statement an zweiter Stelle haben darf. Die anderen Methoden liefern entsprechend andere Objekte zurück, mit ihren jeweils erlaubten Nachfolgern als Methoden.

    • Ist PHP für verschachtelte Aussagenlogik generell ungeeignet, sodass man Funktionale Programmiersprachen für dieses Problem heranzieht z.B. PHP BuiltIn Funktion sort() in C programmiert?

    PHP hat auch einige Array-Fuktionen, mit denen funktional programmiert werden kann, zum Beispiel die klassischen drei array_reduce(), array_filter(), array_map().

    dedlfix.

    1. moin,

      • Gibt es einen besseren Weg zur Lösung als die Abarbeitung der Aussagenlogik in einer Kontrollstruktur (erstes Beispiel)?

      Das Problem löst sich von selbst, wenn man es von der Laufzeit zur Entwicklungszeit verlagert. […].

      Ja das hat mir @Rolf B geschrieben was du bestätigt hast. Danke dafür. Du beziehst dich auf ein Anwendungsbeispiel was sich auf diese weise lösen lässt. Ich sprach von einem allgemeinen Problem im ersten abstrakten Beispiel in der Eingangsfrage.

      Ich hab ja ein ähnliches Design Pattern Fluent interface programmiert $query->select (...)->from(...)->where(...);. Aber es reicht nur bedingt meines erachtens. Ich verwende daher z.B. LogicContainer( int $logic, FilterInterface ...$filters ); in der WHERE-Klausel der Kette. So kann man verschachtelt arbeiten, meiner Ansicht nacht

      SELECT
        *
      FROM
        `table` AS `t`
      WHERE
      -- LogicContainer Beginn
        (
          `t`.`id` > 5 AND
          `t`.`name` LIKE "_foobar_" AND) OR
      -- LogicContainer Ende
        NOT;
      
      • Ist PHP für verschachtelte Aussagenlogik generell ungeeignet, sodass man Funktionale Programmiersprachen für dieses Problem heranzieht z.B. PHP BuiltIn Funktion sort() in C programmiert?

      PHP hat auch einige Array-Fuktionen, mit denen funktional programmiert werden kann, zum Beispiel die klassischen drei array_reduce(), array_filter(), array_map().

      Sry, entwerder verstehe ich die AW nicht oder ich habe zu undeutlich gefragt. Dafür sry. Ich wollte konkret wissen ob verschachtelte Aussagenlogik - wahrscheinlich im KI-Umfang - besser von Funktionalen Sprachen gelöst werden soll. Dann habe ich nur ein Beispiel genannt und du hast bessere Beispiele mir unterbreitet. Das ist aber nicht die Antwort auf meine Frage, die ich gestellt habe.

      lgmb

      --
      Sprachstörung
      1. Hallo MB,

        um ein SQL Statement zu validieren brauchst Du keine KI.

        Wenn Du es unbedingt mit Flags lösen willst - dann würde ich die Plausibilisierungslogik hart codieren. SQL ist SQL, und die einzuhaltenden Bedingungen musst Du nicht abstrakt durch einen Logikbaum darstellen.

        Ich glaube aber nicht, dass Flags hier sinnvoll sind. Eher ein Syntaxbaum und eine Prefix-Traversierung des Baumes (zuerst der Knoten, dann die Kinder). Das geht schick rekursiv, und das kann PHP.

        • Ein Statement braucht genau ein SELECT, genau ein FROM, höchstens ein WHERE, höchstens ein GROUP, höchstens ein HAVING, höchstens ein ORDER BY.

        Diese Abfrage muss dein Root-Objekt durchführen. Die SELECT, FROM, WHERE, GROUP, HAVING und ORDER Klauseln sind eigene Objekte, gelle, und die sollen sich bitte schön selbst prüfen. D.h. nachdem das Root-Objekt geprüft hat, was es kann, fragt es seine Kinder, ob sie in Ordnung sind.

        Ein SELECT ist in Ordnung wenn es 1-N Spalten hat. Und den Rest überlässt es seinen Spalten.

        Eine Spalte ist in Ordnung, wenn...

        Du verstehst die Idee?

        Rolf

        --
        sumpsi - posui - obstruxi
        1. moin,

          um ein SQL Statement zu validieren brauchst Du keine KI.

          habe ich @dedlfix schon geantwortet.

          Wenn Du es unbedingt mit Flags lösen willst - dann würde ich die Plausibilisierungslogik hart codieren.

          Is schon drin. Mir war leider die Bezeichnung die man verwendet nicht mehr geläufig 😕.

          SQL ist SQL, und die einzuhaltenden Bedingungen musst Du nicht abstrakt durch einen Logikbaum darstellen.

          Ich glaube das habe ich annhähert schon gemacht.

          Ich glaube aber nicht, dass Flags hier sinnvoll sind. Eher ein Syntaxbaum und eine Prefix-Traversierung des Baumes (zuerst der Knoten, dann die Kinder). Das geht schick rekursiv, und das kann PHP.

          So eine art "Composit DesignPattern" was das die Objekte in der Baumstruktur mit Knoten und Blättern behandelt? Sorry ich nahm es über udemy.com durch undich denke immer noch an _Design Patterns.

          Diese Abfrage muss dein Root-Objekt durchführen.

          schon erledigt

          Die SELECT, FROM, WHERE, GROUP, HAVING und ORDER Klauseln sind eigene Objekte, gelle, und die sollen sich bitte schön selbst prüfen.

          auch das schon erledigt

          D.h. nachdem das Root-Objekt geprüft hat, was es kann, fragt es seine Kinder, ob sie in Ordnung sind.

          nur umgekehrt

          Ein SELECT ist in Ordnung wenn es 1-N Spalten hat. Und den Rest überlässt es seinen Spalten.

          Eine Spalte ist in Ordnung, wenn...

          Du verstehst die Idee?

          Sryx ich steh auf m schlauch 😕.

          lgmb

          --
          Sprachstörung
          1. Hallo MB,

            keine Ahnung was udemy ist - die sagen mir grad nur "We’re having trouble reaching our servers."...

            Ich weiß nicht wie ich das anders erklären soll. Delegiere Verantwortung dahin, wohin sie gehört. Versuch die Prüfungen so zu bauen wie die Bundesrepublik Deutschland. Jede Ebene kümmert sich nur um ihre Angelegenheiten und überlässt das, was auf tieferer Ebene geregelt werden kann, möglichst der tieferen Ebene. Der Bund regelt nur Länderübergreifende Themen. Ein Land regeln nur Dinge von landesweiter Bedeutung. Die Kreise regeln ihre Angelegenheiten, und die Städte auch. Der Bund sollte nicht versuchen, Vorgaben für den Bau einer Kreisstraße zu machen.

            Oder: eine Plausi im Basisgenerator sollte nicht die Einhaltung der Regeln für eine SELECT-Spalte prüfen, sondern das Objekt, das die Spalte repräsentiert, ist für diese Prüfung selbst zuständig.

            Rolf

            --
            sumpsi - posui - obstruxi
            1. moin,

              keine Ahnung was udemy ist - die sagen mir grad nur "We’re having trouble reaching our servers."...

              Eine Lern Plattform aller Art. Man hat Kurse die man belegen kann, mit einem realen persönlichen Tutor indem einem Medien verfügung gestellten werden. So bieten man einem Verstand der eine sehr eingeschränkten Kommunikationskanal hat - wie der meine - eine changse, sich durch diese Lehrinhalte auditiv, visuell, an die person anpassbar weiter zu bilden 😀. Ein sehr gute weg für mich persönlich.

              Ich weiß nicht wie ich das anders erklären soll.

              Ich halte mich an die Regeln, die die ihr mir sehr plausiebel erklärt habt und du hier explizit auch nochmal.

              lgmb

              --
              Sprachstörung
      2. Tach!

        • Gibt es einen besseren Weg zur Lösung als die Abarbeitung der Aussagenlogik in einer Kontrollstruktur (erstes Beispiel)?

        Das Problem löst sich von selbst, wenn man es von der Laufzeit zur Entwicklungszeit verlagert. […].

        Ja das hat mir @Rolf B geschrieben was du bestätigt hast. Danke dafür. Du beziehst dich auf ein Anwendungsbeispiel was sich auf diese weise lösen lässt. Ich sprach von einem allgemeinen Problem im ersten abstrakten Beispiel in der Eingangsfrage.

        Ja, das war auch eine allgemeine Antwort. Wenn die Reihenfolge X->A()->B()->C() eingehalten werden muss, dann darf X keine Methode B() oder C() enthalten. X darf nur A() haben, und A() muss ein Objekt zurückgeben, dass B() aber nicht A() oder C() hat. Ebenso darf das von B() zurückgegebene Objekt kein A() oder B() sondern nur C() haben. Wenn du das so organisierst, sorgst schon die Autovervollständigung dafür, dass der Programmierer es in der richtigen Reihenfolge aufruft. Und wenn er es nicht tut, dann der Parser.

        Und wenn A() optional ist, muss man das entsprechend kombinieren. Dann muss X ein Objekt mit A() und B() sein, und A() muss ein Objekt mit nur B() liefern.

        Für SELECT könntest du die Verkettung umsortieren. Die Feldliste darf erst zwischen Group By und Having kommen. Sie steht zwar am Anfang nach dem SELECT, wird aber erst zwischen Group By und Having berechnet. Das ist logischer und sicher auch einfacher zu implementieren.

        • Ist PHP für verschachtelte Aussagenlogik generell ungeeignet, sodass man Funktionale Programmiersprachen für dieses Problem heranzieht z.B. PHP BuiltIn Funktion sort() in C programmiert?

        PHP hat auch einige Array-Fuktionen, mit denen funktional programmiert werden kann, zum Beispiel die klassischen drei array_reduce(), array_filter(), array_map().

        Sry, entwerder verstehe ich die AW nicht oder ich habe zu undeutlich gefragt. Dafür sry. Ich wollte konkret wissen ob verschachtelte Aussagenlogik - wahrscheinlich im KI-Umfang - besser von Funktionalen Sprachen gelöst werden soll. Dann habe ich nur ein Beispiel genannt und du hast bessere Beispiele mir unterbreitet. Das ist aber nicht die Antwort auf meine Frage, die ich gestellt habe.

        Du hast nach PHPs Möglichkeiten gefragt. Ja, in PHP kann man Funktionen wie Variablen übergeben, also ist funktionale Programmierung möglich. KI ist was anderes, ein selbstlernendes System, das löst dein Problem nicht. Was als SQL-Statement formuliert werden darf, folgt bekannten Regeln. Da muss keine KI mehr herausfinden, was zur Lösung führt und was nicht.

        dedlfix.

        1. moin,

          Sorry, das ich mich so lange vom Dialog entfernt habe.

          Ja, das war auch eine allgemeine Antwort.

          ok, aufräumen des Missverständnisses

          Wenn die Reihenfolge X->A()->B()->C() eingehalten werden muss […].

          Das tut es nicht. Es kann auch X->C()->A() gefolgt von X->B()mehrere Codezeilen getrennt sein. Das ar mir wichtig es zu separieren 😀.

          Und wenn A() optional ist […]

          Das habe ich mit "Flags" realisiert. @Rolf B sprach von plausibilietät woran ich mich auch wieder in einem anderen Kontext erinnere.

          Für SELECT könntest du die Verkettung umsortieren. Die Feldliste darf erst zwischen Group By und Having kommen. Sie steht zwar am Anfang nach dem SELECT, wird aber erst zwischen Group By und Having berechnet. Das ist logischer und sicher auch einfacher zu implementieren.

          Ich hab mir echt den Kopf zerbrochen, um dann diese Option auszuschließen, obwohl es sehr viel eleganter ist wie du vorgeschlagen hast. Es gebt mir wirklich um die Trennung des Aufbaus im Code.

          $query = new SQLGenerator ( /* ... */ );
          
          $query->where( /* ... */ );
          
          // Code
          
          $query->from( /* ... */ );
          
          // Code
          
          $query
            ->order( /* ... */ )
            ->select( /* ... */ );
          
          // Code
          
          $query->getResult( /* ... */ );
          
          

          Du hast nach PHPs Möglichkeiten gefragt. Ja, in PHP kann man Funktionen wie Variablen übergeben, also ist funktionale Programmierung möglich. KI ist was anderes, ein selbstlernendes System, das löst dein Problem nicht. […]

          Ich nannte KI bezogen auf die Komplexität meiner Algorithmen die es nur anährerd hat - so dachte ich. Sorry wenns nicht klar geworden ist.

          lgmb

          --
          Sprachstörung
          1. Tach!

            Wenn die Reihenfolge X->A()->B()->C() eingehalten werden muss […].

            Das tut es nicht. Es kann auch X->C()->A() gefolgt von X->B()mehrere Codezeilen getrennt sein. Das ar mir wichtig es zu separieren 😀.

            Ist es wirklich notwendig, dass der Verwender diese Freiheit bekommt? Ist das auch logisch nachvollziehbar? Es ist zum Beispiel unsinnig, sofort mit einer Where-Klausel oder einem Order-By anfangen zu können, ohne dass man eine Datenquelle angegeben hat. Die Datenquelle nach den Anweisungen zum Einschränken derselben oder der Sortieroption notieren zu können ist auch nicht sonderlich sinnvoll.

            dedlfix.

            1. moin,

              Wenn die Reihenfolge X->A()->B()->C() eingehalten werden muss […].

              Das tut es nicht. Es kann auch X->C()->A() gefolgt von X->B()mehrere Codezeilen getrennt sein. Das ar mir wichtig es zu separieren 😀.

              Ist es wirklich notwendig, dass der Verwender diese Freiheit bekommt? […] Die Datenquelle nach den Anweisungen zum Einschränken derselben oder der Sortieroption notieren zu können ist auch nicht sonderlich sinnvoll.

              Da gebe ich dir schon Recht. Mir ist es nur wichtig das…

              $select = "SELECT {$column}";
              $from = "FROM {$table}";
              $where = "WHRER {$column} = {$id}";
              $order = "ORDER BY {$column} ASC";
              
              $query = $select . '\r\n' . $from . '\r\n' . $where . '\r\n' . $order . ';';
              

              …auch so in meinem Beispiel dargestellt des vergangenen Beitrag ausdrücken werden kann. Eine Überlegung ist es defiknitiv wert dein Einwand aufzugreifen.

              lgmb

              --
              Sprachstörung