Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: instancje db
Forum PHP.pl > Forum > PHP > Object-oriented programming
xerek
Witam serdecznie
Czytajac wasze posty czesto natrafialem na stwierdzenie ze singleton jest zlym wzorcem projektowym wykorzystywanym przy tworzeniu instancji klasy db. Jednak nigdzie nie moglem doszukac sie argumentów przemawiajacych za tym stwierdzeniem.. Podam przyklad:

-----Klasa DataBase-----

private $connect;


private function __construct() {
$conf=parse_ini_file('config/DsnConfig.ini',true);
$dsn=$conf[Data][DSN];
$this->connect=DB::connect($dsn);
if(DB::isError($this->connect)) {
throw new Exception($this->connect->getMessage(), $this->connect->getCode());
}
$this->connect->setFetchMode(DB_FETCHMODE_ASSOC);
//$db=$this->select('Set CHARSET UTF8');

}

static public function instance() {

static $objDB;
if(!isset($objDB)) {
$objDB=new Database();
}
return $objDB;

}


Powyzszy kod zapewnia nam to ze nie utworzymy wiecej niz jednego egzemplarza klasy Database. Zapewni nam to porzadzek w kodzie i w strukturze aplikacji a takze w jej wydajnoci bo przeciez utrzymujemy tylko jedno polaczenie z baza danych.. Teraz stawiam pytanie co jest w tym zlego ?

Minusem jest na pewno to ze mamy sztywno okreslone, że uzywamy jednej bazy danych. Chciałbym uslyszec wasze opinie na ten temat..
pozdrawiam
Albitos
Z Singletonem możesz mieć problem, kiedy będziesz chciał wymienić tę klasę na coś innego (przy większym projekcie). Jeżeli nad wszystkim pracować będzie kilka osób, niektóre mogą nawet nie zauważyć zmian i pisać dalej pod starą klasę - przecież nie mają szansy zauważyć, że API się zmieniło - pobierają sobie obiekt i nie mają pojęcia jakiego jest on typu. Inaczej jest w przypadku przekazywania tego jako parametr z podaną nazwą typu (klasy).

Przynajmniej ja mam takie wrażenie, po dwóch latach styczności z obiektówką w PHP - niech wypowiedzą się inni, bardziej doświadczeni użytkonicy forum...
wrzasq
@Albitos: przytoczony przez ciebie argument nie dotyczy singletonu, a co najwyzej jego wykorzystania w PHP, singleton to powszechny wzorzec, a jezykach z silniejszym typowaniem niz PHP zazwyczaj wiesz jakiego typu zmienna posiadasz.

ogolnie singleton dla wielu jest zly, gdyz jest to obejscie problemu widocznosci i lamanie zasad enkapsulacji - jest to tworzenie globalnej zmiennej przez co ukrywamy zaleznosci miedzy obiektami.

ale rownie dobrze zasady enkapsulacji burza klasy zaprzyjaznione w C++, a w PHP obiektowosc jest tak bezmyslnie niemalze zaimplementaowana (vide dziedziczenie, __get i __set, ...), ze akurat tego typu argumenty moim zdaniem nie maja poparcia w rzeczywistosci.

ogolnie singleton jest pewnym uproszczeniem. i to juz zalezy od ciebie czy chcesz pojsc na takie ustepstwo, czy wolisz tworzyc wiecej kodu ale bardziej spojnego. ja z singletona korzystam i uwazam, ze na takie odstepstwo mozna sobie pozwolic, gdyz znacznie ulatwia tworzenie klas, w ktorych wykorzystujemy pewien uchwyt, ktory jest niejako oczywisty (wlasnie na przyklad polaczenie z baza danych).

ten temat zapewne zaras sie przerodzi w kolejna wojne "singleton vs. rejestr vs. kontekst vs. przekazywanie jako argumenty" i wyjdzie, ze najlepiej uzyc globali tongue.gif. imho jak zawsze to zalezy prywatnie od ciebie jak ci sie z tym bedzie zylo, zawsze po prostu musisz paimetac o tym co robisz, ze to niesie pewne konsekwencje (musisz tego pilnowac w kodzie, gdyz nie przekazujac tego jako argument mozesz napotkac na sytuacje, gdy starasz sie pobrac dane logowania bez polaczenia czyli wykonac operacje na niepolaczonym jeszcze singletonie) i tak dalej. ale to tylko twoje wlasne podejscie i sam musisz zdecydowac.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.