ارتباط بین لیزی پراکسی و سینگلتون

پرسیده شده
فعالیت 899 روز پیش
دیده شده 464 بار
0

سلاام شب خوش 
سوالم اینه که آیا لیزی پراکسی میتونه برای ما همون کار سینگلتون رو انجام بده؟ چون وقتی یه بار ابجکت رو میسازه دیگه نمیره اینیشیتش نمیکنه و همون یدونه ازش و میسازه 

فایل پیوست

Amin Deimkar
Amin Deimkar

12 آبان 00

1
حذف شده

سلااااااااااااااااااام امین جان

وقت تون بخیر

برای پاسخ به سوال تون فک میکنم بهتره به مفهموم الگوهای طراحی (Design Patterns) برگردیم. تو برنامه نویسی یه سری مسائل داریم که زیاد تکرار میشن. برای هر مساله یه راه حل بهینه (Best practice) ارائه میدن و یه اسم روی اون راه حل میذارن.

مثلا یه کلاسی داریم که میخواهیم ازش یه ابجکت بیشتر ساخته نشه. یه راه حل برای این قضیه ارائه دادن و اسمش رو گذاشتن Singleton.

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

 

جواب سوالتون:

خیر، این کلاس LazyLoader که استاد نوشتن کار سینگلتون رو انجام نمیداد. به مثال زیر دقت کنید:

from time import sleep


class LazyLoader:
    def __init__(self, cls):
        self.cls = cls
        self.object = None

    def __getattr__(self, item):
        if self.object is None:
            self.object = self.cls()
        return getattr(self.object, item)


class MySQLHandler:
    def __init__(self):
        sleep(1)

    def connect(self):
        return "Connection to the mysql stablished"


if __name__ == "__main__":
    mysql = LazyLoader(MySQLHandler)
    mysql2 = LazyLoader(MySQLHandler)

    print(mysql.connect(), id(mysql))
    print(mysql2.connect(), id(mysql2))

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

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

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

 

امیدوارم با این توضیحات به جواب سوالت رسیده باشی.

باز اگر سوالی داشتی در خدمتم :)

فایل پیوست

محمدعلی رضا

توسط

محمدعلی رضا

15 آبان 00

حذف شده
ولی فکر میکنم از کلاس MySQLHandler رو سینگلتون ساخته ولی چون شما id(mysql) رو پرینت کردی و اون ابجکت یه کلاس کلاس دیگست رفته دوجا اونو ذخیره کرده و ای دی متفاوتی داره نشون میده مثلا اگه اینو پرینت کنی دوتا ای دی یکسان بت نشون میده چون کلا یه بار اینیتش کرده print(id(mysql1.cls), id(mysql2.cls)) فکر نکنم هیچجا بدرد بخوره این سوالم :)))) بازم ممنونم ازت
Amin Deimkar

22 آبان 00