Şimdi, evde dantel işleyen varsa bilirsiniz, bir araya gelir konu komşu, şurasını söyle yapacaksın burasını böyle yapacaksın diye temel kalıpları vardır.
Bu aynı yaklaşımın yazılımda ancak oop modelinde kullanılır. Yazılım dünyası bir çok sorun için bir çok temel çözüm üretmiştir.
Mesela diyelim, sınırsız kategori sistemi, bunun adı hieracial data tree olarak geçer 30 sene falan önce ideal bir teori kurulmuştur, biz konuda habersiz olduğumuz için oturur kendi başımıza icad çıkarır sonrada bir sürü sorunla cebelleşiriz. Ancak eğer bilgimiz olsa bu teoriyi kullanan bir yazılım üretir keyfimize bakardık.
Design Patterns te böyle bir şey ancak çok daha temel konular için geçerli.
Mesela ?
Yazdığınız projede, kullandığınız veri tabanı bağlantısının tek olmasını istersiniz. Bunun adı singelton pattern diye geçer.
Tabi şimdi ne alaka yaa. diyeceksiniz, çünkü siz projenizi standart mysql bağlantısı ile yapıp, mysql bağlantısını tutan değişkeni de global değişkenler arasında bir yere astınız. Oradan devam ediyorsunuz. Hatta öyle bir şey de yok, her sayfanın başında connect.php yi include edip sayfa içinde bir yandan mysql erişimi sağlayıp bir yanda echo ile çıktı veriyorsunuz.
Ancak idealleştirilmiş programlama ortamında global değişken kullanılmaz. Sadece php için değil, tüm yazılım dilleri için geçerli, işler büyüdüğünde globals başa beladır sadece.
Yani ben veri tabanı bağlantısını oturup elle açmam, ben yazılım bir noktasında, modeli çağırırım o eğer yoksa yeni veri tabanı bağlantısını gidip ayar dosyasındaki bilgileri okuyarak otomatik olarak oluşturur.
Şimdi aynı anda birden fazla veri tabanı erişimim var, ee her seferinde ben yeniden veri tabanı bağlantısı mı açacağım ?
Hayır, veri tabanı bağlantı kurucuyu singelton pattern ile yazacağım için ben veri tabanı işlemi yaptığımda önce bakıp daha önceden yapılmış bağlantı olup olmadığını kontrol edecek yoksa bağlantı yapacak varsa eski bağlantıyı getirecek.
class ConnectDb {
private static $instance = null;
private $conn;
private $host = 'localhost';
private $user = 'db user-name';
private $pass = 'db password';
private $name = 'db name';
// The db connection is established in the private constructor.
private function __construct()
{
$this->conn = new PDO("mysql:host={$this->host};dbname={$this->name}", $this->user,$this->pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
}
public static function getInstance()
{
if(!self::$instance)
{
self::$instance = new ConnectDb();
}
return self::$instance;
}
public function getConnection()
{
return $this->conn;
}
}
şimdi bu class autoloader in eriştiği bir yerde durduğu müddetçe siz
$db = ConnectDb::getInstance();
$conn = $db->getConnection();
var_dump($conn);
yazarak veri tabanına erişirsiniz, her seferinde eriştiğiniz bağlantı aynı olur.
bu en basit tasarım desenidir, bunun gibi daha nice desenler mevcut, bir kısmının php nin realitesinde yeri yok, ancak zend framework gibi dibine kadar OO bilader modunda gidip sonunda devasa ve yavaş bir yapı oluşturursunuz.
OOP ve Design Patterns üzerine kavga gürültü çok olur, öğrenmeniz ve uygulamanız yerindedir, farz olduğu yerler vardır, mekruh a kaçtığı yerler vardır. Zaman ve tecrübe ister.