für welche Alternative ich mich entscheide!
Singleton, Objekte übergeben oder Statische Klasse
Collapse
X
-
Mache dich vor der Entscheidung eben noch über das "Dependency Injection Design Pattern" kundig. Üblicher Weise wird dort noch zwischen Constructor und Setter Injection unterschieden.
-
Meiner Meinung nach ist es nicht nur Geschmackssache und die Gründe, die gegen Singleton sprechen, habe ich genannt. Gegen die Parameterübergabe (loose coupling) spricht meines Wissens kein einziger Fakt, weswegen das für mich die einzig in Frage kommende Variante wäreOriginally posted by Tarlar View PostAber ich sehe schon, dass die Meinungen stark auseinandergehen und es schlussendlich doch Geschmacksache ist, für welche Alternative ich mich entscheide!
[COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
[/COLOR]
Comment
-
Aber auch nur, wenn diese funktionalen Daten (abseits der wirklichen Arbeitsparameter) tatsächlich gebündelt werden. Nichts ist schlimmer als Methoden mit 20 Parametern. Ab einer gewissen Anzahl wird es schlicht umständlich zu bedienen.Originally posted by AmicaNoctis View PostGegen die Parameterübergabe (loose coupling) spricht meines Wissens kein einziger Fakt, weswegen das für mich die einzig in Frage kommende Variante wäre
Comment
-
Das hatte ich ja bereits in meiner ersten Antwort ausführlich erwähnt.Originally posted by unset View PostAber auch nur, wenn diese funktionalen Daten (abseits der wirklichen Arbeitsparameter) tatsächlich gebündelt werden. Nichts ist schlimmer als Methoden mit 20 Parametern. Ab einer gewissen Anzahl wird es schlicht umständlich zu bedienen.
[COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
[/COLOR]
Comment
-
Ich weiß, und ich habe es nur noch mal betont, da Google-Suchende ja öfter mal nur ein paar Posts lesenOriginally posted by AmicaNoctis View PostDas hatte ich ja bereits in meiner ersten Antwort ausführlich erwähnt.
Comment
-
Ich hätte noch einen anderen Weg anzubieten ...
Ich hätte noch einen anderen Weg anzubieten ...
Ich verwendete Jahrelang eine Basisklasse cObject, die global Verfügbare Objekte als Referenz speicherte. Alle davon abgeleiteten Klassen erbten logischerweise auch diese Eigenschaften.
Heute variiere ich das, indem die Globalen Referenzen als __get() Properties implementiert sind.carpe noctem
[color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
[color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]
Comment
-
Originally posted by combie View PostMache dich vor der Entscheidung eben noch über das "Dependency Injection Design Pattern" kundig. Üblicher Weise wird dort noch zwischen Constructor und Setter Injection unterschieden.OffTopic:
Beim Öffnen des Threads hatte ich bereits diese Antwort von combie erwartet
Comment
-
Lange gewartet, aber wenns von den Anderen nicht kommt, einer muss ja...
komme mir manchmal wie ein Papagei vor
Comment
-
Das sehe ich genau anders herum. Wer es nicht auf die reihe bekommt eine DB Klasse zu schreiben, die mit mehr als einer Verbindung klarkommt, hat etwas falsch gemachtOriginally posted by unset View PostTypische Anwendungsfälle eines Singleton auf die das nicht zutrifft sind zum Beispiel Datenbank-Verbindungen & Request/Response-Objekte. Früher oder später braucht man hier eine weitere Instanz, und schon steht man vor einem Dilemma.
Ich hasse es, wenn man in Projekten mehrere Instanzen braucht. Sinnloser Speicherverbrauch. Wenn man sich dazu zwingt nur eine Instanz zu haben, werden die Klassen viel "schöner"
h.a.n.d.
Schmalle
http://impressed.by
http://blog.schmalenberger.it
Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
... nur ohne :-)
Comment
-
Eine Datenbankverbindung wird durch eine Instanz repräsentiert. Wer es anders macht, hat das Konzept von Objektorientierung nicht auf die Reihe bekommen.Originally posted by schmalle View PostDas sehe ich genau anders herum. Wer es nicht auf die reihe bekommt eine DB Klasse zu schreiben, die mit mehr als einer Verbindung klarkommt, hat etwas falsch gemacht
Ich hasse es, wenn man in Projekten mehrere Instanzen braucht. Sinnloser Speicherverbrauch. Wenn man sich dazu zwingt nur eine Instanz zu haben, werden die Klassen viel "schöner"
Comment
-
Eben darum braucht man eine weitere Instanz derselben Klasse oder wie willst du mehrere DB-Verbindungen in einem Singleton verwalten?Originally posted by schmalle View PostWer es nicht auf die reihe bekommt eine DB Klasse zu schreiben, die mit mehr als einer Verbindung klarkommt, hat etwas falsch gemacht
[COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
[/COLOR]
Comment
-
nein :POriginally posted by AmicaNoctis View PostEben darum braucht man eine weitere Instanz derselben Klasse
oder wie willst du mehrere DB-Verbindungen in einem Singleton verwalten?Funktioniert ganz wunderbar. Wenns sein muss mit X Verbindungen.PHP Code:// Klassenmethode für neue Verbindung
/**
*
* @access public
* @param string $db_array_name
* connects to database
*/
public function connect($db_array_name)
{
$ar = $this->connection_data[$db_array_name];
if(empty($ar))
{
scp_error::fatal('missing connection data (mysql)', 'array name: '.$db_array_name, __FILE__,__CLASS__,__FUNCTION__,__LINE__);
} // empty connection data
else
{
$this->connected = @mysql_connect($ar['host'], $ar['user'], $ar['password']);
if(!$this->connected)
{
scp_error::fatal('Connection failed (mysql)', mysql_error(),__FILE__,__CLASS__,__FUNCTION__,__LINE__);
} // connect failed
else
{
$this->ar_connections[$db_array_name] = $this->connected;
$this->connected_to = $db_array_name;
$this->selectDB($ar['database']);
} // connect ok
} // connection data given
} // connect()
// switch Methode
/**
*
* @access public
* @param string $con_name
*/
public function switchConnection($con_name)
{
if(isset($this->ar_connections[$con_name]))
{
$this->connected = $this->ar_connections[$con_name];
$this->connected_to = $con_name;
}
else
{
$this->connect($con_name);
}
} // switchConnection()
h.a.n.d.
Schmalle
http://impressed.by
http://blog.schmalenberger.it
Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
... nur ohne :-)
Comment
-
Ich sehe da absolut keinen Vorteil drin. Schon alleine wegen des zusätzlichen Codes für die Singleton-Constraints und das Verbindungsswitching.
Das ist kein OOP mehr, sorry.[COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
[/COLOR]
Comment
-
Ich seh da eine Gefahr:
Was ist, wenn die Funktion dazwischen die Datenbankverbindung switched, ohne dass man es erwartet? Hier musst du immer volle Kontrolle auf die Funktionen haben, die du aufrufst. Oder du passt jedesmal innerhalb der Funktion auf, dass du den Ausgangszustand wiederherstellst. Wie man es auch macht, ich finde es so nur unnötig kompliziert.PHP Code:datenbankaufruf($sql);
funktion();
datenbankaufruf($sql);
Comment
-
@Schmalle: Wenn du eine DB-Klasse baust, die sich ungefähr so benutzen lässtist das kein Singleton. Man muss einen zusätzlichen Parameter übergeben, wenn man nicht die Standardverbindung benutzen möchte. Die Instanz verwaltet intern alles (Verbindungen, Queries, Resultsets) in Arrays.PHP Code:$dbc = DBConn::getInstance();
$dbc->query($query);
$dbc->query($otherQuery, 'host2');
Ähnlich verhält es sich bei dieser Variante, wobei hier h3lls Anmerkung bzgl. des Kontrollverlusts zu beachten ist:
Auch hierbei ist DBConn kein Singleton, sondern eine Registry von Singletons. Genau genommen weiß man gar nicht, ob man bei parametrisierten Calls von getInstance() die selben Instanzen bekommt. Man kann es zumindest nicht ausschließen und der Name "getInstance" ist ziemlich fest mit dem Singleton-Pattern verbunden, so dass ich davon ausgehen würde, immer die selbe Instanz zu bekommen, bei der durch die Parametrisierung intern nur ein Schalter umgelegt wurde.PHP Code:$dbc1 = DBConn::getInstance();
$dbc1->query($query);
$dbc2 = DBConn::getInstance('host2');
$dbc2->query($otherQuery);
Aber ganz gleich wie das Multiplexing intern implementiert ist, es handelt sich dann nicht mehr um Singleton sondern um Multiton.
Unsets Vorschlag sieht wahrscheinlich so aus:
Hier stecken zwei Konventionen drin:PHP Code:Registry::set('dbc1', new DBConn());
Registry::set('dbc2', new DBConn('host2'));
$dbc1 = Registry::get('dbc1');
$dbc1->query($query);
$dbc2 = Registry::get('dbc2');
$dbc2->query($otherQuery);
1. Man soll keine neuen Instanzen von DBConn erzeugen, sondern die aus der Registry nehmen.
2. Die Benamung der Instanzen in der Registry.
Die Einhaltung dieser Konvention kann man nicht erzwingen. Deshalb schmeckt mir persönlich dieser Ansatz auch nicht.
Fazit: Ich finde Schmalles Vorschlag sehr brauchbar. Aber er arbeitet eben nicht mit Singleton … Vorsicht bei den Begrifflichkeiten.
Last edited by onemorenerd; 04-03-2010, 10:34.
Comment
Moderatorin
Comment