Python'da Bağdaştırıcı Tasarım Modeli

Giriş

The Adaptör Tasarım Modeli bir popüler Yapısal Tasarım Modeli yazılım mühendisliğinde kullanılır. Bu kılavuz, Bağdaştırıcı Tasarım Modelini Python'da nasıl uygulayabileceğimize bakar.

Tasarım desenleri şablon benzeri çözümlerdir - yazılım geliştirmede tekrar eden, yaygın sorunları çözmek için pratik tarifler. Bağdaştırıcı Kalıbı, gerçek dünyadaki bir bağdaştırıcı kavramına dayanmaktadır! Örneğin, bir dizüstü bilgisayarın şarj cihazının ucunda 3 pimli bir fiş olabilir, ancak duvar prizi yalnızca 2 pimli bir priz olabilir. 3 pimli bir şarj cihazını bu sokete takmak için 3 pimli fişi kabul eden bir adaptöre ihtiyacımız olacak ve uyarlar arayüzün içine 2-pin soket.

2 pimli bir şarj cihazı ve 3 pimli bir şarj cihazının sahip olduğu aynı temel fonksiyon (soketten dizüstü bilgisayara elektrik iletir), ancak farklı bir formve kolayca uyarlamak diğerine. Aynı temel işleve ancak farklı biçimlere sahip yazılım bileşenleriniz olduğunda, Bağdaştırıcı Tasarım Desenini uygulayabilirsiniz.

Bağdaştırıcı Kalıbı tam olarak bu ilkeyi izler. Uyumsuz iki arabirimin, her bir bileşenin içindekileri değiştirmeden birlikte çalışmasına izin verir. Bu, bir arabirimi diğerine harici olarak uyarlayarak elde edilir.

Bağdaştırıcı Kalıpları dünyasının derinliklerine dalmadan önce bazı temel terminolojilere bakalım:

  • İstemci Arayüzü: İstemcinin uygulaması gereken işlevleri belirten bir arabirim.
  • müşteri: İstemci arabirimini uygulayan bir sınıf.
  • Adapte/Hizmet: İstemci arabirimiyle işbirliği yapması gereken uyumsuz sınıf.
  • adaptör: Hizmet ile istemci arasındaki işbirliğini mümkün kılan sınıf.

Farklı Adaptör Modelleri Türleri

Bağdaştırıcı tasarım deseni iki farklı şekilde uygulanabilir:

Nesne Bağdaştırıcısı

Bu yöntemle, bağdaştırıcı sınıfı, istemci arabirimindeki yöntemleri uygular. Böylece istemci nesnesi ve bağdaştırıcı nesnesi birbiriyle uyumludur. hizmet nesnesi bir has-a bağdaştırıcı nesnesiyle ilişki, yani hizmet nesnesi bağdaştırıcı nesnesine aittir.

Hizmet sınıfının istemciyle uyumlu olmadığını biliyoruz. Bağdaştırıcı sınıfı, kendisini o nesneyle örnekleyerek hizmet nesnesini sarar. Artık hizmet nesnesine, bağdaştırıcı nesnesi aracılığıyla erişilebilir ve istemcinin onunla etkileşime girmesine izin verilir.

Nesne bağdaştırıcısını tüm modern programlama dillerinde uygulayabiliriz.

Sınıf Adaptörü

Bu yöntemle, adaptörün bir is-a hizmet sınıfı ile ilişki. Bu senaryoda bağdaştırıcı, istemcinin gerektirdiği yöntemleri uygular, ancak birden çok bağdaştırıcıdan miras alır ve ona uyumsuz işlevlerini doğrudan çağırma yeteneği verir. Bu varyasyonun en büyük dezavantajı, onu yalnızca sınıfların çoklu kalıtımını destekleyen programlama dillerinde kullanabilmemizdir.

Bağdaştırıcı Tasarım Modelinin Python'da Uygulanması

Aşağıdaki bölümde, Bağdaştırıcı tasarım modelini Python'da, özellikle kullanarak uygulayacağız. nesne adaptörü varyasyonu. Bölüm iki bölüme ayrılmıştır. Öncelikle Adapter Pattern kullanılması gereken ortamı oluşturacağız. Bu modelin bazı yazılım problemlerini nasıl çözebileceğini açıkça görmek önemlidir. İkinci bölüm, sorunu çözmek için bir adaptör kullanacaktır.

Sınıflar Arası Uyumsuzluk Sorunu

İstemci ve hizmet sınıfı farklı işlevler uyguladığında uyumluluk sorununa bakalım. Aşağıdaki yöntemlerle bir istemci sınıfı oluşturun ve bunu bir klasöre şu şekilde kaydedin: car.py:

import random

