php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 2 Stimmen, 3,00 durchschnittlich.
Alt 01.07.2011, 10:50  
Erfahrener Benutzer
 
Registriert seit: 12.05.2005
Beiträge: 1.038
PHP-Kenntnisse:
Fortgeschritten
notyyy befindet sich auf einem aufstrebenden Ast
Standard DI-Container Key

Hallo,

ich bin mir derzeit unterschiedliche DI Container am anschauen und kann teilweise einige Sachen nicht nachvollziehen. Ganz besonders die Tatsache, dass man Services einfach nur einen namen gibt und mit dem Servicenamen arbeitet.

Hat uns die OOProgrammierung dafür nicht interfaces geschenkt?

Beispiel:

$di->get('service.logger');

hier wird anhand des strings service.logger der logger geholt. dabei ist völlig unklar was der logger für ein objekt ist und welche methoden dieser implementiert.

warum nicht so?:

$di->get('\framework\iLogger');

der unterschied ist, dass der DI Container nun die richtige Klasse für das Interface zurück gibt. Als Key kann also nur ein Interface verwendet werden.

Es sollte ja sowieso so sein, das jedes Interface nicht einen gewissen concern angehaftet ist. demnach sollte dies doch völlig problemlos möglich sein?

ich wäre auch super dankbar wenn ihr mir näher bringen könntet, warum meine lösung schlecht ist
notyyy ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 01.07.2011, 11:53  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Problematisch wird das, wenn Du mehrere Objekte der gleichen Klasse bzw. des gleichen Interfaces, aber mit verschiedenen Konfigurationen willst.
xm22 ist offline   Mit Zitat antworten
Alt 01.07.2011, 12:52  
Erfahrener Benutzer
 
Registriert seit: 12.05.2005
Beiträge: 1.038
PHP-Kenntnisse:
Fortgeschritten
notyyy befindet sich auf einem aufstrebenden Ast
Standard

ist es nicht so, dass wenn 2 gleiche objekte 2 unterschiedliche Konfigurationen hätten, dass diese dann unterschiedliche interfaces implementieren müssten, abhängig vom kontext? macht es sinn der klasse vorzuenthalten, dass dies unterschiedliche objekte sind?
notyyy ist offline   Mit Zitat antworten
Alt 01.07.2011, 12:57  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
dass diese dann unterschiedliche interfaces implementieren müssten
Vielleicht irre ich mich, aber ich finde, nicht. Bsp.: Man hat einen File-Handler, der vielleicht mit einem Verzeichnis initialisiert werden muss. Gleiches Interface, Gleiche Klasse, aber unterschiedliche Parameter. So, wie Du das beschreibst, müsste ja für jeden Service ein eigenes Interface vorhanden sein.

Zitat:
macht es sinn der klasse vorzuenthalten, dass dies unterschiedliche objekte sind?
Die Klasse weiß doch davon gar nichts.
xm22 ist offline   Mit Zitat antworten
Alt 01.07.2011, 12:58  
Neuer Benutzer
 
Registriert seit: 15.06.2011
Beiträge: 14
PHP-Kenntnisse:
Fortgeschritten
joshiausdemall befindet sich auf einem aufstrebenden Ast
Standard

Nö warum? Stell Dir bspw. vor, du verwendest zwei Datenbanken. Damit auch zwei DatabaseConnections => 2 unterschiedliche Konfigurationen, dasselbe Interface.

Interface injection ist im Grunde 'ne coole Sache, aber "unter der Haube" müssen Services immer einen eindeutigen Identifizierer haben. Alles weitere ist i.d.R. "syntaktic Sugar" und wird auf den eigentlichen DI draufgepappt. So kann man Services "guessen" (indem man bspw. Signaturen analysiert), eine andere herangehensweise ist unter anderem das Mapping durch NamingConventions von Properties (so macht Grails das in seinen Controllern) => "myMailerService" oder so. Das "Problem" heißt generell "ServiceLocator vs. Injection" und ist hier beschrieben: http://bit.ly/5yMot
joshiausdemall ist offline   Mit Zitat antworten
Alt 01.07.2011, 14:01  
Erfahrener Benutzer
 
