für welche Alternative ich mich entscheide!
Singleton, Objekte übergeben oder Statische Klasse
Collapse
X
-
-
Originally 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
-
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
-
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
-
Originally 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
-
Originally 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
-
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
-
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
-
Originally posted by AmicaNoctis View PostEben 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 :-)
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:
PHP Code:datenbankaufruf($sql);
funktion();
datenbankaufruf($sql);
Comment
-
@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.Last edited by onemorenerd; 04-03-2010, 09:34.
Comment
Comment