Observer Pattern: Olaylara Tepki Veren Esnek Yapı


 

Observer Pattern Nedir?

Observer Pattern (Gözlemci Tasarım Deseni), bir nesnede olan değişikliği, bu nesneyi izleyen diğer nesnelere otomatik olarak bildiren bir yapıdır.


Basit Tanımıyla:

Bir nesne değiştiğinde, ona abone olan (gözlemleyen) tüm nesnelerin haberdar olmasını sağlar.

Ne İçin Kullanılır?

  • Bir olay gerçekleştiğinde birden fazla işlemin tetiklenmesi isteniyorsa

  • Kodun esnek ve modüler olması amaçlanıyorsa

  • İf-else zinciri kurmadan, farklı bileşenlerin bir olaya tepki vermesi gerekiyorsa


Gerçek Hayat Örnekleri:

  • Mail sistemi: Yeni kullanıcı kaydolunca hem e-posta gönder, hem log’a yaz, hem bildirim göster.

  • E-ticaret: Sipariş verildiğinde stok azalt, fatura oluştur, e-posta yolla.

  • Blog platformları: Yeni yazı eklendiğinde takipçilere bildirim gönder.



OCP ile Uyumu

Observer Pattern, Açık/Kapalı prensibini (OCP) uygular. Yeni dinleyiciler (observer) eklenebilir, ana kod değiştirilmez.


PHP ile Observer Pattern Uygulaması

(Observer Interface)


<?php
//Observer.php (Interface)
interface Observer {
public function update($data);
}



(Subject "Konu" Sınıfı)

<?php
//EventManager.php
class EventManager {
private $observers = [];

public function attach(Observer $observer) {
$this->observers[] = $observer;
}

public function notify($data) {
foreach ($this->observers as $observer) {
$observer->update($data);
}
}
}



(Observer Sınıfları)

<?php
//EmailSender.php
class EmailSender implements Observer {
public function update($data) {
echo "E-posta gönderildi: " . $data . "\n";
}
}

class Logger implements Observer {
public function update($data) {
echo "Log kaydedildi: " . $data . "\n";
}
}



(Kullanım)

<?php
//index.php
$event = new EventManager();

$email = new EmailSender();
$log = new Logger();

$event->attach($email);
$event->attach($log);

// Olay tetiklendi
$event->notify("Yeni kullanıcı kaydoldu!");




(Sonuc)

E-posta gönderildi: Yeni kullanıcı kaydoldu!
Log kaydedildi: Yeni kullanıcı kaydoldu!


Avantajları

  • Kod parçaları birbiriyle sıkı bağlı değildir (loosely coupled)

  • Yeni görevler kolayca eklenebilir

  • Birden fazla işlem bir olayla tetiklenebilir



Observer Pattern sayesinde sistemdeki bir değişiklikten haberdar olması gereken tüm yapılar bağımsız ve dinamik şekilde güncellenebilir. Bu sayede kodun sürdürülebilirliği ve esnekliği artar.





PHP Strategy Pattern ile Dinamik Algoritma Seçimi


 Kod yazarken bazen belirli bir işlemin birden fazla farklı şekilde yapılması gerekebilir. Mesela indirim hesaplama, sıralama, ödeme yöntemi gibi durumlarda tek bir yapıya sıkışmak istemeyiz. İşte bu gibi durumlarda Strategy Pattern hayat kurtarır.

Bu yazıda Strategy Pattern nedir, ne için kullanılır, hangi projelerde kullanılır ve PHP ile nasıl uygulanır adım adım öğreniyoruz.


Strategy Pattern Nedir?

Strategy Pattern, bir işlemi gerçekleştirmek için kullanılan algoritmanın (stratejinin) dinamik olarak değiştirilmesini sağlayan bir tasarım desenidir.

Yani:
➡️ Her iş için farklı bir strateji (sınıf) oluşturursun,
➡️ Bu stratejiler birbirinin yerine geçebilir olur,
➡️ Kullanım anında hangisini çalıştırmak istiyorsan onu seçersin.



Basit Bir Benzetme

Bir kahveci düşün. Müşteri ister Türk kahvesi ister espresso ister latte isteyebilir. Hepsi "kahve yap" işlemi gibi görünse de içerik farklıdır. Kahveci bunu esnek bir şekilde yönetmelidir. Strategy deseni burada sana bu esnekliği sağlar.


