PHP OOP'ta Tasarım Kalıpları ve Kullanımları hakkında her şey bu makalede! Obje yönelimli programlama oluşturma sürecinde tasarım kalıplarının önemi ve doğru kullanımı anlatılıyor Detaylı bilgi için tıklayın!

Bir programlama dili olarak PHP, nesne yönelimli programlama (OOP) konseptlerini destekler ve tasarım kalıpları da dahil olmak üzere belirli programlama problemlerini çözmek için çeşitli araçlara sahiptir. Bu makalede, OOP prensipleri ile birlikte tasarım kalıplarını ele alacağız.
Tasarım kalıpları, belirli bir programlama problemine yönelik genel çözüm önerileridir. Bu kalıplar, kodun daha organize, ölçeklenebilir ve yeniden kullanılabilir olmasını sağlar ve tekrarlanan problemler için daha hızlı çözümler sunar. Her tasarım kalıbı kendi özelliklerine sahip olmakla birlikte, hepsi programlama zorluklarını kolaylaştırmak için tasarlanmıştır.
Tasarım Kalıplarına Giriş
Tasarım kalıpları, tekrar tekrar karşılaşılan programlama problemlerine çözüm sunan, denenmiş ve test edilmiş bir dizi yöntemdir. Bu kalıplar, yazılım geliştirme sürecinde kullanılan çözümleri standardize eder, daha öngörülebilir ve ölçeklenebilir bir kod yazmanızı sağlar.
Tasarım kalıpları, ilk kez Christopher Alexander tarafından mimaride tanıtılmıştır. Yazılım endüstrisi için kullanılmaları ise 1980'lerde başlamıştır. O zamandan beri tasarım kalıpları, yazılım geliştiriciler için çok önemli bir araç haline geldi. Bu kalıplar yazılım geliştiricilerin, uygulamalarını daha hızlı ve verimli bir şekilde yazabilmelerine yardımcı olur.
Tasarım kalıplarının önemi, yazılımdaki gereksiz kod tekrarlarının önlenmesi, kod tekrarı ve hatalarının azaltılması, kod okunabilirliğinin artırılması, kodun daha esnek hale getirilmesi ve ölçeklenebilirliğinin artırılması gibi konuları içermektedir. Tasarım kalıpları, uygulamanızdaki değişikliklerin yönetilmesini, daha kolay bir şekilde test edilmesini ve sürdürülebilirliğini sağlar. Bu nedenle, tasarım kalıplarının kullanımı yazılım geliştiriciler için büyük bir avantajdır.
Creational Tasarım Kalıpları
Creational tasarım kalıpları, bir nesne örneğini oluştururken ve yaratım sürecinde nasıl davranılacağını belirleyen tasarım kalıplarına verilen addır. Bu tasarım kalıpları bir nesnenin yaratılması, farklı alt sınıfların nesnelerinin yaratılması veya nesnelerin yaratılmasının yaratıcısı olarak davranır.
Bu tasarım kalıpları beş türde olabilir:
- Singleton Tasarım Kalıbı
- Factory Method Tasarım Kalıbı
- Abstract Factory Tasarım Kalıbı
- Builder Tasarım Kalıbı
- Prototype Tasarım Kalıbı
Singleton tasarım kalıbı, bir sınıfın yalnızca bir örneğinin oluşturulmasını sağlar. Factory Method tasarım kalıbı ise, nesne yaratma işlemini alt sınıflara taşır ve bu şekilde uygulama genişleyebilir. Abstract Factory tasarım kalıbı, uygulamanın alt sistemleri arasındaki uyumu sağlamak için kullanılır. Builder tasarım kalıbı, basit yapılandırıcı sınıfının karmaşık nesneleri oluşturmasına yardımcı olur. Prototype tasarım kalıbı, yeni bir nesnenin özelliklerinin varolan bir nesneden alınmasını sağlar.
Bu kalıplar, nesne yaratım işlemlerini merkezi bir yerde tutarak uygulamanın daha kolay okunmasını, bakımını ve gelişimini sağlar. Bu tasarım kalıpları oluşturulan nesnenin özelliklerine göre özelleştirebilir, genişletebilir ve değiştirebilir. Bu nedenle, uygulanacak tasarım kalıbının seçimi uygulamanın gereksinimlerine, kullanım sahnesine, tasarım ve yürütme sırasındaki hatalara ve işlemler boyunca oluşabilecek hatalara bağlıdır.
Singleton Tasarım Kalıbı
Singleton tasarım kalıbı, creational tasarım kalıplarının bir türüdür ve sadece bir kez nesne oluşturulmasını sağlar. Bu, nesneye erişim sınırlamaları getirerek nesnenin tekrarlanan oluşturulmalarına karşı koruma sağlar.
Bir sınıfın yalnızca bir örneğinin oluşturulmasına izin veren singleton tasarım kalıbı, uygulama boyunca yalnızca bir tane nesne oluşturulmasına izin verir ve diğer sınıfların bu nesneyi kullanmasına izin verir. Bu tasarım kalıbı, genellikle örnek oluşturma maliyetleri yüksek olan sınıflarda kullanılır ve uygulamanın performansını artırır.
Bir örnekle açıklamak gerekirse, bir veritabanı bağlantısı oluştururken singleton tasarım kalıbı kullanılabilir. Veritabanı bağlantısı oluşturmak, performansı olumsuz etkileyebilen maliyetli bir işlemdir. Bu nedenle, uygulama boyunca yalnızca bir tane veritabanı bağlantısı oluşturulması ve diğer sınıfların bu tek nesneyi kullanması sağlanabilir.
Avantajlar | Dezavantajlar |
---|---|
- Performansı artırır | - Geniş bir uygulama için karmaşıklaşabilir |
- Nesneye erişimi kontrol altına alır | - Test edilebilirliği azaltabilir |
- Tekrar oluşturma maliyetlerinden kaçınır | - Nesneye fazla bağımlılık yaratabilir |
Factory Method Tasarım Kalıbı
Factory method tasarım kalıbı, bir üst sınıfın abstract bir yöntemini kullanarak nesnelerin oluşturulmasını sağlayan bir tasarım kalıbıdır. Bu yöntem, nesne oluşturma işleminin alt sınıflara devredilmesine izin verir ve alt sınıflar, üst sınıf tarafından sağlanan protokole uygun olarak nesneleri oluşturabilir.
Factory method tasarım kalıbının farklı türleri vardır. Bunlardan biri, 'simple factory' dir. Bu tür, tüm alt sınıfların nesne yaratma işlemlerini tek bir sınıfa devrettiği bir yapıdır. Diğer bir tür ise 'factory method', alt sınıfların nesne yaratma işlemlerini kendilerinin yapabildiği bir yapıdır. Üçüncü tür olarak 'abstract factory' tasarım kalıbı vardır. Bu tür, birbirine bağımlı nesnelerin oluşturulması için bir arayüz sağlar ve alt sınıflar, bu arayüzü kullanarak uygun nesneleri yaratabilir.
Factory method tasarım kalıbı, nesnelerin oluşturulması esnasında çeşitli kararlar vermek ve özelleştirmeler yapmak istediğimizde faydalıdır. Örneğin, bir mobil cihaz uygulaması geliştiriyorsak ve ekran boyutlarına göre farklı gösterimler yapmak istiyorsak, factory method tasarım kalıbını kullanabiliriz. Bu sayede, her bir ekran boyutu için farklı sınıflar oluşturabilir ve kullanıcı deneyimini optimize edebiliriz.
Örnek olarak, bir e-ticaret uygulaması düşünelim. Ürünlerin farklı kategorileri, farklı özelliklere ve detaylara sahip olabilir. Factory method tasarım kalıbını kullanarak, her ürün kategorisinin kendine özgü bir sınıfı olabilir ve her sınıf, kategorinin özelliklerine göre ürün detaylarını hazırlayabilir. Böylece, uygulamanın esnekliği artar ve yeni ürün kategorileri eklendiğinde kolayca adapte olabilir.
Abstract Factory Tasarım Kalıbı
Abstract Factory tasarım kalıbı, diğer birçok tasarım kalıbı gibi creational tasarım kalıplarına dahildir ve birden fazla objeden oluşan bir grup nesnenin oluşturma süreciyle ilgilenir. Fakat farklı olarak, tek bir fabrika sınıfını kullanarak aynı ailedeki nesnelerin oluşturulmasını sağlar.
Bu tasarım kalıbı, uygulamanızda bir nesne ailesi oluşturmanız gereken durumlarda özellikle yararlıdır. Bu nesne ailesi, sınırlı sayıda birbirleriyle ilişkili nesnelerden oluşur ve bu nesnelerin birbirleriyle nasıl etkileşime girdiği konusunda endişelenmenizi gerektirir. Abstract Factory tasarım kalıbı, bu endişeleri ortadan kaldırarak sadece belirli bir nesne ailesinin oluşturulmasını sağlar.
Bir örnek verecek olursak, bir web uygulaması geliştirirken HTML, CSS ve JavaScript kodlarının bir arada çalışmasını gerektiren durumlarda Abstract Factory tasarım kalıbı kullanılabilir. Bu durumda bu üç dilin aynı anda kullanılmaya başlaması sınırlı sayıda birbirleriyle ilişkili nesnelerin oluşturulmasını gerektirir ve böyle bir durumda Abstract Factory tasarım kalıbının kullanımı oldukça uygun olacaktır.
Abstract Factory tasarım kalıbının kullanımı, belirli bir nesne ailesini oluşturmak istediğimizde, var olan objeleri değiştirerek veya sınıfları değiştirerek ortaya çıkan çözümlerden daha iyidir. Var olan objelerde bir değişiklik yaptığımızda tüm projeleri kontrol etmemiz gerekebilir ve bu işlem oldukça zahmetli olabilir. Fakat Abstract Factory tasarım kalıbı kullanarak oluşturduğumuz modül, sistemimizdeki birçok yerde kullanılabilecek ve uygulamalarımızı daha esnek hale getirecektir.
Structural Tasarım Kalıpları
Structural tasarım kalıpları, nesneler arasındaki ilişkileri ve bunların yapılarını ele alır. Bu tasarım kalıpları, birçok farklı amaç için kullanılabilir. Örneğin, sistemdeki nesneler arasındaki bağımlılığı azaltmak, nesnelerin yeniden kullanılabilirliğini artırmak veya birden çok nesne arasındaki etkileşimi kolaylaştırmak için kullanılabilir.
Bu tasarım kalıplarının en yaygın örnekleri arasında Decorator, Adapter, Proxy, Composite ve Facade yer alır. Bu tasarım kalıplarının her biri farklı amaçlar için kullanılabilir ve benzersiz özelliklere sahiptir.
Decorator tasarım kalıbı, nesnelere dinamik olarak işlevsellik eklemek için kullanılır. Örneğin, bir nesnenin davranışını değiştirmeden ona yeni özellikler eklemek isteyebilirsiniz. Adapter tasarım kalıbı ise mevcut bir sınıfı başka bir sınıfın kullanabileceği şekle getirmek için kullanılır. Böylece farklı sınıfların birbirleriyle uyumlu hale getirilmesi mümkün hale gelir.
Proxy tasarım kalıbı, nesne üzerinde işlem yapmak isteyen nesneleri temsil etmek için kullanılır. Bu tasarım kalıbı, bir nesnenin yerine geçebilen farklı bir nesne oluşturulmasına izin verir. Composite tasarım kalıbı ise, nesneleri hiyerarşik bir yapıya sokmak için kullanılır. Bu şekilde, ağaç benzeri bir yapıda nesneleri organize etmek mümkün olur.
Facade tasarım kalıbı ise, büyük ve karmaşık bir sistemi basitleştirmek için kullanılır. Bu tasarım kalıbı, karmaşık bir sistemin karmaşık yapısını gizleyerek, sistemi daha anlaşılabilir ve kullanılabilir hale getirir.
Bir PHP uygulaması geliştirirken, bu tasarım kalıplarını kullanarak daha modüler ve daha okunaklı bir kod yazabilirsiniz. Bu sayede kodun geliştirilmesi ve bakımı daha kolay olacaktır.
Decorator Tasarım Kalıbı
Decorator tasarım kalıbı, bir nesneye eklenen davranışlarla ilgilenen bir tasarım kalıbıdır. Bu kalıpta, bir sınıfın davranışı, diğer nesneler tarafından işlevsellik ekleyen bir dizi sınıf tarafından değiştirilebilir. Bu şekilde, kodun genişletilebilirliği artar ve değişiklikler daha kolay yapılabiliyor.
Bu kalıp, var olan bir sınıfı yeni bir sınıf oluşturarak değiştirmeyi ve işlevsellik eklemeyi sağlar. Bu sayede, değişiklikler kodun başka yerlerindeki kullanımlarını etkilemez ve uygulama daha esnek olur. Decorator tasarım kalıbı ayrıca, farklı özelliklere sahip nesnelerin bir arada kullanılması gerektiği durumlarda da kullanılır.
Bir kod örneğiyle açıklayacak olursak, düz metin yazdırma işlevselliği olan bir sınıfımız varsa ve bu sınıfa renkli yazdırma özelliğini eklememiz gerekiyorsa, yeni bir renkli yazdırma sınıfı oluştururuz ve bu sınıfı özgün düz yazdırma sınıfı ile dekore ederiz. Bu şekilde, herhangi bir değişiklikte özgün sınıfta bir değişiklik yapmak zorunda kalmayız. İşlevselliği genişletebilmek için sadece yeni bir sınıf oluşturup, renkli yazdırma sınıfı ile dekore ederiz.
Avantajları | Dezavantajları |
---|---|
-Kodun genişletilebilirliğini artırır | -Fazla kullanımı, karmaşık kod yaratabilir |
-Değişiklikler kodun başka yerlerindeki kullanımlarını etkilemez | -Birden fazla decorator sınıfı kullandığı zaman performans düşüklüğü sorunu oluşabilir |
Adapter Tasarım Kalıbı
Adapter tasarım kalıbı, farklı nesne arayüzlerinin birbirleriyle uyumlu hale gelmesini sağlayan bir tasarım kalıbıdır. Bu tasarım kalıbı, bir sınıfın, diğer sınıfta bulunan metodları kullanabilmesini sağlar. Bu sayede, mevcut bir arayüzü veya sınıfı kullanarak, yeni bir arayüz oluşturmak mümkün hale gelir.
Adapter tasarım kalıbı özellikle, farklı türdeki verilerin birbirleriyle uyumlu hale getirilmesinde kullanılır. Örneğin, bir uygulama, bir veritabanında saklanan verileri farklı bir veri formatında göstermek istediğinde, bir adapter kullanarak, veritabanı arayüzüyle farklı veri formatı arayüzünü birleştirerek, bu işlemi gerçekleştirebilir.
Adapter tasarım kalıbının kullanımı, özellikle legacy kod ile çalışırken oldukça yaygındır. Eski bir uygulama, yeni bir kod parçasıyla uyumlu hale getirilmek istendiğinde, adapter tasarım kalıbı kullanarak, bu işlemi gerçekleştirmek mümkündür.
Örnek olarak, bir developer, bir uygulamayı geliştirirken, bir ödeme işlemi yapılan arayüzle çalışmak zorunda kaldığını varsayalım. Ancak, ödeme işlemi için kullanılan arayüz, farklı bir veri formatıyla çalışmaktadır. Bu durumda, adapter tasarım kalıbı kullanılarak, ödeme işlemi arayüzünü farklı bir formatla uyumlu hale getirmek mümkündür.
Bunun için, öncelikle, yeni bir sınıf oluşturulur. Bu sınıf, ödeme işlemi arayüzünü implemente eder ve aynı zamanda, farklı bir veri formatıyla uyumlu hale gelmesini sağlayacak metodlar içerir. Daha sonra, bu sınıf, adapter tasarım kalıbı kullanarak, mevcut uygulamada kullanılan diğer sınıfla uyumlu hale getirilir.
Behavioral Tasarım Kalıpları
Behavioral tasarım kalıpları, yazılım içinde nesnelerin birbirleriyle nasıl etkileşimde bulunduklarını ve davranışlarını izleyen ve kontrol eden bir tasarım kalıbı türüdür. Bu tür kalıpların temel amacı, yazılımın farklı bileşenleri arasındaki etkileşimi optimize etmektir.
Bu tür tasarım kalıpları, uygulama davranışını yönetebilmek için kullanılır. Bu kalıplar, bir nesnenin davranışını değiştirmek yerine, davranışını tamamen farklı bir şekilde uygulamaya sokarlar.
Örnek olarak, bir nesnenin başka bir nesne tarafından nasıl etkileneceğiyle ilgili olarak kullanılan Observer kalıbı belirtilebilir. Bu kalıp, bir nesnenin durumunda değişiklik olduğunda, diğer nesnelerin bu değişikliği fark edip, buna uygun şekilde tepki verebilmesini sağlar.
Bu tür tasarım kalıpları, yazılımın farklı bileşenleri arasındaki etkileşimi optimize etmek için kullanılır. Behavioral tasarım kalıpları, bir nesnenin davranışını değiştirmek yerine, onu tamamen farklı bir şekilde uygulamaya sokarak, uygulama davranışını yönetebilmek için kullanılır.
- Observer Tasarım Kalıbı: Bir nesnenin durumundaki değişiklikleri izleyen ve değişikliğe uygun şekilde tepki gösteren nesneleri tanımlar.
- Strategy Tasarım Kalıbı: Farklı uygulama senaryoları için farklı davranışlar belirleyen nesneleri tanımlar.
Observer Tasarım Kalıbı
Observer tasarım kalıbı, bir nesnenin(stili bilgisayarda ki nesne) durumundaki değişikliklerin diğer nesneler tarafından otomatik olarak algılanmasını sağlar. Bu sayede, bir nesne tarafından yapılan değişikliklere bağlı olan diğer nesneler otomatik olarak güncellenir.
Bu kalıp, uygulamanın modülerliğini arttırır ve değişikliklerin diğer nesnelere kolay bir şekilde uyarlanmasını sağlar. Örneğin, bir alışveriş sepeti uygulamasında, ürün stok durumunda bir değişiklik olduğunda, müşteriye otomatik olarak bir bildirim göndermek isteyebiliriz. Bu durumda, ürün kısmında yer alan stok nesnesi gözlemci görevi üstlenir ve herhangi bir değişiklik olduğunda, müşteriye bilgi verme nesnesine bu değişikliği bildirir. Böylece, müşteri herhangi bir değişiklik takibi yapmadan bilgilendirilir.
Observer tasarım kalıbının uygulanması için, gözlemci ve gözlemlenecek nesneler arasındaki ilişkilerin iyi kurulması gereklidir. Çoğu durumda, gözlemci nesne, gözlemsene nesnesine referans tutar ve yapılan değişiklikler bu referans aracılığıyla diğer nesnelere bildirilir.
Bir diğer önemli konu da gözlemlenecek nesnelerin sayısının artması durumunda, performans problemleriyle karşılaşılabilmesidir. Bu durumların önüne geçmek için, observer tasarım kalıbı, olay yönlendirme kuralli sistemlerini kullanır. Bu sayede, hiyerarşik yapıdan kurtulunarak, verimli bir güncelleme işlemi gerçekleştirilir.
Strategy Tasarım Kalıbı
Strategy tasarım kalıbı, işlevleri yapısal bir şekilde değiştirerek bir nesnenin davranışını değiştirmek için kullanılan bir tasarım kalıbıdır. Bu tasarım kalıbı, bir nesnenin birden fazla davranışa sahip olmasını sağlar ve buna bağlı olarak, ilgili davranışı seçmek için işlevleri değiştirir.
Strategy tasarım kalıbı, programın genişledikçe, bir nesnenin davranışının değiştirilmesi daha zor olduğunda son derece kullanışlıdır. Ayrıca, uygulamanın farklı alanlarında benzer nesnelerin kullanımını içeren durumlarda da kullanılabilir.
Kod örneğiyle açıklamak gerekirse, bir yemek uygulamasında, bir yemek sınıfı yaratmış olsak ve o yemeğin hazırlanması için farklı yöntemlerimiz olsaydı. Örneğin, farklı malzemeler, pişirme yöntemleri, süre ve sıcaklıklar veya pişirme yöntemleri olabilir.
Bu durumda, yemek sınıfının özelliklerine yeni işlevler ekleyerek ve yemek metodunu değiştirerek, farklı yemek pişirme yöntemlerine sahip sınıflar oluşturabiliriz. Bu örnek gösteriyor ki, strategy tasarım kalıbı aynı arayüze sahip olan nesnelerin değişen işlevselliğiyle oluşturulması açısından oldukça yararlıdır.