class Car:
    def __init__(self):
        self.generator = random.Random()

    def accelerate(self):
        random_num = self.generator.randint(50, 100)
        speed = random_num
        print(f"The speed of the car is {speed} mph")

    def apply_brakes(self):
        random_num = self.generator.randint(20, 40)
        speed = random_num
        print(f"The speed of the car is {speed} mph after applying the brakes")

    def assign_driver(self, driver_name):
        print(f"{driver_name} is driving the car")

Burada, oluşturduğumuz bir Car üç metotlu sınıf accelerate(), apply_brakes() ve assign_driver(). ithal ettik random modülünü kullandı ve hızlanıp frene bastıktan sonra aracın hızını belirleyen sayılar üretmek için kullandı. bu assign_driver() yöntem, araç sürücüsünün adını görüntüler.

Ardından, müşteri sınıfıyla işbirliği yapmak isteyen bir hizmet veya adapte sınıfı oluşturmalıyız. Car. Bunun gibi bir Motosiklet sınıfı oluşturun ve klasörünüze şu şekilde kaydedin: motorcycle.py:

import random

class Motorcycle:
    def __init__(self):
        self.generator = random.Random()

    def rev_throttle(self):
        random_num = self.generator.randint(50, 100)
        speed = random_num
        print(f"The speed of the motorcycle is {speed} mph")

    def pull_brake_lever(self):
        random_num = self.generator.randint(20, 40)
        speed = random_num
        print(
            f"The speed of the motorcycle is {speed} mph after applying the brakes")

    def assign_rider(self, rider_name):
        print(f"{rider_name} is riding the motorcycle")  

Bir hizmet sınıfı, Motorcycle yukarıda üç yöntemle oluşturulur rev_throttle(), pull_brake_lever(), ve assign_rider(). Benzer işlevselliklerine rağmen hizmet ve istemci sınıfı yöntemleri arasındaki farka dikkat edin. bu accelerator() yöntem arabanın hızını arttırırken rev_throttle() yöntem motosikletin hızını artırır. Aynı şekilde, apply_brakes() ve pull_brake_lever() ilgili araçlarda fren uygular. Son olarak, assign_driver() ve assign_rider() yöntemleri araç operatörünü atar.

Ardından, bu farklı yöntemlere erişmek için bir sınıf oluşturalım. İlk önce bir ekleyin __init.py__ oluşturduğunuz aynı klasörde car.py ve motorcycle.py:

touch __init__.py

Şimdi aşağıdaki kodu yeni bir dosyaya ekleyin drive.py:

from car import Car
from motorcycle import Motorcycle
import traceback

if __name__ == '__main__':
    car = Car()
    bike = Motorcycle()

    print("The Motorcyclen")
    bike.assign_rider("Subodh")
    bike.rev_throttle()
    bike.pull_brake_lever()
    print("n")

    print("The Carn")
    car.assign_driver("Sushant")
    car.accelerate()
    car.apply_brakes()
    print("n")

    print("Attempting to call client methods with the service objectn")

    try:
        bike.assign_driver("Robert")
        bike.accelerate()
        bike.apply_brakes()
    except AttributeError:
        print("Oops! bike object cannot access car methods")
        traceback.print_exc()

İstemci ve hizmet nesnelerimizi oluşturan bu betik. ilk olarak import ediyoruz Car ve Motorcycle sınıflar ve onlarla nesneler oluşturun. Sonra yöntemleri şu adresten çağırırız: bike nesne (Motorcycle sınıf). Ardından, yöntemleri çağırıyoruz car nesne (Car sınıf). Yürütüldüğünde, şimdiye kadar belirtilen tüm kodlar çalışacaktır.

Ancak, yöntemleri çağırmaya çalıştığımızda bir istisna ortaya çıkar. Car ile sınıf bike nesne. Bu betiği çalıştırdığımızda:

The Motorcycle

Subodh is riding the motorcycle
The speed of the motorcycle is 91 mph
The speed of the motorcycle is 37 mph after applying the brakes


The Car

Sushant is driving the car
The speed of the car is 59 mph
The speed of the car is 33 mph after applying the brakes


Attempting to call client methods with the service object

Oops! bike object cannot access car methods
Traceback (most recent call last):
  File "drive.py", line 24, in 
    bike.assign_driver("Robert")
AttributeError: 'Motorcycle' object has no attribute 'assign_driver'

Bu durumda değiştirebileceğimiz Motorcycle sınıf veya drive.py doğru yöntemleri kullanmak için komut dosyası. Ancak çoğu durumda istemci veya hizmet sınıfının kaynak koduna erişimimiz olmayabilir. Ayrıca bu basit bir örnek. Daha büyük istemciler ve hizmetlerle, diğer sistemlerle uyumluluğu bozmamız durumunda bunların hiçbirini yeniden düzenlemek mümkün olmayabilir.

