Antwort
 
Themen-Optionen Thema durchsuchen
Alt 20.04.2007, 19:22 Nach oben    #1
Christian Schuhmann
 
Benutzerbild von bobby
 
Registriert seit: 09.03.2007
Ort: Nürnberg
Beiträge: 66
Standard Konfigurationsklasse/schnittstelle

Hallo,

da ich gerade an einer neuen Version meines Frameworks sitze möchte ich gleich einige Änderungen einbauen, vorallem die Konfigklasse.

Bisher hat der Zugriff etwa so funktioniert
PHP-Code:
$config->load('meineconfig.php''main'); //Laden der Configdatei
$config->PHP true//Laden der Unterklasse "Config_PHP"
$config->get('database''main')->get('drivers')->fetch('mysql'); 
Nun finde ich die Zeile "$config->PHP = true" nicht sehr schön, da mann ja den Konfigurationstyp direkt beim Laden angeben kann.

PHP-Code:
$config->load('meineconfig.php''main''PHP'); 
Soweit so gut. Aber intern werden in der Klasse "Config" alle Aufrufe per "__call" an die entsprechende Unterklasse weitergeleitet, nun wird anhand des Indexes (hier "main") die Unterklasse ermittelt.

Ich müsste mich also auf eine bestimmte Stelle verlassen, auf der ich im Argumentenarray den Index ('main') finden kann - das möchte ich aber vermeiden.

Wie würdet ihr eine Schnittstelle für verschiedene Konfigtypen erstellen?

bobby.
bobby ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.04.2007, 21:06 Nach oben    #2
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

Ne, habe ich nicht so ganz verstanden. Was genau ist das Problem? Was stellt denn bislang das $config->PHP = true; dar? Dass die Daten in einer PHP-Datei als Array hinterlegt sind oder was?

Schau dir eventuell mal das Prinzip von Zend_Config an. Vielleicht hilft es ...
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 20.04.2007, 23:09 Nach oben    #3
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

Ich über gebe meinem Config-Objekt nur den Pfad, in dem die Konfigurationsdateien liegen (genauer gesagt mehrere Verzeichnisse, denn es gibt ein globales Config-Verzeichnis und eines je Site). Per mixed Config::get(string section, [string varname]) greife ich auf Werte zu, wobei alle Werte einer "section" in einer Datei im besagten Verzeichnis liegen. Wurden die Werte einer section noch nicht geladen, schaue ich halt nach einer Datei im Verzeichnis und benutze je nach Dateiendung eine bestimmte Methode, die Datei einzulesen. Da das im Moment ausschließlich PHP-Dateien sind, war das eigentlich unnötig, das so umzusetzen (!= YAGNI), aber … natürlich ließe sich hier auch gleich je "section" oder eben Konfigurationsdatei eine Klasse vom entsprechenden Typ bauen, die dann im zentralen Config-Objekt gespeichert bleibt.

Nochmal kurz und knapp:
Warum nicht anhand der Dateiendung entscheiden, welche Klasse eine Quelle auslesen kann?

Basti
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.04.2007, 11:24 Nach oben    #4
Christian Schuhmann
 
Benutzerbild von bobby
 
Registriert seit: 09.03.2007
Ort: Nürnberg
Beiträge: 66
Standard

Hi,

Zitat:
Zitat von Basti Beitrag anzeigen
Nochmal kurz und knapp:
Warum nicht anhand der Dateiendung entscheiden, welche Klasse eine Quelle auslesen kann?

Basti
Genau das habe ich mir auch gedacht:

PHP-Code:
$config->load("configuration.php""system"); 
Die Datei "configuration.php" ist nun an den Index "system" gebunden und der Index ist an die Klasse "Config_PHP" gebunden.

D.h. jetzt greife ich mit
PHP-Code:
$config->get("database""system")->fetch("host"); 
über die Klasse "Config_PHP" auf die Datei "configuration.php" zu. Bis hier ist es kein Problem.

Nur das ich (fast) alle Aufrufe der Klasse Config per __call an die jeweilige Unterklasse weiterleite. Es wird anhand des Indexs (z.B.: system) entschieden, an welche Unterklasse es weitergeleitet wird und da liegt das Problem. In der Methode __call stehen mir alle übergebenen Argumente nur als Array zur verfügung, woher weiß ich nun welcher davon mein Index ist, denn ich dann für die Weiterleitung benötige?

Ich glaube der Weg über __call ist nicht der Beste, aber mir will gerade auch kein passendes Pattern dafür einfallen.

@Ben: "$config->PHP = true;" war/ist dafür da der Klasse Config mitzuteilen, dass alle folgenden Aufrufe über die Klasse Config_PHP gehen sollen. Das Prinzip von Zend_Config ist nicht ganz das, was ich suche. Ich möchte das alles (zumindest nach außenhin) über die Klasse Config läuft.

bobby
bobby ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.04.2007, 19:42 Nach oben    #5
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

Wie viele öffentliche Methoden hast du denn da? Mir fällt da nicht mehr ein, als get() und set(). In jedem Fall aber besitzen ja alle konkteren Config-Klassen die gleiche Schnittstelle, denn der Client von Config weiß ja nicht, welche konkrete Klasse die Daten ausliest. Sieht so aus, als läge da dein Problem.

Folglich: gemeinsames Interface für alle Klassen definieren, die Config-Daten aus den jeweiligen Quellen auslesen und verändern können (Config_PHP, Config_XML etc.). Somit greifst du aus Config heraus immer nur auf dieses Interface zu und brauchst garnicht zu wissen, was für eine Klasse das denn nun konkret ist (außer beim Bauen eben).

Zeig doch mal dein UML-Diagramm oder die eben die Interfaces der einzelnen Klassen.

Basti
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2007, 19:31 Nach oben    #6
Christian Schuhmann
 
Benutzerbild von bobby
 
Registriert seit: 09.03.2007
Ort: Nürnberg
Beiträge: 66
Standard

Hi Basti,

mit UML kann ich leider derzeit nicht dienen, da ich bisher noch keinen schönen UML-Modeller unter Linux gefunden habe.

Aber die Klassengerüste sehen ungefähr so aus:

PHP-Code:
interface PF_Config_Interface
{
    public function 
__construct();
    public function 
load($filename$index);
    public function 
get($item$index);
    public function 
fetch($item$index);
}

class 
PF_Config
{
    public function 
__construct()
    {

    }

    public function 
load($filename$index)
    {

    }

    public function 
__call($method$arguments)
    {

    }
}

class 
PF_Config_PHP implements PF_Config_Interface
{
    public function 
__construct()
    {

    }

    public function 
load($filename$index)
    {

    }

    public function 
get($item$index)
    {

    }

    public function 
fetch($item$index)
    {

    }    

Normalerweise lösen sich solche Problemchen immer während ich dusche - aber diesmal stehe ich anscheinend auf dem Schlauch.

bobby.
bobby ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2007, 19:40 Nach oben    #7
Blubb... öfz
 
Benutzerbild von ljungi
 
Registriert seit: 16.03.2006
Ort: Berlin
Beiträge: 419
Standard

Zitat:
Zitat von bobby Beitrag anzeigen
Hi Basti,

mit UML kann ich leider derzeit nicht dienen, da ich bisher noch keinen schönen UML-Modeller unter Linux gefunden habe.
Argouml ist toll
__________________
Vive la France! Welcome to Sarkoworld...
ljungi ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2007, 20:24 Nach oben    #8
Gabriel
 
Registriert seit: 27.09.2006
Ort: Radebeul
Beiträge: 433
Standard

Heiho
ich beschäftige mich zur zeit mit den Grundlagen von OOP
aber alle Tut's die ich so gefunden habe und als brauchbar für mich gewertet habe sind noch auf PHP4 basis das heißt es gibt noch keine public protected und so weiter sachen
folglich hab ich keine ahnung wie das funzt
hat jmd ein guten link dazu?

grüße
Gabriel

//Sorry für Offtopic Post aber ich dachte es passt einigermasen zum Thema und wollt kein eigenen Thread aufmachen!
kampfgnom ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2007, 20:42 Nach oben    #9
Jonas
 
Benutzerbild von Artemis
 
Registriert seit: 03.06.2006
Beiträge: 244
Standard

http://www.professionelle-softwareen...erste_auflage/
__________________
Applikations-Programmierung:
BlitzMax, BlitzPlus

Webentwicklung:
PHP, (X)HTML, CSS, JavaScript, MySQL


Artemis ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.04.2007, 10:44 Nach oben    #10
Benutzer
 
Benutzerbild von xabbuh
 
Registriert seit: 03.12.2005
Ort: Osnabrück
Beiträge: 76
Standard

Zitat:
Zitat von ljungi Beitrag anzeigen
mit UML kann ich leider derzeit nicht dienen, da ich bisher noch keinen schönen UML-Modeller unter Linux gefunden habe.
Neben dem von ljungi erwähnten ArgoUML ist auch Umbrello sehr nett.

Gruß
Christian
xabbuh ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.04.2007, 11:37 Nach oben    #11
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

…wozu __call()? Die Schnittstelle ist doch klar. Es gibt load(), get() und fetch() (wobei ich grad den Sinn noch nicht ganz blicke).

In jedem Fall würd ich die Parameter umdrehen, also erst index, dann item. Damit kannst du letzteren ggf. optional machen und so die ganze Config eines "index" auslesen.

Basti
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 23.04.2007, 21:34 Nach oben    #12
Christian Schuhmann
 
Benutzerbild von bobby
 
Registriert seit: 09.03.2007
Ort: Nürnberg
Beiträge: 66
Standard

Hi,

Zitat:
Zitat von xabbuh Beitrag anzeigen
Zitat:
Zitat von ljungi Beitrag anzeigen
mit UML kann ich leider derzeit nicht dienen, da ich bisher noch keinen schönen UML-Modeller unter Linux gefunden habe.
Neben dem von ljungi erwähnten ArgoUML ist auch Umbrello sehr nett.

Gruß
Christian
Dank dir, aber ich habe derzeit keine KDE-Libraries installiert - werde es mir aber bald möglichst anschauen.

Zitat:
Zitat von Basti Beitrag anzeigen
…wozu __call()? Die Schnittstelle ist doch klar. Es gibt load(), get() und fetch() (wobei ich grad den Sinn noch nicht ganz blicke).
Der Unterschied zwischen get und fetch ist, dass get ein Objekt zurückliefert wenn das Item ein Array ist.

PHP-Code:
$config->get(0'database')->get('host'); 
Was ja hoffentlich mit den kommenden PHP Versionen "überflüssig" wird

PHP-Code:
$object->ich_liefere_ein_array('user')['name'//Das war zumindest im Gespräch 
Zitat:
Zitat von Basti Beitrag anzeigen
In jedem Fall würd ich die Parameter umdrehen, also erst index, dann item. Damit kannst du letzteren ggf. optional machen und so die ganze Config eines "index" auslesen.

Basti
So einfach kann die Lösung sein - wieso ich da nicht selbst drauf gekommen bin .

Das Problem ist nun gelöst, aber wie definierst du eine Schnittstelle (die so wie in den oben genannten Bespielen funktioniert) ohne die Methoden zu kennnen? Da sehe ich nur den Weg über __call.

bobby
bobby ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 24.04.2007, 11:22 Nach oben    #13
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

Du kennst die Methoden doch. Der Client der Config-Klasse hat die Methoden get() und fetch() zur Verfügung. Er weiß nichts davon, ob er gerade mit einer Klasse Config_PHP oder Config_CSV oder Config_XML arbeitet. In sofern ist es natürlich auch nicht möglich, aber auch nicht nötig, einzelne dieser Klassen mit Zusatzfunktionen auszustatten.

Welche Methode kennt denn Config nicht?

Basti
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.04.2007, 20:02 Nach oben    #14
Christian Schuhmann
 
Benutzerbild von bobby
 
Registriert seit: 09.03.2007
Ort: Nürnberg
Beiträge: 66
Standard

Hi Basti,

meine letzte Frage bezog sich nicht mehr auf die oben genannte Configklasse - es ging allgemein um eine Schnittstelle. Aber ich glaube da habe ich mir wieder ein Problem geschafften, wo es eigentlich nicht nötig wäre.

Danke an euch alle und vorallem Basti.

bobby

//edit: Gib es hier sowas wie "Gelöst" ?
bobby ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 27.04.2007, 11:21 Nach oben    #15
Jann Hendrik Bekaan
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.378
Standard

Zitat:
Zitat von bobby Beitrag anzeigen
//edit: Gib es hier sowas wie "Gelöst" ?
derzeit nicht.
Aber du kannst den thread-titel entsprechend ändern, wenn du das möchtest.
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.05.2007, 13:25 Nach oben    #16
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.653
Standard

Den Threadtitel kann nur ein Mod/Admin ändern, nicht der Threadersteller
Der kann nur den Subtitle ändern.
__________________
I did it my way - Senseless-Blog
Weihnachtsgeschenk? Schülern helfen - Bodypainting Kalender für 2009
WarrenFaith ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 02.05.2007, 10:09 Nach oben    #17
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

BTW:
Kennt jemand eine gute Umsetzung für das prinzipielle Problem:
Ein Client baut ein Objekt von einer Klasse (z.B. Config oder Image), das Objekt entscheidet, welche konkrete Klasse die Datenquelle (etc.) handeln kann (Config_PHP, Image_Jpeg) und gibt eben dieses Objekt zurück. Alle diese konkreten Objekte implementieren eine Schnittstelle bzw. werden alle von einer gemeinsamen Basisklasse abgeleitet.

Mir fallen da nur zwei(einhalb) sinnige Lösungen ein:

1. Die Klasse Config/Image baut eine Instanz von Config_Csv, Image_Png etc. und behält diese als privates Objektattribut und gibt die Anfragen entsprechend weiter.

2. Es gibt eine Factory, die die jeweilige Klasse baut und zurückgibt.

2 1/2. Config bzw. Image verfügt über eine statische Factory-Methode und ist gleichzeitig Basisklasse für die konkreten Klassen.

Any patterns known?

Basti
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.05.2007, 11:10 Nach oben    #18
Benutzer
 
Benutzerbild von xabbuh
 
Registriert seit: 03.12.2005
Ort: Osnabrück
Beiträge: 76
Standard

Hallo Basti,

nach welchem Prinzip soll die Klasse den ermitteln, von welcher Klasse du ein Objekt benötigst? Und: Soll das Ganze als Singleton implementiert sein oder darf es mehr als ein Objekt je Klasse / Familie geben?

Gruß
Christian
xabbuh ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.05.2007, 13:09 Nach oben    #19
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

Zitat:
Zitat von xabbuh Beitrag anzeigen
nach welchem Prinzip soll die Klasse den ermitteln, von welcher Klasse du ein Objekt benötigst?
Das spielt für die Fragestellung ja keine Rolle. Wichtig nur, dass der Client davon keine Ahnung hat (sonst könnte er ja das konkrete Objekt selber bauen).

Zitat:
Und: Soll das Ganze als Singleton implementiert sein oder darf es mehr als ein Objekt je Klasse / Familie geben?
Ist letztlich auch Wurscht.

Basti
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.05.2007, 19:54 Nach oben    #20
Benutzer
 
Benutzerbild von xabbuh
 
Registriert seit: 03.12.2005
Ort: Osnabrück
Beiträge: 76
Standard

Ich würde wohl den Weg über eine statische Methode getInstance() wählen, die in der Basisklasse definiert wird (also dein Punkt 2.5).

Punkt 1 halte insofern für wenig sinnvoll, da du so letztendlich die verwendete Schnittstelle doppelt implementieren musst nur um die Erzeugung des eigentlichen Objektes zu kapseln.

Gruß
Christian
xabbuh ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45