// Add scroll event listener window.addEventListener('scroll', function() { // Check scroll position if (window.scrollY >= 40) { // Perform your desired action here (function (s, e, n, d, er) { s['Sender'] = er; s[er] = s[er] || function () { (s[er].q = s[er].q || []).push(arguments) }, s[er].l = 1 * new Date(); var a = e.createElement(n), m = e.getElementsByTagName(n)[0]; a.async = 1; a.src = d; m.parentNode.insertBefore(a, m) })(window, document, 'script', 'https://cdn.sender.net/accounts_resources/universal.js', 'sender'); sender('986212f6399684') // You can replace the console.log statement with your own code } });

همه چیز درباره الگوهای طراحی در پایتون

الگوهای طراحی در پایتون

تصور کنید که می خواهید خانه ای را بسازید. شما یک تصویر نهایی از ظاهر این خانه در ذهن خود دارید و بر اساس همین دید کلی که از خانه دارید، شروع به ساختن خانه می کنید و بعد از مدتی می بینید که اگر به این روش ادامه دهید، خانه رویایی تان به آن شکل و ظاهری که تصور می کردید ساخته نمی شود. ایراد کار کجاست؟
درست حدس زدید. ایراد کار این جاست که برای ساخت این خانه، هیچ برنامه و طرحی از پیش تعیین شده وجود ندارد. در واقع وجود یک نقشه و الگو، می تواند به شما در ساخت خانه کمک کند. همچنین این الگو می تواند قابل استفاده مجدد باشد. به این معنی که خانه های دیگری هم بر اساس این الگو ساخته شوند.
در توسعه نرم افزار نیز همین طور است، برای توسعه یا طراحی نرم افزار می توان از یک سری الگوهای طراحی از پیش تعیین شده استفاده کرد. مثلا برای اضافه کردن یک صفحه جدید به یک وب سایت نیازی به طراحی مجدد همه چیز از ابتدا نیست. شما می توانید الگو و مراحل ایجاد صفحات دیگر را دنبال کنید و مجددا از همان الگوی ساخت، استفاده کنید.

چیزی که خواندید مفهوم اصلی و ساده شده ی الگوهای طراحی است. استفاده از الگوهای طراحی در زبان های برنامه نویسی شی گرا مختلف مرسوم است. در این مقاله تمرکز ما بر الگوهای طراحی در پایتون است.

 


بیشتر بخوانید: “مفهوم شی‌گرایی به زبان ساده


الگوهای طراحی در برنامه نویسی چیست؟

الگوهای طراحی، راه حل های کلی برای مشکلات رایجی هستند که در طراحی نرم افزار رخ می دهد. این الگوها معمولاً روابط و تعاملات بین کلاس ها یا اشیاء را نشان می دهد. ایده استفاده از الگو های طراحی این است که فرآیند برنامه نویسی را با ارائه پارادایم های توسعه و طراحی آزمایش شده و اثبات شده، تسریع کنیم. الگوهای طراحی استراتژی هایی مستقل زبان برنامه نویسی، برای حل مشکلات رایج هستند. با استفاده از الگوهای طراحی، می توانید کد خود را انعطاف پذیرتر، قابل استفاده مجدد و نگهداری کنید.

استفاده از الگوهای طراحی در برنامه نویسی اجباری نیست. در واقع الگوهای طراحی برای توسعه پروژه در نظر گرفته نشده اند بلکه برای حل مشکلاتی هستند که در پروژه های مختلف رایج هستند. انواع مختلفی از الگوهای طراحی وجود دارد. برای اینکه بدانید از کدام الگو استفاده کنید، باید سعی کنید انواع الگوهای طراحی و اهداف آن ها را درک کنید.

 

 

مزایای استفاده از الگوهای طراحی در پایتون

الگوهای طراحی می توانند به طور قابل توجهی روند توسعه نرم افزار را بهبود بخشند. از مهم ترین مزایای استفاده از الگوهای طراحی در برنامه نویسی از جمله الگوهای طراحی در پایتون، می توان به موارد زیر اشاره کرد:

  • استفاده از الگوهای طراحی پیچیدگی کد و امکان خطا را کاهش می دهد.
  • استفاده از الگوهای طراحی سرعت توسعه نرم افزار را افزایش می دهد.
  • سرعت بخشیدن به روند توسعه نرم افزار
  • کاهش تعداد خطوط کد
  • اطمینان از سلامت کد
  • پیش بینی مشکلات آینده
  • قابلیت استفاده مجدد

 

 

تفاوت الگو طراحی و الگوریتم

معمولا مفهوم الگو با الگوریتم اشتباه گرفته می شود. هر دو مفهوم راه حل هایی را برای مسائل توصیف می کنند. اما الگوریتم مجموعه ای از اقدامات واضحی را تعریف می کند که در نهایت باعث رسیدن به یک هدف مشخص می شود، در حالی که الگو توصیف سطح بالایی از یک راه حل است. قطعه کد یک الگوی اعمال شده برای دو برنامه مختلف ممکن است متفاوت باشد در حالی که الگوریتم این طور نیست.

 

 