Bunun yerine, müşteri kodumuz ile hizmet nesnemiz arasındaki uyumluluk açığını kapatmak için bir bağdaştırıcı kullanabiliriz.

Uyumsuzluk Sorununu Çözmek için Bağdaştırıcıları Kullanma

Yeni bir dosyada, motorcycle_adapter.py, aşağıdaki sınıfı ekleyin:

class MotorcycleAdapter:

    def __init__(self, motorcycle):
        self.motorcycle = motorcycle

    def accelerate(self):
        self.motorcycle.rev_throttle()

    def apply_brakes(self):
        self.motorcycle.pull_brake_lever()

    def assign_driver(self, name):
        self.motorcycle.assign_rider(name)

Biz oluşturulan bir MotorcycleAdapter kendisini bir hizmet nesnesiyle örnekleyen sınıf (motorcycle). Bağdaştırıcı, şu istemci yöntemlerini uygular: accelerate(), apply_brakes() ve assign_driver(). gövdesinin içinde accelerate() yöntemini kullandık, motorcycle çağrılacak hizmet nesnesinin örneği rev_throttle() hizmet yöntemi. Aynı şekilde, diğer yöntemler de karşılık gelen yöntemleri kullanır. Motorcycle sınıf.

Şimdi güncelleyelim drive.py böylece adaptörü kullanabiliriz try/except blok:

from car import Car
from motorcycle import Motorcycle
from motorcycle_adapter import MotorcycleAdapter 
import traceback

if __name__ == '__main__':
    car = Car()
    bike = Motorcycle()
    bike_adapter = MotorcycleAdapter(bike) 

    ...

    try:
        print("Attempting to call client methods with the service object using an adaptern")
        bike_adapter.assign_driver("Robert")
        bike_adapter.accelerate()
        bike_adapter.apply_brakes()
    except AttributeError:
        print("Oops! bike object cannot access car methods")
        traceback.print_exc()

Burada,bike_adapter bir nesnedir MotorcycleAdapter sınıf. tedarik ettik bike itiraz etmek MotorcycleAdapter sınıfın yapıcısı. Bu komut dosyasını çalıştırmak bize aşağıdaki çıktıyı verir:

En iyi uygulamalar, endüstri tarafından kabul edilen standartlar ve dahil edilen hile sayfası ile Git'i öğrenmek için uygulamalı, pratik kılavuzumuza göz atın. Googling Git komutlarını durdurun ve aslında öğrenmek o!

The Motorcycle

Subodh is riding the motorcycle
The speed of the motorcycle is 88 mph
The speed of the motorcycle is 35 mph after applying the brakes


The Car

Sushant is driving the car
The speed of the car is 91 mph
The speed of the car is 24 mph after applying the brakes


Attempting to call client methods with the service object

Attempting to call client methods with the service object using an adapter

Robert is riding the motorcyle
The speed of the motorcycle is 67 mph
The speed of the motorcycle is 25 mph after applying the brakes

Temeli ayarlamak zorunda kalmadan Motorcycle sınıf, bir gibi çalışmasını sağlayabiliriz Car bir adaptör kullanarak!

Adaptör Tasarım Modelinin Artıları ve Eksileri

Bağdaştırıcı Kalıplarının avantajları şunlardır:

  • Bağdaştırıcı sınıfı ile istemci sınıfı arasında düşük bağlantı sağlayabiliriz.
  • Çok sayıda hizmet sınıfını uygulamaya dahil etmek için bağdaştırıcı sınıfını yeniden kullanabiliriz.
  • İstemci koduna müdahale etmeden birden fazla adaptör ekleyerek programın esnekliğini artırabiliriz.

Bağdaştırıcı Kalıbının dezavantajları şunlardır:

  • Bağdaştırıcı sınıfı ve hizmet sınıfının eklenmesiyle programın karmaşıklığı artar.
  • İstekler bir sınıftan diğerine iletildiği için programda ek yükte bir artış olur.
  • Bağdaştırıcı Kalıbı (sınıf bağdaştırıcı), tüm programlama dillerinin desteklemeyebileceği birden çok kalıtım kullanır.

Sonuç

Bu yazımızda adaptör tasarım kalıbını, çeşitlerini ve çözdüğü problemleri öğrendik. Bağdaştırıcı Kalıbını Python'da uyguladık, böylece bir Motorcycle gibi bir nesne Car her sınıfın arabiriminin değişmemesi için bir bağdaştırıcı kullanarak nesne.

Zaman Damgası:

Den fazla Yığın kötüye kullanımı