PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP Entwicklung und Softwaredesign (http://www.selfphp.de/forum/forumdisplay.php?f=14)
-   -   Abhängigkeiten und Voraussetzungen speichern (best practice) (http://www.selfphp.de/forum/showthread.php?t=21425)

Indyk 06.05.2009 15:47:25

Abhängigkeiten und Voraussetzungen speichern (best practice)
 
Hallo Entwickler,

ich stehe bei einem Projekt vor der Problematik Abhängigkeiten/ Voraussetzungen zu speichern. Allerdings bin ich mir immer noch nicht ganz schlüssig wie es am besten ist und hoffe da auf eure Erfahrungen.

Die Abhängigkeiten können sehr variable sein, um x auszuführen muss y und z erfüllt sein
um x auszuführen muss x vorhanden sien und z einen bestimmten zustand haben und z darf nicht vorhanden sein.

Wie bilde ich das am besten ab?
Vorgeschlagen wurde mir bist jetzt eine
  • Matrix Tabelle (da bin ich noch am recherchieren und wäre über evtl. kurze erklärungen erfreut)
  • Views anlegen für jede "Regel" (AND x= ? AND y = ? etc..)
  • Eine Tabelle mit FS zu X und eine zeile pro Voraussetzung.
  • Voraussetzungen als Mehrdimensionales Array abbilden.
Wenn ihr noch mehr ideen habt, die vll. besser / einfacher / perfomanter sind bin ich sehr gespannt diese zu hören.

Falls meine Beschreibung noch Unklarheiten offen lässt werde ich diese bei nachfrage natürliche versuchen zu klären. Danke für eure Zeit.

cortex 07.05.2009 08:16:01

AW: Abhängigkeiten und Voraussetzungen speichern (best practice)
 
welche art von abhängigkeiten meinst du konkret - module einer anwendung, einzelne funktionen, daten... ?

cx

Indyk 07.05.2009 10:03:30

AW: Abhängigkeiten und Voraussetzungen speichern (best practice)
 
Hallo Cortex, danke für deine Antwort,

ich bin mir nicht sicher was für auswirkungen dieser unterschied hat, aber ich denke mit "funktionen" trifft es ganz gut.

Ich habe mir auch schon die Rechteverwaltung von ein paar (wenigen) CMS angeschaut allerdings konnte ich dort auch keine inspiration finden. Zumal es halt keine rechte und rollen zum vergeben sind, sondern vorrausetzungen die man erfüllen muss.

DokuLeseHemmung 07.05.2009 16:35:23

AW: Abhängigkeiten und Voraussetzungen speichern (best practice)
 
Ich weiß auch nicht genau was du meinst...
Sind das "statische" Abhängigkeiten?
Also z.B. zwischen Klassen, dann wäre evtl das Dependency Injection Pattern was für dich.

Oder eine Registry, wo du alle Abhängigkeiten sammelst.

cortex 13.05.2009 10:42:40

AW: Abhängigkeiten und Voraussetzungen speichern (best practice)
 
Indyk, hat sich das problem bereits erledigt / bist du zu einer lösung gekommen?

dies hier bekomme ich nicht ganz zusammen:

Zitat:

Zitat von Indyk (Beitrag 127434)
[...] ich denke mit "funktionen" trifft es ganz gut.

vs.

Zitat:

Zitat von Indyk (Beitrag 127434)
Ich habe mir auch schon die Rechteverwaltung von ein paar (wenigen) CMS angeschaut [...]

gehts also darum, dass bestimmte user(-gruppen) nur bestimmte befugnisse haben / nur bestimmte aufgaben erledigen dürfen?

cx

Indyk 13.05.2009 15:34:44

AW: Abhängigkeiten und Voraussetzungen speichern (best practice)
 
Ok mit meinem Versuch es Allgemein zu halten hat wohl den Erklärungen entgegengewirkt.

@cortex
hat sich noch nicht erledigt, musste mich aber auf meine Abschlussprüfung vorbereiten ( :

Ich versuch es also mit Beispielen.

Szenario 1
Ich befinde mich in einem shopsystem und möchte Ware x bestellen, das darf ich aber nur wenn Ware y sich in meinem Einkaufskorb befindet.

Ware y kann ich nur dann kaufen wenn ich schon 1 jahr Kunde bin und min 10 Artikel bestellt habe.

Szenario 2
Ich beifnde mich in eine Abrechungsoftware und rechne Positionen ab.

Position x darf nur 10mal im Monat abgerechnet werden
Position y darf nur abgerechnet werden wenn Position z abgerechnet wurde
Position a darf nur mit Position b abgerechnet werden.

Szenario 3
Browsergame

Skill X gibt es erst ab Level 7
Skill Y gibt es erst ab Skill A auf lvl2 und Skill C auf lvl3

Das sind nach meinem Verständnis Abhängigkeiten, und egal im welchen Szenario ich mich befinde müsste es doch eine Lösung geben diese abzubilden. Unabhängig davon ob es eine Artikel, eine Position oder ein Skill ist.

@cortex
um nochmal auf die Rechte zurück zu kommen, ich sah da eine Ähnlichkeit im verhalten. "User darf X nur ausführen wenn er in der Gruppe Y ist" ich dachte das wären auch Abhängigkeiten und ich könnte mir da was abschauen.

@DokuLeseHemmung
Danke für den Tipp mit dem pattern.

cortex 14.05.2009 07:40:25

AW: Abhängigkeiten und Voraussetzungen speichern (best practice)
 
Zitat:

Zitat von Indyk (Beitrag 127648)
hat sich noch nicht erledigt, musste mich aber auf meine Abschlussprüfung vorbereiten ( :

und...? ist es gut gelaufen?

Zitat:

Zitat von Indyk (Beitrag 127648)
Ich versuch es also mit Beispielen.

die beispiele sind irgendwo sehr unterschiedlich - möglicherweise ist für jede situation eine andere strategie angebracht. es wird sicher noch andere anwendungsdaten geben, die berücksichtigt werden müssen.

Zitat:

Zitat von Indyk (Beitrag 127426)
Matrix Tabelle (da bin ich noch am recherchieren und wäre über evtl. kurze erklärungen erfreut)

sicher ein gutes stichwort... eigentlich ein simples ding:

tabelle a: a.id | a.prop
tabelle b: b.id | b.prop

die matrix bringt beide tabellen zusammen:

tabelle m: m.id | a.id | b.id

das heisst, tabelle a und b dienen ausschliesslich der datenhaltung, tabelle m stellt verbindungen her - hier könnten deine abhängigkeiten gespeichert werden.

cx

DokuLeseHemmung 14.05.2009 08:04:39

AW: Abhängigkeiten und Voraussetzungen speichern (best practice)
 
Ich sehe keine Möglichkeit das zu vereinheitlichen. Zumindest nicht alles.


Warenkorb:
Fall 1: Eignet sich recht gut zur Vereinheillichung.
Ein Container mit Inhalt. Da kann man sich jetzt noch überlegen ob der Inhalt Wissen um den Container haben darf. Oder besser nicht.
Wenn nicht, könnte das so aussehen:
PHP-Code:

interface MyContainer
{
  function 
add(ContainerInhalt $element);
}
 
interface 
ContainerInhalt
{
  function 
needs(); // return Dependency;


Fall 2: Ist eine Abhängigkeit ohne Bezug zum aktuellen Container.
Dazu ist eine ganz andere Logik nötig.

Abrechungsoftware:
Kein Container weit und breit. Also evtl mit Warenkorb Fall2 vergleichbar.

Browsergame Rechtesystem
und Warenkorb Fall2
Scheinen sich sehr ähnlich, scheint aber auch nur.

Das Zend_Acl ist in der Hinsicht sehr schön gemacht. Da kann man sich was abschauen. Hat aber den heftigen Nachteil. Dass immer ALLES, also die gesammt Struktur geladen werden muß. Bei zunehmender Applikationskomplexität ein Klotz am Bein.

------------------------------------------------------------------

Schlußendlich:
Du versuchst die Applikationslogik aus der Applikation heraus zu abstrahieren. Das wird nicht gehen.
Die Niere macht Stoffwechsel.
Die Lunge macht Stoffwechsel.
Die Leber macht Stoffwechsel.
Ja, alle machen Stoffwechsel. Haben also Input und Output. Das wars aber auch schon mit den Gemeinsamkeiten.


-------------------------------------------

Zitat:

@DokuLeseHemmung
Danke für den Tipp mit dem pattern.
Da kann ich eine Lösung für php5.3 anbieten. Evtl. kannst du sie ja auf einen Teil der Probleme anwenden.

Eine Kombination aus Registry, Factory und Dependency Injection Pattern.
Besonderheit: Die Abhängigkeiten werden erst zur Laufzeit aufgelöst.



PHP-Code:

<?php
// DIContainer.php
class DIContainer
{
  protected 
$values = array();

  public function 
__construct($file)
  {
    include 
$file;
  }

  public function 
__set($id$value)
  {
    
$this->values[$id] = $value;
  }
  
  public function 
__get($id)
  {
    if (!isset(
$this->values[$id]))
      throw new 
InvalidArgumentException("Value '$id' is not defined.");
    
$val $this->values[$id];
    return 
$this->is_lambda($val)?$val($this):$val;
  }

  public function 
__call($id,Array $params=array())
  {
    
$val $this->__get($id);
    if (!
is_callable($val))
      throw new 
InvalidArgumentException("Value '$id' is not callable.");
    return 
call_user_func_array($val,$params);
  }
  
  public function 
__isset($id)
  {
      return isset(
$this->values[$id]);
  }

  public function 
__unset($id)
  {
      unset(
$this->values[$id]);
  }

  protected function 
asSingleton(Closure $factory)
  {
    return  function (
DIContainer $di) use ($factory)
            {
              static 
$object null;
              if (
is_null($object)) $object $factory($di);
              return 
$object;
            };
  }
  
  protected function 
asLambda(Closure $lambda)
  {
    return  function () use (
$lambda)
            {
              return 
$lambda;
            };
  }
  
  protected function 
is_lambda($var)
  {
    return 
is_object($var) && 'Closure' === get_class($var);
  }
}
?>

PHP-Code:

<?php
// DIConfig.php
$this->alphadsn 'mysql://user:test@localhost/test';

$this->db1 $this->asSingleton(
                                  function (
DIContainer $di)
                                  {
                                    return new 
PDO($di->alphadsn);
                                  }
                               );
                                  
                                  
                                  
$this->Multiplikation $this->asLambda(
                                          function (
$a,$b)
                                          {
                                            return 
$a*$b;
                                          }
                                       );


$this->transform 'nl2br';

                                  
?>

PHP-Code:

<?php
// index.php5_3
error_reporting(E_ALL E_STRICT);
ini_set('display_errors'TRUE);

require_once 
"./DIContainer.php";

$di = new DIContainer('./DIConfig.php');


echo 
'Meldung: '.$di->db1->getAttribute(PDO::ATTR_CONNECTION_STATUS).'<br>';


echo 
$di->Multiplikation(3,5).'<br>';

// Alternativ:
$mul $di->Multiplikation;
echo 
$mul(3,5).'<br>';


echo 
$di->transform("a\nb").'<br>';



Alle Zeitangaben in WEZ +2. Es ist jetzt 10:31:25 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.