Strategy Pattern Ne İçin Kullanılır?

  • Bir işlemin birden fazla versiyonu varsa (farklı algoritmalar)

  • Uygulama çalışırken davranışı değiştirmek isteniyorsa

  • Kod tekrarını ve if-else karmaşasını azaltmak gerekiyorsa

  • Açık/kapalı prensibini (OCP) uygulamak istiyorsan


Kullanıldığı Gerçek Proje Türleri

Proje TürüKullanım Örneği
🛒 E-Ticaret SiteleriFarklı indirim stratejileri (yüzde, sabit, kampanya)
💳 Ödeme SistemleriFarklı ödeme yolları: kredi kartı, havale, kapıda
🔎 Sıralama UygulamalarıFarklı sıralama algoritmaları (A-Z, tarih, fiyat)
📦 Kargo SeçimiKargo türüne göre ücret hesaplama stratejileri


PHP ile Strategy Pattern Uygulaması

Senaryo: Bir e-ticaret uygulamasında sepet toplamına farklı indirim stratejileri uygulanacak.

(Interface)


<?php
//DiscountStrategy.php (Interface)
interface DiscountStrategy {
public function apply($amount);
}



(Yüzde indirimi)


<?php
//PercentageDiscount.php (Yüzde indirimi)
require_once 'DiscountStrategy.php';

class PercentageDiscount implements DiscountStrategy {
private $percentage;

public function __construct($percentage) {
$this->percentage = $percentage;
}

public function apply($amount) {
return $amount - ($amount * $this->percentage / 100);
}
}


(Sabit indirim)


<?php
//FixedDiscount.php (Sabit indirim)
require_once 'DiscountStrategy.php';

class FixedDiscount implements DiscountStrategy {
private $discountAmount;

public function __construct($discountAmount) {
$this->discountAmount = $discountAmount;
}

public function apply($amount) {
return max(0, $amount - $this->discountAmount);
}
}


(İndirimi uygulayan sınıf)


<?php
//Cart.php (İndirimi uygulayan sınıf)
class Cart {
private $amount;
private $strategy;

public function __construct($amount) {
$this->amount = $amount;
}

public function setDiscountStrategy(DiscountStrategy $strategy) {
$this->strategy = $strategy;
}

public function getTotal() {
if ($this->strategy) {
return $this->strategy->apply($this->amount);
}
return $this->amount;
}
}



(Kullanım)


<?php
//index.php (Kullanım)
require_once 'PercentageDiscount.php';
require_once 'FixedDiscount.php';
require_once 'Cart.php';

$cart = new Cart(200);

// Yüzde %20 indirim uygula
$cart->setDiscountStrategy(new PercentageDiscount(20));
echo "Yüzdeli indirimli toplam: " . $cart->getTotal() . "\n";

// Sabit 30 indirim uygula
$cart->setDiscountStrategy(new FixedDiscount(30));
echo "Sabit indirimli toplam: " . $cart->getTotal() . "\n";




(Sonuc)


Yüzdeli indirimli toplam: 160
Sabit indirimli toplam: 170


Neden Strategy Kullanmalıyız?

  • if/else ya da switch bloklarından kurtulursun

  • Yeni strateji eklemek için mevcut kodu değiştirmen gerekmez

  • Temiz, test edilebilir ve esnek bir yapı elde edersin








Factory Pattern ile Nesne Üretimi


 

Yazılım dünyasında nesne oluşturmak sıradan bir iş gibi görünse de, doğru yerde, doğru şekilde nesne üretmek birçok projede kritik öneme sahiptir. İşte bu noktada Factory Pattern (Fabrika Deseni) devreye girer.

Bu yazıda, Factory Pattern nedir, ne işe yarar, hangi projelerde kullanılır ve PHP ile nasıl uygulanır adım adım öğreniyoruz.


Factory Pattern Nedir? (Basit ama Detaylı Anlatım)

Factory Pattern, nesne oluşturma (instance creation) işlemini sınıfın dışına çıkartarak, nesne üretme işini özel bir “fabrika” sınıfa devreden bir tasarım desenidir.


Neden ihtiyaç duyulur?

Kod içinde sürekli olarak new kullanarak farklı sınıflardan nesneler oluşturmak, kod tekrarına ve sıkı bağımlılığa (tight coupling) yol açar.

Factory deseni bu problemi çözer:

  • Nesne üretimi tek bir noktadan yapılır.

  • Yeni sınıflar eklense bile, kodun geri kalanı etkilenmez.

  • Değişiklikler merkezi olarak yönetilir.


Basit bir benzetme:

Bir pizzacıda sipariş geldiğinde her pizzayı mutfaktaki çalışan kendisi üretirse kaos olur. Bunun yerine siparişi alan kişi pizzayı mutfaktaki üretim bölümüne (fabrikaya) iletir. Üretim bölümü pizzayı hazırlar ve sunar.


Factory Pattern Ne İçin Kullanılır?

  • Sınıflar arası bağımlılığı azaltmak için

  • Karmaşık nesne üretim mantığını tek yerde toplamak için

  • Kodun genişletilebilirliğini artırmak için




Factory Pattern Kullanılan Proje Türleri

Proje TürüKullanım Örneği
🛒 E-Ticaret SiteleriFarklı kargo firmalarına göre sınıf üretimi
📄 Belge YönetimiPDF, Word, Excel gibi farklı formatlar
💳 Ödeme SistemleriKredi kartı, havale, PayPal gibi yöntemler
🔌 API BağlantılarıFarklı servisler için ayrı client nesneleri


PHP ile Factory Pattern Örneği

Senaryo: Kullanıcı farklı araç türleri oluşturmak istiyor (Araba, Motosiklet). Her araç kendi çalıştırma metoduna sahip. Factory deseniyle bu nesneleri dinamik oluşturacağız.

1.)

Bu interface (arayüz), tüm araç sınıflarının (örneğin Car, Motorcycle) ortak bir davranışı (burada: start()) zorunlu olarak içermesini sağlar.

Her araç start() metodunu mutlaka yazmak zorundadır. Aksi halde hata alırsın.



<?php
//Vehicle.php
interface Vehicle {
public function start();
}


2.)


<?php
//Car.php
require_once 'Vehicle.php';

class Car implements Vehicle {
public function start() {
echo "Araba çalıştırıldı 🚗\n";
}
}


3.)

<?php
//Motorcycle.php
require_once 'Vehicle.php';

class Motorcycle implements Vehicle {
public function start() {
echo "Motosiklet çalıştırıldı 🏍️\n";
}
}



4.)

<?php
//VehicleFactory.php
require_once 'Car.php';
require_once 'Motorcycle.php';

class VehicleFactory {
public static function createVehicle($type) {
switch (strtolower($type)) {
case 'car':
return new Car();
case 'motorcycle':
return new Motorcycle();
default:
throw new Exception("Geçersiz araç türü.");
}
}
}




5.)

<?php
//index.php
require_once 'VehicleFactory.php';

try {
$vehicle1 = VehicleFactory::createVehicle('car');
$vehicle1->start(); // Araba çalıştırıldı

$vehicle2 = VehicleFactory::createVehicle('motorcycle');
$vehicle2->start(); // Motosiklet çalıştırıldı
} catch (Exception $e) {
echo $e->getMessage();
}




Avantajları

✅ Kod tekrarını azaltır
✅ Genişletilebilir bir yapı sunar
✅ Karmaşık nesne oluşturma işlemleri kontrol altına alınır
✅ Test yazmayı kolaylaştırır


Neden Factory Kullanmalıyız?

Factory Pattern sayesinde yazdığın kod daha esnek, test edilebilir ve sürdürülebilir hale gelir. Özellikle birden fazla türde nesne üretimi yapılan uygulamalarda bu desenin kullanılması profesyonel bir yaklaşımdır.












Singleton Pattern: Ne İşe Yarar, Nasıl Kullanılır?



Modern yazılım geliştirme sürecinde kullanılan tasarım desenlerinden biri olan Singleton Pattern, özellikle tek bir nesne örneği ile çalışılması gereken durumlarda hayat kurtarıcıdır. Peki Singleton nedir, ne işe yarar, hangi projelerde kullanılır ve PHP ile nasıl yazılır? Tüm detaylarıyla öğreniyoruz.

Singleton Pattern Nedir?

Singleton Pattern, bir sınıftan yalnızca bir tane (tekil) nesne oluşturulmasına izin veren bir yazılım tasarım desenidir.

Bu desenle bir sınıfın:

  1. Tek bir örneği olur (instance)

  2. Bu örneğe global erişim sağlanır

🍵 Basit bir benzetme:

Bir projede sadece bir adet veritabanı bağlantısına ihtiyacınız varsa, her sayfa için yeniden bağlantı oluşturmak yerine tek bir örnek üzerinden işlem yapmak daha doğrudur. İşte Singleton burada devreye girer.


Singleton Ne İçin Kullanılır?

  • Veritabanı bağlantısı: Uygulama boyunca bir tane yeterlidir.

  • Logger (Kayıt tutucu): Tüm işlemler aynı günlük üzerinden yazılır.

  • Cache yönetimi: Tek merkezden önbellek işlemleri yapılır.

  • Uygulama ayarları (config): Tüm dosyalar aynı ayarları kullanır.


Singleton Kullanılan Gerçek Proje Türleri

Proje TürüKullanım Nedeni
🛒 E-Ticaret SistemleriVeritabanı bağlantısı, log yönetimi tekil olur
📊 Raporlama PanelleriTek noktadan veri çekme, kayıt tutma
🧠 Yapay Zeka UygulamalarıModel yüklemeleri tek örnekle yapılır
🧾 Fatura / Muhasebe YazılımlarıAyarlar ve oturum bilgileri tek örnekle tutulur


PHP ile Singleton Pattern Uygulaması

Aşağıda bir veritabanı sınıfı örneği ile Singleton yapısının nasıl çalıştığını gösteriyoruz.


<?php
/** Database.php */
class Database {
private static $instance = null;
private $connection;

// Constructor private: dışarıdan erişilemez
private function __construct() {
$this->connection = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');
}

// Sadece bir örnek döner
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new Database();
}
return self::$instance;
}

// Bağlantıyı dışarı verir
public function getConnection() {
return $this->connection;
}

// Clone edilmesi engellenir
private function __clone() {}
private function __wakeup() {}
}


Kullanımı:

<?php
/** index.php */
require_once 'Database.php';

// Singleton kullanımı
$db1 = Database::getInstance()->getConnection();
$db2 = Database::getInstance()->getConnection();

if ($db1 === $db2) {
echo "Aynı veritabanı bağlantısını kullanıyorlar.";
} else {
echo "Farklı bağlantılar.";
}


Singleton Kullanırken Dikkat Edilmesi Gerekenler

  • Global state yönetimi zordur. Çok fazla singleton kullanmak karışıklık yaratabilir.

  • Test yazımı zorlaşabilir. (Mocklama için ekstra çaba gerekebilir.)

  • Bağımlılık Enjeksiyonu (DI) ile birlikte dikkatli kullanılmalıdır.



Singleton Deseni Ne Sağlar?

  • Kaynak tüketimini azaltır (örneğin: çoklu veritabanı bağlantılarının önüne geçer)

  • Kontrolü merkezileştirir

  • Projenin belirli bölümlerinde tek bir kapıdan erişim sağlar

Eğer bir nesnenin sadece bir defa oluşturulması ve her yerde aynı kalması gerekiyorsa, Singleton en doğru seçimdir.








MVC (Model-View-Controller) Nedir? PHP İle Basit Uygulama Örneği

 MVC (Model-View-Controller) Nedir? PHP İle Basit Uygulama Örneği


Web geliştiriciliğine yeni başlayanların sıklıkla karşılaştığı terimlerden biri olan MVC, modern yazılım dünyasında düzenli ve sürdürülebilir projeler geliştirmenin temel taşıdır. Peki MVC nedir, neden kullanılır, hangi projelerde kullanılır ve PHP ile nasıl uygulanır? Hepsini bu öğretici yazıda detaylıca öğreniyoruz.


MVC Nedir? (Basit ama Detaylı Anlatım)

MVC, yazılım projelerini 3 ayrı katmana ayırarak düzenli bir yapı sunan bir yazılım desenidir:

1. Model (Veri Katmanı)

  • Veriler ve iş kurallarının yer aldığı bölümdür.

  • Genellikle veritabanı işlemleri burada yapılır.

  • Kullanıcı bilgisi, ürünler, blog yazıları gibi veriler burada yönetilir.

Örnek: Bir blog yazısını veritabanından çeken kodlar burada olur.


2. View (Görsel Katman)

  • Kullanıcıya gösterilen arayüzdür.

  • HTML, CSS, JavaScript burada yer alır.

  • Sadece veriyi gösterir, işlemez.

Örnek: Kullanıcının gördüğü "Son Blog Yazıları" sayfası.


3. Controller (Kontrol Katmanı)

  • Model ile View arasında köprü görevi görür.

  • Kullanıcının isteğini alır, işlemleri başlatır, uygun veriyi alır ve doğru görünümü yükler.

Örnek: Kullanıcı example.com/blog adresine gittiğinde, hangi yazılar gösterilecekse onu yöneten kontrol merkezi burasıdır.


MVC Ne İçin Kullanılır?

  • Kodları modüler hale getirir. (Her şey tek bir dosyada değil.)

  • Ekip çalışmasına uygundur: Frontend, Backend ayrı çalışabilir.

  • Projeler daha kolay büyütülebilir ve sürdürülebilir olur.

  • Hatalar daha hızlı tespit edilir ve düzeltilir.

  • Kod tekrarını (duplicate code) azaltır.


MVC Kullanılan Gerçek Proje Türleri

MVC mimarisi birçok farklı projede kullanılır:

Proje TürüKullanım Nedeni
🛒 E-ticaret SiteleriSipariş, ürün, kullanıcı modülleri ayrı çalışır
📝 Blog / Haber SiteleriYazı, kategori, yorum gibi yapılar yönetilir
📊 Yönetim PanelleriKullanıcı rolleri, istatistikler ayrılır
📱 API Tabanlı UygulamalarVeriler modelde tutulur, JSON ile sunulur


PHP ile MVC Uygulama (Adım Adım Örnek)

/mvc-blog

├── index.php

├── controller/

│   └── BlogController.php

├── model/

│   └── Blog.php

├── view/

│   └── blogList.php


1. index.php


<?php
//Ana giriş noktası. Controller’ı çağırır.
require_once 'controller/BlogController.php';

$controller = new BlogController();
$controller->index();


2. controller/BlogController.php


<?php
require_once 'model/Blog.php';

class BlogController {
public function index() {
$blog = new Blog();
$posts = $blog->getAllPosts();
require 'view/blogList.php';
}
}


3. model/Blog.php


<?php
class Blog {
public function getAllPosts() {
// Örnek sabit veri. Gerçekte veritabanından çekilir.
return [
['title' => 'MVC Nedir?', 'content' => 'MVC, yazılım dünyasında düzen sağlar.'],
['title' => 'PHP ile MVC Yapısı', 'content' => 'Controller, Model, View üçlüsü.']
];
}
}


4. view/blogList.php


<!DOCTYPE html>
<html>
<head>
<title>Blog Yazıları</title>
</head>
<body>
<h1>Blog Yazıları</h1>
<?php foreach ($posts as $post): ?>
<h2><?= $post['title'] ?></h2>
<p><?= $post['content'] ?></p>
<?php endforeach; ?>
</body>
</html>


MVC Öğrenmek Neden Önemli?

MVC, projelerinizi sadece daha düzenli hale getirmekle kalmaz, aynı zamanda mesleki kariyerinizde ileri seviye projelere geçiş yapabilmenizi sağlar. Laravel, Symfony gibi modern PHP framework’leri de zaten MVC mimarisi üzerine kuruludur.

Yeni bir proje geliştiriyorsanız veya profesyonel olmak istiyorsanız, MVC öğrenmek bir zorunluluk diyebiliriz.











PHP Redis Form Veri Depolama ve Alma İşlemi

 PHP Redis Form Veri Depolama ve Alma İşlemi


Redis: GET, SET

<?php
try{
$redis = new Redis();
$redis->connect('redis', 6379);
$redis->auth('mypassword');

if(isset($_POST['name'])){
$redis->set('name', $_POST['name']);
}
}
catch (Exception $e){
echo $e->getMessage();
}
?>
<html>
<head></head>
<body>
<strong>Basit Form</strong>
<br>
<form action="php_form_redis.php" method="post">
<input type="text" name="name">
<input type="submit" value="Kaydet">
</form>
<br>
<?php
echo 'redis database okunan değer:'. $redis->get('name');
?>
</body>
</html>