Jump to content
php.lv forumi

Factory pattern?


Joyride

Recommended Posts

Neesmu ipasi draugos ar php patterniem, tapec jautasu jums. Taisu DB abstrakcijas klasi, bet apstajos pie vienas problemas. Galarezultatu es gribetu redzet sadu:

 

$DB = new TDatabase('mysql');
$DB->GetRows($table_name, $where);

...utt...

 

to var vienkarsi izdarit, kaut ka sadi ieks TDatabase konstruktora:

 

switch($driver) {
  case 'mysql':
  return new TDriverMySQL();
  break;
  case 'mysql':
  return new TDriverPgSQL();
  break;
  default:
  throw new Exception('Unknown DB driver: ' . $driver);
  break;
}

 

bet es velos, lai "draiveri" tiktu automatiski izveidoti, piemeram, ir mape Drivers un tur ieksa ir faili: driver_mysql.php, driver_pgsql.php utt. Ja tiek padots $driver ka "oracle", tiek inkludots driver_oracle.php un return atgriez new TDriverOracle klasi. Vardu sakot, lai jauna draivera pievienosana beidzas ar to, ka draiveru mape atliek tikai iemest draivera failu.

 

Jautajums ir - ka to panakt, ka TDatabase konstruktors pec $driver uztaisa un atgriez atbilsotoso klasi?

Link to comment
Share on other sites

__construct($driverName)
{
$filename = 'driver_'.$friverName.'.php';
if (file_exists($filename))
{
	  // ob start
	  include_once($filename);
	  // ob_end_clean

	 $className = 'TDriver'.$friverName;
	 if (!class_exists($className))
	 {
		   throw ...
	 }
} else {
	 throw ...
}

return new $className();
}

Edited by Delfins
Link to comment
Share on other sites

Nav vienkāršāk pie lapas uzstādīšanas norādīt, kuri draiveri jālieto? A to kaut kāds ļevais risinājums tas liekas. Pie katras komandas tak kompis nečeko, kura no nVidias kartēm man ir un kuru funkciju kur saukt. Nemainīsies tak ik pa 5 minūtēm datubāze.

 

Viena uuberDB klase ar visiem iespējamajiem variantiem ir pārāk liela sarežģīšana, manuprāt.

Edited by Kavacky
Link to comment
Share on other sites

un factorijas productu dorši vien ka gribēsi kā singletonu. tāpat draiverim interfeisu sadomā un piekabini klāt, it sevišķi, ja taisies atļaut kādam citam rakstīt viņus.

Edited by v3rb0
Link to comment
Share on other sites

Pie katras komandas tak kompis nečeko, kura no nVidias kartēm man ir un kuru funkciju kur saukt.

A vot šeit tu 100% maldies... Pie katras ieslēgšanas notiek inicializācija. Tā kā PHP izpilde nav process, tas pielīdzinams pilnai ielādei.

 

Nemainīsies tak ik pa 5 minūtēm datubāze.

Un ja raksta pluginus? Teiksim kāds plugins konektējās pie attālas DB, parametrus ņem no DB.

 

Globālo gan var uztaisīt ar `new TMysqlDb()` / whatever

 

PS: turklāt ielādes kods atšķirās tikai ar pārs rindiņām.

Edited by Delfins
Link to comment
Share on other sites

Delfins - lielum lielais paldies!

 

Un ja raksta pluginus? Teiksim kāds plugins konektējās pie attālas DB, parametrus ņem no DB.

 

Jap, paralels darbs ar mysql un mssql. Gribas uztaisit vienotu DB piekljuves interfeisu, un jutu, ka tuvakaja laika var nakties stradat ar vel kadu citu DBVS.

Link to comment
Share on other sites

$filename = 'driver_'.$friverName.'.php';
if (file_exists($filename))

 

no performances viedokļa man liekas tas ir bik bremzējoši, it īpaši ja pie katra refresh tas notiek. kaut gan ja nav 200+ onlainā tad varbūt vienalga.

Link to comment
Share on other sites

NiTrino, tajā vietā tu vari rakstīt vienkārši:

 

require_once $driverFileName;

 

Bet tad tu nekad netiksi līdz custom throw... vienīgais neesmu mēģinājis, kas notiek ja izdara:

 

try { require_once $x } catch { ... }

Link to comment
Share on other sites

×
×
  • Create New...