für welche Alternative ich mich entscheide!
Singleton, Objekte übergeben oder Statische Klasse
Einklappen
X
-
-
Zitat von Tarlar Beitrag anzeigenAber 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]
Kommentar
-
Zitat von AmicaNoctis Beitrag anzeigenGegen die Parameterübergabe (loose coupling) spricht meines Wissens kein einziger Fakt, weswegen das für mich die einzig in Frage kommende Variante wäre
Kommentar
-
Zitat von unset Beitrag anzeigenAber 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]
Kommentar
-
Zitat von AmicaNoctis Beitrag anzeigenDas hatte ich ja bereits in meiner ersten Antwort ausführlich erwähnt.
Kommentar
-
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]
Kommentar
-
Zitat von combie Beitrag anzeigenMache 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
Kommentar
-
Lange gewartet, aber wenns von den Anderen nicht kommt, einer muss ja...
komme mir manchmal wie ein Papagei vor
Kommentar
-
Zitat von unset Beitrag anzeigenTypische 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 :-)
Kommentar
-
Zitat von schmalle Beitrag anzeigenDas 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"
Kommentar
-
Zitat von schmalle Beitrag anzeigenWer 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]
Kommentar
-
Zitat von AmicaNoctis Beitrag anzeigenEben darum braucht man eine weitere Instanz derselben Klasse
oder wie willst du mehrere DB-Verbindungen in einem Singleton verwalten?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 :-)
Kommentar
-
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]
Kommentar
-
Ich seh da eine Gefahr:
PHP-Code:datenbankaufruf($sql);
funktion();
datenbankaufruf($sql);
Kommentar
-
@Schmalle: Wenn du eine DB-Klasse baust, die sich ungefähr so benutzen lässtPHP-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:
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:
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.Zuletzt geändert von onemorenerd; 04.03.2010, 10:34.
Kommentar
Kommentar