Registriert seit: 12.05.2005
Beiträge: 1.038
PHP-Kenntnisse:
Fortgeschritten
notyyy befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von joshiausdemall Beitrag anzeigen
Stell Dir bspw. vor, du verwendest zwei Datenbanken. Damit auch zwei DatabaseConnections => 2 unterschiedliche Konfigurationen, dasselbe Interface.
das wäre ja völlig unproblematisch, wenn die datenbanken jedoch unterschiedliche aufgaben haben, sind sie nach meinem Verständnis unterschiedliche services und sollten unterschiedliche interfaces implementieren. für jeden service den man injizieren wollen möchte, müsste man selbstverständlich mind. ein interface hinterlegen.

aber ich verstehe schon die problematik, auch sollte ein interface nichts über die belange und den kontext wissen in dem es verwendet wird. bei meiner lösung wäre dies ja der fall.

indirekt besteht die problematik ja aber auch bei dem klassischen di container. $di->get('db') gibt ja im rahmen der di instanz immer identisches objekt mit identischer konfiguration zurück. wenn die klasse plötzlich mit einer anderen datenbank agieren muss, wird die klasse ja einen anderen schlüssel nutzen $di->('db2') omit die grundproblematik weiterhin bestehen würde.

ich werde mich nochmal intensiv damit auseinandersetzen und mal schauen welche lösungen noch gangbar wären, insbesondere stört mich die nicht vorhandene typensicherheit.

Zitat:
Zitat von joshiausdemall Beitrag anzeigen
und ist hier beschrieben: http://bit.ly/5yMot
vielen dank, schaue ich mir an, vielleicht erleuchtet mich das ja
notyyy ist offline   Mit Zitat antworten
Alt 01.07.2011, 14:10  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
omit die grundproblematik weiterhin bestehen würde.
Welche Grundproblematik?
xm22 ist offline   Mit Zitat antworten
Alt 01.07.2011, 14:37  
Erfahrener Benutzer
 
Registriert seit: 12.05.2005
Beiträge: 1.038
PHP-Kenntnisse:
Fortgeschritten
notyyy befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von xm22 Beitrag anzeigen
Welche Grundproblematik?
die aufgeführte problematik war, dass wenn man identische klassen mit unterschiedlichen konfigurationen hat, welche beide identisches interface besitzten, meine idee nicht aufgehen kann. Beispiel waren 2 datenbanken mit mit unterschiedlichen konfigurationen.

ein di container kann jedoch unter einem schlüssel auch nur ein service mit einer konfiguration anbieten. demnach müsste man für die 2. datenbank einen 2. service definieren der identische klassen mit einer anderen konfiguration anbietet.

betroffene klassen müssen jedoch von dem service wissen, ansonsten können sie diesen nicht ansprechen.

demnach handelt es sich in meinen augen nicht um den selben service, sonderen es gibt 2 verschiedene services welche unterschiedliche aufgaben erfüllen und demnach auch ein unterschiedliches interface gerechtfertigt wäre.


mich stört, dass man services willkürlich tauschen kann und man keinerlei möglichkeit hat wirklich typensicher ohne viel gecaste zu arbeiten. wenn man jeden service gegen ein interface implementieren müsste wäre dieses problem quasi nicht mehr vorhanden.
notyyy ist offline   Mit Zitat antworten
Alt 01.07.2011, 14:47  
Erfahrener Benutzer
 
Registriert seit: 12.05.2005
Beiträge: 1.038
PHP-Kenntnisse:
Fortgeschritten
notyyy befindet sich auf einem aufstrebenden Ast
Standard

