Python Tasarım Kalıbı

Genel Bakış

Modern yazılım geliştirme, karmaşık iş gereksinimlerini karşılamalıdır. Ayrıca gelecekteki genişletilebilirlik ve sürdürülebilirlik gibi faktörleri de hesaba katması gerekir. İyi bir yazılım sistemi tasarımı, bu hedeflere ulaşmak için çok önemlidir. Tasarım kalıpları bu tür sistemlerde önemli bir rol oynar.

Tasarım modelini anlamak için aşağıdaki örneği ele alalım -

  • Her otomobilin tasarımı temel bir tasarım modelini, dört tekerleği, direksiyon simidini, hızlandırıcı-fren-debriyajı gibi çekirdek tahrik sistemini vb. Takip eder.

Dolayısıyla, defalarca yapılan / üretilen her şey, kaçınılmaz olarak tasarımında bir kalıbı takip edecektir. Arabalar, bisiklet, pizza, atm makineleri, her neyse… hatta çekyatınız bile.

Yazılımda bazı mantık / mekanizma / teknikleri kodlamanın neredeyse standart yolu haline gelen tasarımlar, bu nedenle Yazılım Tasarım Kalıpları olarak bilinir veya çalışılır.

Tasarım Modeli Neden Önemlidir?

Tasarım Modellerini kullanmanın faydaları şunlardır:

  • Kanıtlanmış bir yaklaşımla yaygın tasarım sorunlarını çözmenize yardımcı olur.

  • İyi belgelendikleri için anlayışta belirsizlik yok.

  • Genel geliştirme süresini azaltın.

  • Diğerlerinden daha kolay bir şekilde gelecekteki uzantılar ve değişikliklerle başa çıkmanıza yardımcı olur.

  • Yaygın sorunlara kanıtlanmış çözümler oldukları için sistemdeki hataları azaltabilir.

Tasarım Örüntülerinin Sınıflandırılması

GoF (Gang of Four) tasarım modelleri, yaratımsal, yapısal ve davranışsal olmak üzere üç kategoriye ayrılır.

Yaratılış Kalıpları

Yaratımsal tasarım modelleri, nesne oluşturma mantığını sistemin geri kalanından ayırır. Nesneler yaratmak yerine, yaratım kalıpları sizin için yaratır. Yaratıcı desenler arasında Abstract Factory, Builder, Factory Method, Prototype ve Singleton bulunur.

Yaratılış Kalıpları, dilin dinamik doğası nedeniyle Python'da yaygın olarak kullanılmamaktadır. Ayrıca dilin kendisi bize yeterince zarif bir şekilde yaratmak için ihtiyacımız olan tüm esnekliği sağlar, nadiren tek başına veya Fabrika gibi üstüne herhangi bir şey uygulamamız gerekir.

Ayrıca bu modeller, nesneleri doğrudan yeni bir operatör kullanarak somutlaştırmak yerine, oluşturma mantığını gizlerken nesneler yaratmanın bir yolunu sağlar.

Yapısal Desenler

Bazen sıfırdan başlamak yerine, mevcut bir sınıf kümesini kullanarak daha büyük yapılar inşa etmeniz gerekir. Yapısal sınıf kalıplarının yeni bir yapı inşa etmek için mirası kullandığı yer burasıdır. Yapısal nesne kalıpları, yeni bir işlevsellik elde etmek için kompozisyon / toplama kullanır. Adaptör, Köprü, Kompozit, Dekoratör, Cephe, Flyweight ve Proxy Yapısal Modellerdir. Sınıf hiyerarşisini düzenlemenin en iyi yollarını sunarlar.

Davranış kalıpları

Davranış kalıpları, nesneler arasındaki iletişimi yönetmenin en iyi yollarını sunar. Bu kategorilere giren modeller şunlardır: Ziyaretçi, Sorumluluk Zinciri, Emir, Tercüman, Yineleyici, Arabulucu, Hatıra, Gözlemci, Durum, Strateji ve Şablon yöntemi Davranış Kalıplarıdır.

Bir sistemin davranışını temsil ettikleri için, genellikle yazılım sistemlerinin işlevselliğini tanımlamak için kullanılırlar.

Yaygın olarak kullanılan Tasarım Modelleri

Singleton

Tüm tasarım modellerinin en tartışmalı ve ünlülerinden biridir. Aşırı nesne yönelimli dillerde kullanılır ve geleneksel nesne yönelimli programlamanın hayati bir parçasıdır.

Singleton modeli aşağıdakiler için kullanılır:

  • Günlüğe kaydetmenin uygulanması gerektiğinde. Logger örneği, sistemin tüm bileşenleri tarafından paylaşılır.

  • Yapılandırma dosyaları bunu kullanıyor çünkü bilgi önbelleğinin sistemdeki tüm çeşitli bileşenler tarafından korunması ve paylaşılması gerekiyor.

  • Bir veritabanına bağlantı yönetme.

İşte UML diyagramı,

class Logger(object):
   def __new__(cls, *args, **kwargs):
      if not hasattr(cls, '_logger'):
      cls._logger = super(Logger, cls).__new__(cls, *args, **kwargs)
return cls._logger

Bu örnekte, Logger bir Singleton'dur.

__New__ çağrıldığında, normalde o sınıfın yeni bir örneğini oluşturur. Bunu geçersiz kıldığımızda, önce tekli örneğimizin oluşturulup oluşturulmadığını kontrol ederiz. Değilse, süper bir çağrı kullanarak oluşturuyoruz. Böylece, Logger'da yapıcıyı her çağırdığımızda, her zaman tam olarak aynı örneği elde ederiz.

>>>
>>> obj1 = Logger()
>>> obj2 = Logger()
>>> obj1 == obj2
True
>>>
>>> obj1
<__main__.Logger object at 0x03224090>
>>> obj2
<__main__.Logger object at 0x03224090>