انواع الگوهای طراحی در پایتون

به طور کلی الگوهای طراحی به سه دسته کلی تقسیم می شوند:

  • Creational
  • Structural
  • Behavioral

در ادامه این مقاله به بررسی هر نوع از الگوهای طراحی در پایتون خواهیم پرداخت و تعدادی از پر استفاده ترین الگوهای طراحی را معرفی خواهیم کرد.

 

Creational

الگوهای طراحی Creational با نمونه سازی کلاس یا اشیا سروکار دارند. الگوهای طراحی Creational بیشتر به الگوهای Class-creational و الگوهای Object-creational تقسیم می شوند. الگوهای Class-creational از وراثت در فرآیند نمونه سازی استفاده می کنند در حالی که الگوهای Object-creational از واگذاری وظایف بین اشیا برای انجام کار استفاده می کنند.

الگوهای طراحی Creational عبارتند از:

  • Factory method : یک رابط، برای ایجاد اشیاء در یک سوپرکلاس را فراهم می‌کند، اما به زیر کلاس‌ها اجازه می‌دهد تا نوع اشیایی که ایجاد می‌شوند را تغییر دهند.
  • Abstract Factory: به شما امکان می دهد خانواده هایی از اشیاء مرتبط را بدون مشخص کردن کلاس های آن ها، تولید کنید.
  • Builder: به شما امکان می دهد اشیاء پیچیده بسازید. این الگو به شما امکان می دهد انواع و نمایش های مختلفی از یک شی را با استفاده از کد یکسان تولید کنید.
  • Singleton : Singleton یک کلاس را از داشتن بیش از یک نمونه محدود می کند و یک نقطه دسترسی جهانی به این نمونه را تضمین می کند.

نمونه پیاده سازی الگوی طراحی Singleton

class Singleton:
    def __new__(cls):
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__new__(cls)
        return cls.instance


if __name__ == "__main__":
    s = Singleton()
    print("Object created:", s)

    s1 = Singleton()
    print("Object created:", s1)

 

 

Structural

این الگوهای طراحی در مورد سازماندهی طبقات و اشیاء مختلف برای تشکیل ساختارهای بزرگ تر و ارائه عملکرد جدید هستند.

الگوهای طراحی سازه عبارتند از:

  •  Adapter Method: به اشیاء با رابط های ناسازگار اجازه می دهد تا با یکدیگر همکاری کنند.
  • Bridge Method: به شما امکان می دهد یک کلاس بزرگ یا مجموعه ای از کلاس های نزدیک به هم را به دو سلسله مراتب مجزا تقسیم کنید. که می توانند مستقل از یکدیگر توسعه یابند.
  • Composite Method: به شما امکان می دهد اشیاء را در ساختارهای درختی بنویسید و سپس با این ساختارها مانند اشیا تکی رفتار کنید.
  • Decorator Method: این الگو به برنامه نویس اجازه می دهد تا عملکرد جدیدی را به یک شی موجود، بدون تغییر ساختار آن اضافه کند.
  • Facade Method: یک رابط ساده برای کتابخانه ، فریمورک یا هر مجموعه پیچیده دیگری ارائه می دهد.
  • Proxy Method: به شما امکان می دهد یک جایگزین یا مکان نگهداری برای یک شی دیگر تهیه کنید. پروکسی، دسترسی به شی اصلی را کنترل می کند و به شما امکان می دهد قبل یا بعد از رسیدن درخواست به شی اصلی، کاری را انجام دهید.
  • FlyWeight Method: به شما امکان می دهد با به اشتراک گذاشتن بخش های مشترک حالت بین چندین شی به جای نگه داشتن تمام داده ها در هر شی، اشیاء بیشتری را در مقدار RAM موجود قرار دهید.

 

نمونه پیاده سازی الگوی طراحی Decorator

class my_decorator:
    def __init__(self, func):
        print("inside my_decorator.__init__()")
        func() # Prove that function definition has completed

    def __call__(self):
        print("inside my_decorator.__call__()")


@my_decorator
def my_function():
    print("inside my_function()")


if __name__ == "__main__":    
    my_function()

 

 

Behavioral

الگوهای رفتاری در مورد شناسایی الگوهای ارتباطی مشترک بین اشیا هستند. این الگوها با الگوریتم ها و تخصیص مسئولیت ها بین اشیا سروکار دارند.