mir fällt grade auf, dass das großer unfung war. durch eine contructor oder einer setter injection ist ja wieder typensicherheit gewährleistet.

PHP-Code:
/**
* @inject document
*/
public function getDocumentService(/xyz/document $document); 
notyyy ist offline   Mit Zitat antworten
Alt 01.07.2011, 14:48  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.169
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Ah, ich verstehe.. Stimmt, das sind zwei verschiedene Services. Aaaaaber, um beim Bsp. mit den Datenbanken zu bleiben. Angenommen, Dein Interface für 'db' sieht so aus:
PHP-Code:
interface DB {
    public function 
setUsername();
    public function 
setPassword();
    
//...

Da würdest Du jetzt für 'db2' ein weiteres, bis auf den Namen identisches Interface bauen?

Zitat:
betroffene klassen müssen jedoch von dem service wissen, ansonsten können sie diesen nicht ansprechen.
Logisch - Aber ansonsten müssten sie auch von dem Interface wissen. Das ist gehüpft wie gesprungen.

Zitat:
wenn man jeden service gegen ein interface implementieren müsste wäre dieses problem quasi nicht mehr vorhanden.
Kann ich nachvollziehen, aber ich finde trotzdem, da macht man sich unheimlich viel Arbeit und schafft enorm viel Redundanz. Und Wenn Du Dich schon bei der Varianten mit den Service-Bezeichnern nicht darauf verlassen kannst, dass Du einen korrekten Service zurück bekommst, dann kannst Du das mit den Interfaces auch nicht.


EDIT: K.A., ob Du den Thread gelesen hast: http://www.php.de/software-design/81...container.html (DI-Container) Das ist mein Ansatz, allerdings halt mit Bezeichnern statt Interfaces.


EDIT: Ich verstehe jetzt nicht ganz, wo Du Typsicherheit vermutet hast: Bei den Parametern, die der aufgerufene Service bekommt oder ging es um den Service, der zurück gegeben wurde?
xm22 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Dependency Injection Container Anyone PHP-Fortgeschrittene 33 16.06.2011 08:28
jQuery <div> Container generieren lassen ? dreamcatcher JavaScript, Ajax und mehr 5 23.02.2011 14:01
[Erledigt] Mehrere DIV Container mit einem Klick ändern (mit mehreren Request Aufrufe Lebenssonde JavaScript, Ajax und mehr 11 26.08.2010 09:01
Netz von Objekten mit Abhängigkeiten darstellen/zeichnen serPHPico PHP-Fortgeschrittene 12 25.08.2010 18:52
kürzeren div container authoatisch der höhe des contends anpassen litterauspirna HTML, Usability und Barrierefreiheit 15 29.07.2009 00:57
2 div Container immer gleich lang Kein Genie HTML, Usability und Barrierefreiheit 4 27.07.2009 13:38
Links vom Untermenü in Container öffnen Surfer PHP Tipps 2008 0 27.12.2008 19:24
Div Container nebeneinander anordnen tomtaz HTML, Usability und Barrierefreiheit 10 04.06.2008 12:45
[CSS] Container in Container Igäl HTML, Usability und Barrierefreiheit 5 04.09.2007 11:29
CSS - Bild im div container überlappt andere container Buschdieb HTML, Usability und Barrierefreiheit 13 19.07.2007 23:17
IE6: Container mit Float dabei wird margin doppelt gewertet DonTermi HTML, Usability und Barrierefreiheit 1 11.01.2007 09:02
[CSS] Div container unsichtbar machen I-Spy HTML, Usability und Barrierefreiheit 24 05.03.2006 09:37
[Erledigt] Container im Firefox falsch dargestellt HTML, Usability und Barrierefreiheit 27 15.08.2005 23:18
&amp;lt;div&amp;gt;- container vertikal auf seite zentrieren HTML, Usability und Barrierefreiheit 3 08.05.2005 11:16

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
di container, php di container

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:36 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum