SSL Sertifikası + Sınırsız İçerik + Full SEO Uyumlu + Full Mobil Uyumlu.
Üstelik İsterseniz Yapay Zeka Hukuk Asistanı Seçeneğiyle
PHP OOP'ta Tasarım Kalıpları ve Kullanımları
PHP OOP, yani PHP Nesne Yönelimli Programlama, günümüzde popüler olan bir programlama paradigmasıdır. Bu yaklaşım, yazılım projelerinin daha yönetilebilir, ölçeklenebilir ve bakımı daha kolay olmasını sağlar. Bu yaklaşım, bir çok tasarım kalıbının kullanımına da olanak sağlar. Tasarım kalıpları, kodların yeniden kullanılabilir olmasını sağlamaktadır.
Bu yazıda başlıca dört OOP tasarım kalıbı incelenecektir:
1. Singleton Tasarım Kalıbı
2. Strategy Tasarım Kalıbı
3. Factory Tasarım Kalıbı
4. Decorator Tasarım Kalıbı
1. Singleton Tasarım Kalıbı
Singleton, sadece bir nesnenin oluşturulmasını sağlayan bir tasarım kalıbıdır. İhtiyaç duyulan sınıftan sadece bir örnek alınarak bu örneği kullanabilirsiniz. Bu, gereksiz hafıza tüketimini önler. Örneğin, veritabanı bağlantısı için Singleton kullanabilirsiniz. Bu şekilde, aynı anda birden fazla veritabanı bağlantısı açarak sunucunuzun performansını düşürmezsiniz.
Aşağıdaki gibi bir singleton örneği ile bir sınıfın nasıl tasarlandığına bakalım:
```php
class SingletonDB {
private static $instance = null;
private $DB = null;
public static function getInstance() {
if(self::$instance === null) {
self::$instance = new SingletonDB();
}
return self::$instance;
}
private function __construct() {
$this->DB = new mysqli('localhost', 'admin', 'password', 'test');
}
public function getDB() {
return $this->DB;
}
}
```
Burada, SingletonDB adında bir sınıf tanımlandı. Sınıfın yapısında aşağıdaki üç farklı yapısal özellik bulunmaktadır:
• getInstance(): Bu yöntem, Sınıfın statik bir örneği olduğu için, bu yöntem yalnızca statik bir nesne içinde doğrudan veya örnek bir nesne tarafından çağrılabilir. Bu yöntemin amacı, yalnızca bir örnek oluşturmaktır ve başka örneklerin oluşturulmasını engellemektir.
• __construct(): Yapılandırıcı öğe, örneğinin oluşturulduğunda çağrılır. Veritabanı bağlantısı bu fonksiyonda yer almaktadır.
• getDB(): Bu yöntem, sınıf dışındaki metotlar tarafından fonksiyonlaştırılsa da, yapılandırılmış sınıf örneği cPanel için bir bağlantı sağlar ve veritabanına erişim sağlar.
2. Strategy Tasarım Kalıbı
Strateji tasarım kalıbı, belirli davranışları gruplarına ayıran bir tasarım kalıbıdır. Böylece, her grup farklı bir yöntemle uygulanabilir. Bu kalıp, düzenlenebilir kodlar yazmaya yardımcı olur.
Örnek olarak bir ödeme sistemi oluşturabiliriz. Ürünler için ödeme almak için farklı ödeme yöntemleri kullanarak belirli düzeylerde indirim sağlanabilir.
```php
interface PaymentMethod {
public function getDiscount($amount);
public function pay($amount);
}
class CreditCard implements PaymentMethod {
private $discount;
public function __construct($discount) {
$this->discount = $discount;
}
public function getDiscount($amount) {
return ($amount * $this->discount) / 100;
}
public function pay($amount) {
echo \"Pay \" . ($amount - $this->getDiscount($amount)) . \" using Credit Card\";
}
}
class PayPal implements PaymentMethod {
private $fee;
public function __construct($fee) {
$this->fee = $fee;
}
public function getDiscount($amount) {
return 0;
}
public function pay($amount) {
$total = $amount + ($amount * $this->fee) / 100;
echo \"Pay \" . $total . \" using PayPal\";
}
}
class PaymentController {
private $paymentMethod;
public function __construct(PaymentMethod $paymentMethod) {
$this->paymentMethod = $paymentMethod;
}
public function checkout($amount) {
$this->paymentMethod->pay($amount);
}
}
$paymentMethod = new CreditCard(10);
$paymentController = new PaymentController($paymentMethod);
$paymentController->checkout(100); // Pay 90 using Credit Card
$paymentMethod = new PayPal(3.5);
$paymentController = new PaymentController($paymentMethod);
$paymentController->checkout(100); // Pay 103.5 using PayPal
```
Burada, bu ödemelerin gerçekleşmesi için iki sınıf oluşturuldu: CreditCard ve PayPal. Her iki sınıfta da uygulanması gereken aynı iki yönteme sahip olacak şekilde bir arayüz olan PaymentMethod tanımlandı.
PaymentController sınıfı, PaymentMethod arayüzünü uygulayan bir nesne alır. Bu yapı, herhangi bir ödeme yöntemini kullanabilir ve her yöntemin algoritmasını getDiscount ve methodName için değiştirebiliriz.
3. Factory Tasarım Kalıbı
Fabrika tasarım kalıbı, istemci kodunun nesne oluşturma sürecinden uzaklaşmasını sağlar. Nesne oluşturma süreci bir sınıfından farklı sınıflara bağlı olan kodlardaki değişikliklerle mümkündür. Ayrıca, nesnelerin özelliklerini ve arayüzünü belirleyen bir yönetim tipi de sağlar.
Aşağıdaki gibi bir factory örneği ile bir sınıfın nasıl tasarlandığına bakalım:
```php
interface Car {
public function setMake($make);
public function setModel($model);
}
class Audi implements Car {
private $make;
private $model;
public function setMake($make) {
$this->make = $make;
}
public function setModel($model) {
$this->model = $model;
}
public function getMake() {
return $this->make;
}
public function getModel() {
return $this->model;
}
}
class BMW implements Car {
private $make;
private $model;
public function setMake($make) {
$this->make = $make;
}
public function setModel($model) {
$this->model = $model;
}
public function getMake() {
return $this->make;
}
public function getModel() {
return $this->model;
}
}
class CarFactory {
public static function create($make) {
$car = null;
switch ($make) {
case 'audi':
$car = new Audi();
break;
case 'bmw':
$car = new BMW();
break;
}
return $car;
}
}
$car = CarFactory::create('audi');
$car->setMake('Audi');
$car->setModel('A6');
echo $car->getMake() . ' ' . $car->getModel(); // Audi A6
$car = CarFactory::create('bmw');
$car->setMake('BMW');
$car->setModel('X5');
echo $car->getMake() . ' ' . $car->getModel(); // BMW X5
```
Bu örnekte, Car adında bir arabalar arayüzü tanımlandı ve Audi ve BMW araçları bu arayüzü uyguladı. CarFactory sınıfı, create() yöntemine yazılan parametreyle yeni bir araç örneği oluşturur. CarFactory sınıfımız, tüm arabaların yaratım sürecinde koda entegre olmuş bir yapıya sahiptir.
4. Decorator Tasarım Kalıbı
Dekoratör tasarım kalıbı, istemci kodunda değişiklik yapmadan nesnelerin davranışlarını genişletmenizi sağlar. Bu tasarım kalıbı, yalnızca müşterinin hangi dekorasyon tabakasını istediğine karar vermekle kalmaz, aynı zamanda nesnenin modelini yazılım modeli yapısına sahip olarak sadeleştirir.
```php
interface CarService {
public function getCost();
public function getDescription();
}
class BasicInspection implements CarService {
public function getCost() {
return 25;
}
public function getDescription() {
return 'Basic Inspection';
}
}
class OilChange implements CarService {
protected $carService;
public function __construct(CarService $carService) {
$this->carService = $carService;
}
public function getCost() {
return 29 + $this->carService->getCost();
}
public function getDescription() {
return $this->carService->getDescription() . ', and Oil Change';
}
}
class TireRotation implements CarService {
protected $carService;
public function __construct(CarService $carService) {
$this->carService = $carService;
}
public function getCost() {
return 15 + $this->carService->getCost();
}
public function getDescription() {
return $this->carService->getDescription() . ', and Tire Rotation';
}
}
$service = new BasicInspection();
$service = new OilChange($service);
$service = new TireRotation($service);
echo $service->getDescription() . \" \" . $service->getCost(); // Basic Inspection, and Oil Change, and Tire Rotation 69
```
Burada, CarService adında bir arabalar arayüzü tanımlandı ve BasicInspection, OilChange ve TireRotation arabaları bu arayüzü uyguladı. Bu örnek, $ service = new BasicInspection() ile başlar ve $ service'a OilChange ve TireRotation arabaları atanır. Her seferinde, içinde yürüyen yeni bir yapı boyunca yeni bir arabayı atayan yöntemler ekledik.
Sıkça Sorulan Sorular
1- Tasarım kalıpları neden önemlidir?
Tasarım kalıpları, yeniden kullanılabilir kodlar oluşturmanıza ve okunması, yönetilmesi ve ölçeklendirilmesi daha kolay olan yapılar oluşturmanıza olanak tanır.
2- Tasarım kalıplarının sakıncaları var mı?
Tasarım kalıpları kullanılırken, bu tasarım kalıplarının doğru kullanılmadığı veya gereksiz yere kullanıldığı zaman kod karmaşıklığına neden olabilir.
3- Singleton Tasarım Kalıbı kullanmam gerekiyor mu?
Singleton tasarım kalıbı, özellikle belirli örnekler için sınırlı bir sayıda gerekli olduğunda çok yararlı olabilir. Ancak, gereksiz kullanımı bir uygulamanın performansını düşürebilir.
4- Factory Tasarım Kalıbı, nesne yaratımındaki tekrarlanan kodların azaltılmasına yardımcı olur mu?
Factory tasarım kalıbı, nesne oluşturma sürecindeki tekrarlanan kod parçalarının önüne geçer ve kodun daha anlaşılır ve düzenli olmasını sağlar.
5- Dekoratör tasarım kalıbının avantajları nelerdir?
Dekoratör tasarım kalıbı, bir nesnenin davranışını değiştirmek istediğinizde, istemci kodda en ufak bir değişiklik yapmadan yapabildiğiniz kolay ve esnek bir mekanizma sunar."
PHP OOP'ta Tasarım Kalıpları ve Kullanımları
PHP OOP, yani PHP Nesne Yönelimli Programlama, günümüzde popüler olan bir programlama paradigmasıdır. Bu yaklaşım, yazılım projelerinin daha yönetilebilir, ölçeklenebilir ve bakımı daha kolay olmasını sağlar. Bu yaklaşım, bir çok tasarım kalıbının kullanımına da olanak sağlar. Tasarım kalıpları, kodların yeniden kullanılabilir olmasını sağlamaktadır.
Bu yazıda başlıca dört OOP tasarım kalıbı incelenecektir:
1. Singleton Tasarım Kalıbı
2. Strategy Tasarım Kalıbı
3. Factory Tasarım Kalıbı
4. Decorator Tasarım Kalıbı
1. Singleton Tasarım Kalıbı
Singleton, sadece bir nesnenin oluşturulmasını sağlayan bir tasarım kalıbıdır. İhtiyaç duyulan sınıftan sadece bir örnek alınarak bu örneği kullanabilirsiniz. Bu, gereksiz hafıza tüketimini önler. Örneğin, veritabanı bağlantısı için Singleton kullanabilirsiniz. Bu şekilde, aynı anda birden fazla veritabanı bağlantısı açarak sunucunuzun performansını düşürmezsiniz.
Aşağıdaki gibi bir singleton örneği ile bir sınıfın nasıl tasarlandığına bakalım:
```php
class SingletonDB {
private static $instance = null;
private $DB = null;
public static function getInstance() {
if(self::$instance === null) {
self::$instance = new SingletonDB();
}
return self::$instance;
}
private function __construct() {
$this->DB = new mysqli('localhost', 'admin', 'password', 'test');
}
public function getDB() {
return $this->DB;
}
}
```
Burada, SingletonDB adında bir sınıf tanımlandı. Sınıfın yapısında aşağıdaki üç farklı yapısal özellik bulunmaktadır:
• getInstance(): Bu yöntem, Sınıfın statik bir örneği olduğu için, bu yöntem yalnızca statik bir nesne içinde doğrudan veya örnek bir nesne tarafından çağrılabilir. Bu yöntemin amacı, yalnızca bir örnek oluşturmaktır ve başka örneklerin oluşturulmasını engellemektir.
• __construct(): Yapılandırıcı öğe, örneğinin oluşturulduğunda çağrılır. Veritabanı bağlantısı bu fonksiyonda yer almaktadır.
• getDB(): Bu yöntem, sınıf dışındaki metotlar tarafından fonksiyonlaştırılsa da, yapılandırılmış sınıf örneği cPanel için bir bağlantı sağlar ve veritabanına erişim sağlar.
2. Strategy Tasarım Kalıbı
Strateji tasarım kalıbı, belirli davranışları gruplarına ayıran bir tasarım kalıbıdır. Böylece, her grup farklı bir yöntemle uygulanabilir. Bu kalıp, düzenlenebilir kodlar yazmaya yardımcı olur.
Örnek olarak bir ödeme sistemi oluşturabiliriz. Ürünler için ödeme almak için farklı ödeme yöntemleri kullanarak belirli düzeylerde indirim sağlanabilir.
```php
interface PaymentMethod {
public function getDiscount($amount);
public function pay($amount);
}
class CreditCard implements PaymentMethod {
private $discount;
public function __construct($discount) {
$this->discount = $discount;
}
public function getDiscount($amount) {
return ($amount * $this->discount) / 100;
}
public function pay($amount) {
echo \"Pay \" . ($amount - $this->getDiscount($amount)) . \" using Credit Card\";
}
}
class PayPal implements PaymentMethod {
private $fee;
public function __construct($fee) {
$this->fee = $fee;
}
public function getDiscount($amount) {
return 0;
}
public function pay($amount) {
$total = $amount + ($amount * $this->fee) / 100;
echo \"Pay \" . $total . \" using PayPal\";
}
}
class PaymentController {
private $paymentMethod;
public function __construct(PaymentMethod $paymentMethod) {
$this->paymentMethod = $paymentMethod;
}
public function checkout($amount) {
$this->paymentMethod->pay($amount);
}
}
$paymentMethod = new CreditCard(10);
$paymentController = new PaymentController($paymentMethod);
$paymentController->checkout(100); // Pay 90 using Credit Card
$paymentMethod = new PayPal(3.5);
$paymentController = new PaymentController($paymentMethod);
$paymentController->checkout(100); // Pay 103.5 using PayPal
```
Burada, bu ödemelerin gerçekleşmesi için iki sınıf oluşturuldu: CreditCard ve PayPal. Her iki sınıfta da uygulanması gereken aynı iki yönteme sahip olacak şekilde bir arayüz olan PaymentMethod tanımlandı.
PaymentController sınıfı, PaymentMethod arayüzünü uygulayan bir nesne alır. Bu yapı, herhangi bir ödeme yöntemini kullanabilir ve her yöntemin algoritmasını getDiscount ve methodName için değiştirebiliriz.
3. Factory Tasarım Kalıbı
Fabrika tasarım kalıbı, istemci kodunun nesne oluşturma sürecinden uzaklaşmasını sağlar. Nesne oluşturma süreci bir sınıfından farklı sınıflara bağlı olan kodlardaki değişikliklerle mümkündür. Ayrıca, nesnelerin özelliklerini ve arayüzünü belirleyen bir yönetim tipi de sağlar.
Aşağıdaki gibi bir factory örneği ile bir sınıfın nasıl tasarlandığına bakalım:
```php
interface Car {
public function setMake($make);
public function setModel($model);
}
class Audi implements Car {
private $make;
private $model;
public function setMake($make) {
$this->make = $make;
}
public function setModel($model) {
$this->model = $model;
}
public function getMake() {
return $this->make;
}
public function getModel() {
return $this->model;
}
}
class BMW implements Car {
private $make;
private $model;
public function setMake($make) {
$this->make = $make;
}
public function setModel($model) {
$this->model = $model;
}
public function getMake() {
return $this->make;
}
public function getModel() {
return $this->model;
}
}
class CarFactory {
public static function create($make) {
$car = null;
switch ($make) {
case 'audi':
$car = new Audi();
break;
case 'bmw':
$car = new BMW();
break;
}
return $car;
}
}
$car = CarFactory::create('audi');
$car->setMake('Audi');
$car->setModel('A6');
echo $car->getMake() . ' ' . $car->getModel(); // Audi A6
$car = CarFactory::create('bmw');
$car->setMake('BMW');
$car->setModel('X5');
echo $car->getMake() . ' ' . $car->getModel(); // BMW X5
```
Bu örnekte, Car adında bir arabalar arayüzü tanımlandı ve Audi ve BMW araçları bu arayüzü uyguladı. CarFactory sınıfı, create() yöntemine yazılan parametreyle yeni bir araç örneği oluşturur. CarFactory sınıfımız, tüm arabaların yaratım sürecinde koda entegre olmuş bir yapıya sahiptir.
4. Decorator Tasarım Kalıbı
Dekoratör tasarım kalıbı, istemci kodunda değişiklik yapmadan nesnelerin davranışlarını genişletmenizi sağlar. Bu tasarım kalıbı, yalnızca müşterinin hangi dekorasyon tabakasını istediğine karar vermekle kalmaz, aynı zamanda nesnenin modelini yazılım modeli yapısına sahip olarak sadeleştirir.
```php
interface CarService {
public function getCost();
public function getDescription();
}
class BasicInspection implements CarService {
public function getCost() {
return 25;
}
public function getDescription() {
return 'Basic Inspection';
}
}
class OilChange implements CarService {
protected $carService;
public function __construct(CarService $carService) {
$this->carService = $carService;
}
public function getCost() {
return 29 + $this->carService->getCost();
}
public function getDescription() {
return $this->carService->getDescription() . ', and Oil Change';
}
}
class TireRotation implements CarService {
protected $carService;
public function __construct(CarService $carService) {
$this->carService = $carService;
}
public function getCost() {
return 15 + $this->carService->getCost();
}
public function getDescription() {
return $this->carService->getDescription() . ', and Tire Rotation';
}
}
$service = new BasicInspection();
$service = new OilChange($service);
$service = new TireRotation($service);
echo $service->getDescription() . \" \" . $service->getCost(); // Basic Inspection, and Oil Change, and Tire Rotation 69
```
Burada, CarService adında bir arabalar arayüzü tanımlandı ve BasicInspection, OilChange ve TireRotation arabaları bu arayüzü uyguladı. Bu örnek, $ service = new BasicInspection() ile başlar ve $ service'a OilChange ve TireRotation arabaları atanır. Her seferinde, içinde yürüyen yeni bir yapı boyunca yeni bir arabayı atayan yöntemler ekledik.
Sıkça Sorulan Sorular
1- Tasarım kalıpları neden önemlidir?
Tasarım kalıpları, yeniden kullanılabilir kodlar oluşturmanıza ve okunması, yönetilmesi ve ölçeklendirilmesi daha kolay olan yapılar oluşturmanıza olanak tanır.
2- Tasarım kalıplarının sakıncaları var mı?
Tasarım kalıpları kullanılırken, bu tasarım kalıplarının doğru kullanılmadığı veya gereksiz yere kullanıldığı zaman kod karmaşıklığına neden olabilir.
3- Singleton Tasarım Kalıbı kullanmam gerekiyor mu?
Singleton tasarım kalıbı, özellikle belirli örnekler için sınırlı bir sayıda gerekli olduğunda çok yararlı olabilir. Ancak, gereksiz kullanımı bir uygulamanın performansını düşürebilir.
4- Factory Tasarım Kalıbı, nesne yaratımındaki tekrarlanan kodların azaltılmasına yardımcı olur mu?
Factory tasarım kalıbı, nesne oluşturma sürecindeki tekrarlanan kod parçalarının önüne geçer ve kodun daha anlaşılır ve düzenli olmasını sağlar.
5- Dekoratör tasarım kalıbının avantajları nelerdir?
Dekoratör tasarım kalıbı, bir nesnenin davranışını değiştirmek istediğinizde, istemci kodda en ufak bir değişiklik yapmadan yapabildiğiniz kolay ve esnek bir mekanizma sunar."
*256 Bit SSL Sertifikası * Full Mobil Uyumlu * Full SEO Uyumlu
İsterseniz Mobil Uygulama Seçeneğiyle