الگوهای رفتاری عبارتند از:

  • Chain of Responsibility Method: به شما امکان می دهد درخواست ها را در زنجیره ای از کنترل کننده ها ارسال کنید. کنترل کننده، پس از دریافت درخواست، آن را پردازش می کند یا آن را به کنترل کننده بعدی در زنجیره ارسال می کند.
  • Command Method: یک درخواست را به یک شیء مستقل تبدیل می کند که حاوی تمام اطلاعات مربوط به درخواست است. این تبدیل به شما امکان می‌دهد درخواست‌ها را به‌عنوان آرگومان‌های متد ارسال کنید، اجرای یک درخواست را به تأخیر بیندازید یا در صف قرار دهید، و عملیات غیرقابل انجام را ساپورت کنید.
  • Iterator Method: به شما اجازه می دهد تا عناصر مجموعه ها را بدون در نظر گرفتن جزئیات عمیق آن ها طی کنید. این الگو همچنین راهی برای دسترسی متوالی به عناصر ساختار داده پیچیده بدون نیاز به تکرار آن ها فراهم می کند.
  • Mediator Method: به شما اجازه می دهد تا وابستگی های نامرتب بین اشیاء را کاهش دهید.
  • Memento Method: توانایی بازگرداندن یک شی به حالت قبلی را فراهم می کند و به شما امکان می دهد نسخه قبلی یک شی را ذخیره و بازیابی کنید.
  • Observer Method: به شما امکان می دهد یک مکانیسم اشتراکی را تعریف یا ایجاد کنید تا اعلان را به چندین شی در مورد هر رویداد جدیدی که برای شی خاصی اتفاق می افتد، برای سایر اشیا ارسال شود.
  • State Method: هنگامی که تغییری در وضعیت داخلی یک شیء ایجاد می شود، اجازه می دهد تا رفتار خود را تغییر دهد.
  • Strategy Method: به شما اجازه می دهد تا مجموعه کاملی از الگوریتم ها را تعریف کنید، هر کدام را کپسوله کنید و هر یک از آن ها را در کلاس های جداگانه قرار دهید و همچنین امکان تبادل اشیاء در آنجا را فراهم می کند.
  • Template Method: اسکلت و پایه یک الگوریتم را در سوپرکلاس تعریف می‌کند اما به زیر کلاس‌ها اجازه می‌دهد تا مراحل خاصی از الگوریتم را بدون تغییر ساختار آن لغو کنند.
  • Visitor Method: به شما امکان می دهد الگوریتم ها را از اشیایی که روی آن ها کار می کنند جدا کنید.

 

نمونه پیاده سازی الگوی طراحی Iterator

from __future__ import annotations
from collections.abc import Iterable, Iterator
from typing import Any, List


class AlphabeticalOrderIterator(Iterator):
    _position: int = None
    _reverse: bool = False

    def __init__(self, collection: WordsCollection, 
                 reverse: bool = False):
        self._collection = collection
        self._reverse = reverse
        self._position = -1 if reverse else 0

    def __next__(self):
        try:
            value = self._collection[self._position]
            self._position += -1 if self._reverse else 1
        except IndexError:
            raise StopIteration()
        return value


class WordsCollection(Iterable):
    def __init__(self, collection: List[Any] = []):
        self._collection = collection

    def __iter__(self) -> AlphabeticalOrderIterator:
        return AlphabeticalOrderIterator(self._collection)

    def get_reverse_iterator(self) -> AlphabeticalOrderIterator:
        return AlphabeticalOrderIterator(self._collection, True)

    def add_item(self, item: Any):
        self._collection.append(item)


if __name__ == "__main__":
    collection = WordsCollection()
    collection.add_item("First")
    collection.add_item("Second")
    collection.add_item("Third")

    print("Straight traversal:")
    print("\n".join(collection))

    print("Reverse traversal:")
    print("\n".join(collection.get_reverse_iterator()))

 


بیشتر بخوانید: “راهنمای جامع بازارکار و درامد برنامه نویسی پایتون


نتیجه گیری

در این مقاله تلاش بر این بود تا شما عزیزان را با مفهوم الگوهای طراحی در پایتون و انواع آن آشنا کنیم. همچنین نمونه هایی از نحوه پیاده سازی این الگوهای طراحی در برنامه نویسی پایتون، به شما ارائه دادیم. همانطور که خواندید، استفاده از الگوهای طراحی در برنامه نویسی پایتون می تواند بسیار کمک کننده باشد. شاید برایتان جالب باشد که بدانید تنها ١١ درصد از برنامه نویسان بیش از ٧۵ درصد مواقع از نمودارهای طراحی استفاده می کنند. این نشان می دهد که استفاده از الگوهای طراحی در برنامه نویسی شاید هنوز آنچنان رایج نیست. شما می توانید با یادگیری الگوهای طراحی در دوره آموزش برنامه نویسی پایتون، به صورت حرفه ای از این الگوها استفاده کنید.

 

برای تهیه این مقاله از منابع زیر استفاده شده است:

geeksforgeeks.org

refactoring.guru

 

 

آیا این مطلب برای شما مفید بود؟

امتیازشو ثبت کنید

میانگین / 5. تعداد رای

اولین نفر شما امتیاز دهید

نوشته شده توسط
نگین سعیدی

من نگین سعیدی هستم کارشناس سئو و تولیدمحتوا آکادمی آمانج

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *