সাজসজ্জার ডিজাইন প্যাটার্ন সম্পর্কে নবাগত প্রশ্ন


18

আমি একটি প্রোগ্রামিং নিবন্ধ পড়ছিলাম এবং এটি ডেকরেটর প্যাটার্ন উল্লেখ করেছে। আমি কিছুক্ষণের জন্য প্রোগ্রামিং করছি তবে কোনও ধরণের প্রথাগত শিক্ষা বা প্রশিক্ষণ ছাড়াই, তবে আমি স্ট্যান্ডার্ড ধরণগুলি এবং এগুলি সম্পর্কে জানার চেষ্টা করছি।

তাই আমি ডেকরেটারের দিকে চেয়েছিলাম এবং এটিতে একটি উইকিপিডিয়া নিবন্ধ পেয়েছি found আমি এখন ডেকরেটর প্যাটার্নের ধারণাটি বুঝতে পারি, তবে এই উত্তরণে আমি কিছুটা বিভ্রান্ত হয়েছিলাম:

উদাহরণস্বরূপ, উইন্ডোটিং সিস্টেমের একটি উইন্ডো বিবেচনা করুন। উইন্ডোটির বিষয়বস্তুগুলিকে স্ক্রোল করার অনুমতি দেওয়ার জন্য আমরা যথাযথভাবে এটিতে অনুভূমিক বা উল্লম্ব স্ক্রোলবারগুলি যুক্ত করতে পারি। ধরুন উইন্ডোগুলি উইন্ডো শ্রেণীর উদাহরণগুলির দ্বারা উপস্থাপিত হয়েছে এবং ধরে নিন যে এই শ্রেণীর স্ক্রোলবারগুলি যুক্ত করার জন্য কোনও কার্যকারিতা নেই। আমরা একটি সাবক্লাস স্ক্রোলিং উইন্ডো তৈরি করতে পারি যা সেগুলি সরবরাহ করে অথবা আমরা একটি স্ক্রলিং উইন্ডোডেকোরেটর তৈরি করতে পারি যা বিদ্যমান উইন্ডো অবজেক্টগুলিতে এই কার্যকারিতা যুক্ত করে। এই মুহুর্তে, উভয় সমাধান ভাল হবে।

এখন ধরে নেওয়া যাক আমরা আমাদের উইন্ডোতে সীমানা যুক্ত করার ক্ষমতাও কামনা করি। আবার, আমাদের মূল উইন্ডো শ্রেণীর কোনও সমর্থন নেই। স্ক্রলিং উইন্ডো সাবক্লাসে এখন একটি সমস্যা রয়েছে, কারণ এটি কার্যকরভাবে একটি নতুন ধরণের উইন্ডো তৈরি করেছে। আমরা যদি সমস্ত উইন্ডোয় সীমান্ত সমর্থন যুক্ত করতে চাই, আমাদের অবশ্যই সাবক্লাস উইন্ডো উইথবোর্ডার এবং স্ক্রলিং উইন্ডো উইথবোর্ডার তৈরি করতে হবে। স্পষ্টতই, প্রতিটি নতুন বৈশিষ্ট্য যুক্ত হওয়ার সাথে এই সমস্যাটি আরও খারাপ হয়। সাজসজ্জার সমাধানের জন্য, আমরা সহজভাবে একটি নতুন বর্ডারওয়াইন্ডো ডেকোরেটর তৈরি করি run রানটাইমের সময় আমরা বিদ্যমান উইন্ডোগুলি স্ক্রলিং উইন্ডো ডেকরেটর বা বর্ডারওয়াইন্ডো ডেকোরেটর বা উভয় দিয়ে সজ্জিত করতে পারি, যেমনটি আমরা উপযুক্ত দেখি।

ঠিক আছে, যখন তারা সমস্ত উইন্ডোতে সীমানা যুক্ত করতে বলবে, তবে কেন বিকল্পটির জন্য অনুমতি দেওয়ার জন্য মূল উইন্ডো শ্রেণিতে কার্যকারিতা যুক্ত করবেন না? আমি যেভাবে দেখছি তা হল, সাবক্লাসিং কেবল একটি শ্রেণিতে নির্দিষ্ট কার্যকারিতা যুক্ত করার জন্য, বা শ্রেণি পদ্ধতিতে ওভাররাইড করার জন্য। যদি আমার বিদ্যমান সমস্ত বস্তুগুলিতে কার্যকারিতা যুক্ত করার প্রয়োজন হয় তবে আমি কেন এটি করতে সুপারক্লাসটি সংশোধন করব না?

নিবন্ধে আরও একটি লাইন ছিল:

ডেকোরেটর প্যাটার্ন সাবক্লাসিংয়ের বিকল্প is সাবক্লাসিং সংকলনের সময় আচরণ যুক্ত করে এবং পরিবর্তনটি মূল শ্রেণীর সমস্ত উদাহরণকে প্রভাবিত করে; সাজসজ্জা পৃথক বস্তুর জন্য রান-টাইমে নতুন আচরণ সরবরাহ করতে পারে।

তারা যেখানে বলে সেখানে আমি পাই না "... পরিবর্তনটি মূল শ্রেণীর সমস্ত উদাহরণকে প্রভাবিত করে" - সাবক্লাসিং কীভাবে প্যারেন্ট ক্লাসকে পরিবর্তন করে? এটি কি সাবক্লাসিংয়ের পুরো বিন্দু নয়?

আমি ধরে নিতে চলেছি যে অনেক উইকের মতো নিবন্ধটিও কেবল পরিষ্কারভাবে লেখা হয়নি not আমি সেই শেষ লাইনে সাজসজ্জারটির কার্যকারিতা দেখতে পাচ্ছি - "... স্বতন্ত্র বস্তুর জন্য রান-টাইমে নতুন আচরণ সরবরাহ করুন।"

এই প্যাটার্নটি সম্পর্কে না পড়ে, যদি আমার পৃথক অবজেক্টগুলির জন্য রান-টাইমে আচরণ পরিবর্তন করার প্রয়োজন হয়, আমি সম্ভবত সম্ভবত আচরণটি সক্ষম / অক্ষম করার জন্য সুপার- বা সাবক্লাসে কিছু পদ্ধতি তৈরি করতাম। দয়া করে আমাকে সাজসজ্জারটির কার্যকারিতা বুঝতে সত্যই সহায়তা করুন এবং আমার নবাগত চিন্তা কেন ত্রুটিযুক্ত?


ওয়াল্টার ... fyi সম্পাদনার প্রশংসা করুন, আমি "ছেলেরা" মহিলাদের বর্জন করতে নয়, একটি অনানুষ্ঠানিক শুভেচ্ছা হিসাবে ব্যবহার করেছি।
জিম

সম্পাদনাটি হ'ল সাধারণভাবে অভিবাদন অপসারণ করার জন্য। প্রশ্নগুলির মধ্যে একটিটি ব্যবহার করা এটি স্ট্যান্ডার্ড এসও / এসই প্রোটোকল নয় [চিন্তা করবেন না, আমরা সরাসরি প্রশ্নে ঝাঁপিয়ে পড়া অভদ্র মনে করি না]
ফারেল

শীতল ধন্যবাদ! এটি কেবল এটিকে "লিঙ্গ অপসারণ" হিসাবে ট্যাগ করেছিলেন এবং আমি কাউকে ঘৃণা করব যে আমি ভ্রষ্টবাদী বা অন্য কিছু বলে মনে করি !! :)
জিম

আমি তাদের ব্যবহার প্রচন্ডভাবে ঐ আইনগত পদ্ধতিগত কিছু "পরিষেবা" বলা এড়াতে: medium.com/@wrong.about/...
Zapadlo

উত্তর:


13

ডেকোরেটর প্যাটার্নটি হ'ল উত্তরাধিকারের উপরে রচনাটির পক্ষে [অন্য ওওপি দৃষ্টান্ত যা শিখতে দরকারী]]

সাজসজ্জার প্যাটার্নের মূল সুবিধা - উপশ্রাহীকরণের মাধ্যমে আরও মিক্স এবং ম্যাচের বিকল্পগুলি মঞ্জুরি দেওয়া। যদি আপনার কাছে উদাহরণস্বরূপ, একটি উইন্ডোতে 10 টি বিভিন্ন আচরণ থাকতে পারে তবে এর অর্থ - সাবক্লাসিং সহ - আপনাকে প্রতিটি পৃথক সংমিশ্রণ তৈরি করতে হবে যা অনিবার্যভাবে প্রচুর কোড পুনরায় ব্যবহারের অন্তর্ভুক্ত করবে।
যাইহোক, আপনি যখন নতুন আচরণে যুক্ত করার সিদ্ধান্ত নেন তখন কী ঘটে?

সাজসজ্জারের সাথে, আপনি কেবল একটি নতুন ক্লাস যুক্ত করুন যা এই আচরণটি বর্ণনা করে এবং এটি - প্যাটার্নটি আপনাকে কার্যকরভাবে অন্য কোডে কোনও পরিবর্তন ছাড়াই এটিকে ছাড়তে দেয়।
সাব-ক্লাসিংয়ের মাধ্যমে, আপনি আপনার হাতে একটি দুঃস্বপ্ন পেয়েছেন।
আপনার একটি প্রশ্ন জিজ্ঞাসা করা হয়েছিল "সাবক্লাসিং কীভাবে প্যারেন্ট ক্লাস পরিবর্তন করে?" এটি এমন নয় যে এটি পিতামাতার শ্রেণি পরিবর্তন করে; যখন এটি একটি উদাহরণ বলে, তার অর্থ আপনি 'ইনস্ট্যান্টিয়েটেড' এমন কোনও বস্তুর [যদি আপনি জাভা বা সি # ব্যবহার করেন, উদাহরণস্বরূপ, newকমান্ডটি ব্যবহার করে ]। এটি যা উল্লেখ করছে তা হ'ল, আপনি যখন এই পরিবর্তনগুলি কোনও শ্রেণিতে যুক্ত করেন, তখন আপনার সেই পরিবর্তনের জন্য কোনও বিকল্প নেই, এমনকি যদি আপনার আসলে এটির প্রয়োজন না হয়।

বিকল্পভাবে, আপনি তার সমস্ত কার্যকারিতাটি পতাকাগুলির মাধ্যমে চালু / বন্ধ করে একক শ্রেণীতে রাখতে পারেন ... তবে এটি আপনার একক শ্রেণীর সাথে শেষ হয় যা আপনার প্রকল্পটি বাড়ার সাথে সাথে আরও বৃহত্তর হয়।
আপনার প্রকল্পটি এভাবে শুরু করা অস্বাভাবিক কিছু নয় এবং একবার আপনি কার্যকর সমালোচনামূলক জনকে আঘাত করলে একবার ডেকরেটার প্যাটার্নে রিফ্যাক্টর।

একটি আকর্ষণীয় পয়েন্ট যা করা উচিত: আপনি একই কার্যকারিতা একাধিক বার যোগ করতে পারেন; সুতরাং, উদাহরণস্বরূপ, আপনার ডাবল, ট্রিপল বা যে পরিমাণ পরিমাণ বা সীমানা লাগবে উইন্ডো থাকতে পারে।

প্যাটার্নের প্রধান পয়েন্টটি রান-টাইম পরিবর্তনগুলি সক্ষম করা: আপনি প্রোগ্রামটি চলমান অবধি উইন্ডোটি কীভাবে দেখতে চান তা আপনি জানেন না এবং এটি আপনাকে সহজেই এটি পরিবর্তন করতে দেয়। মঞ্জুর, এটি সাবক্লাসিংয়ের মাধ্যমে করা যেতে পারে তবে দুর্দান্তভাবে নয়।
এবং পরিশেষে, এটি এমন ক্লাসগুলিতে কার্যকারিতা যুক্ত করার অনুমতি দেয় যা আপনি সম্পাদনা করতে পারবেন না - উদাহরণস্বরূপ সিল করা / চূড়ান্ত শ্রেণিতে, বা অন্যান্য API থেকে সরবরাহ করা


2
ধন্যবাদ, ফারেল - আপনি যখন বলছেন "বিকল্পভাবে, আপনি তার সমস্ত কার্যকারিতাটি পতাকাগুলির মাধ্যমে চালু / বন্ধ করে একটি একক শ্রেণিতে রাখতে পারেন ... তবে এটি আপনার একক শ্রেণীর সাথে শেষ হবে যা আপনার প্রকল্পটি বাড়ার সাথে সাথে আরও বৃহত্তর হয়ে উঠবে।" এটি আমার জন্য এটি ক্লিক করে তোলে। আমি মনে করি যে ইস্যুটির অংশটি আমি এমন কোনও ক্লাসে কখনও কাজ করি নি যা ডেকোরেটরটি আমার কাছে বুঝতে পেরেছিল। বড় ভাবছি, আমি অবশ্যই সুবিধাগুলি দেখতে পারি ... ধন্যবাদ!
জিম

এছাড়াও, সিল করা ক্লাসগুলির অংশটি প্রচুর অর্থবোধ করে ... ধন্যবাদ!
জিম

3

সাবক্লাসিংয়ের সাথে স্ক্রোলবার এবং সীমানা যুক্ত করার সম্ভাবনাগুলি বিবেচনা করুন। আপনি যদি প্রতিটি সম্ভাবনা চান তবে আপনি চারটি ক্লাস (পাইথন) পাবেন:

class Window(object):
    def draw(self):
        "do actual drawing of window"

class WindowWithScrollBar(Window):
    def draw(self):
        Window.draw(self)
        "do actual drawing of scrollbar"

class WindowWithBorder(Window):
    def draw(self):
        Window.draw(self)
        "do actual drawing of border"

class WindowWithScrollBarAndBorder(Window):
    def draw(self):
        WindowWithScrollBar.draw(self)
        WindowWithBorder.draw(self)

এখন, WindowWithScrollBarAndBorder.draw()উইন্ডোটি দু'বার টানা হবে এবং দ্বিতীয়বার এটি ইতিমধ্যে টানা স্ক্রোলবার প্রয়োগের উপর নির্ভর করে ওভাররাইট করতে পারে বা নাও করতে পারে। সুতরাং আপনার উত্পন্ন কোডটি অন্য শ্রেণীর প্রয়োগের জন্য দৃly়ভাবে মিলিত হয়েছে এবং আপনি যখনই Windowক্লাসের আচরণকে পরিবর্তন করেন তখন আপনাকে সেই বিষয়টির যত্ন নিতে হবে । একটি সমাধান হ'ল উত্সযুক্ত ক্লাসগুলি থেকে সুপার ক্লাসের কোডটি কপি-পেস্ট করা এবং উত্পন্ন শ্রেণীর প্রয়োজনের সাথে সামঞ্জস্য করা, তবে একটি সুপার ক্লাসের প্রতিটি পরিবর্তন অবশ্যই আবার কপি-পেস্ট করা উচিত এবং আবার সামঞ্জস্য করা উচিত, সুতরাং আবার উত্পন্ন ক্লাসগুলি হ'ল বেস ক্লাসে শক্তভাবে মিলিত (কপি-পেস্ট-অ্যাডজাস্টের প্রয়োজনের মাধ্যমে)। অন্য সমস্যাটি হ'ল যদি আপনার উইন্ডোতে থাকতে পারে বা না থাকতে পারে এমন আরও একটি সম্পত্তি প্রয়োজন হয় তবে আপনাকে প্রতিটি শ্রেণি দ্বিগুণ করতে হবে:

class Window(object):
    ...

class WindowWithGimmick(Window):
    ...

class WindowWithScrollBar(Window):
    ...

class WindowWithBorder(Window):
    ...

class WindowWithScrollBarAndBorder(Window):
    ...

class WindowWithScrollBarAndGimmick(Window):
    ...

class WindowWithBorderAndGimmick(Window):
    ...

class WindowWithScrollBarAndBorderAndGimmick(Window):
    ...

এর অর্থ পার্শ্ববর্তী চূড়ান্ত স্বতন্ত্র বৈশিষ্ট্যগুলির একটি সেট এর সাথে | চ | বৈশিষ্ট্যগুলির সংখ্যা হওয়ায় আপনাকে 2 ** | চ | সংজ্ঞা দিতে হবে ক্লাস, যেমন। যদি আপনার 10 টি বৈশিষ্ট্য থাকে তবে আপনি 1024 টি কঠোরভাবে আবদ্ধ ক্লাস পান। আপনি যদি ডেকোরেটর প্যাটার্ন ব্যবহার করেন তবে প্রতিটি বৈশিষ্ট্য তার নিজস্ব স্বতন্ত্র এবং আলগাভাবে যুগল শ্রেণীর পায় এবং আপনার কাছে কেবল 1 + | চ | ক্লাস (এটি উপরের উদাহরণের জন্য 11)।


দেখুন, আমার চিন্তাভাবনা ক্লাস যুক্ত করা চালিয়ে যাওয়া নয় - এটি আসল (উপ) শ্রেণিতে ফানশনালিটি যুক্ত করা হবে। ক্লাস উইন্ডোতে (অবজেক্ট): আপনার স্ক্রোলবার আছে = সত্য, সীমানা = মিথ্যা, ইত্যাদি ... উত্তর ফারেল আমাকে দেখায় যে এটি কোথায় ভুল হতে পারে - তবে কেবল স্ফীত ক্লাস এবং এরকম ... উত্তরের জন্য ধন্যবাদ, +1 টি!
জিম

ঠিক আছে, +1 একবার আমার কাছে এমন করার মতো প্রতিনিধি!
জিম

2

আমি এই নির্দিষ্ট প্যাটার্নের বিশেষজ্ঞ নই, তবে আমি দেখতে পাচ্ছি যে ডেকোরেটর প্যাটার্নটি এমন ক্লাসগুলিতে প্রয়োগ করা যেতে পারে যেগুলি আপনার সংশোধন বা উপ-শ্রেণীর করার ক্ষমতা নাও থাকতে পারে (উদাহরণস্বরূপ, তারা আপনার কোড নাও হতে পারে এবং সীলমোহর করা হতে পারে) )। আপনার উদাহরণস্বরূপ, আপনি যদি উইন্ডো ক্লাসটি না লিখে থাকেন তবে কেবল এটি ব্যবহার করছেন? উইন্ডো শ্রেণীর একটি ইন্টারফেস রয়েছে এবং আপনি সেই ইন্টারফেসের বিরুদ্ধে প্রোগ্রাম করেছেন যতক্ষণ না আপনার ডেকোরেটর একই ইন্টারফেস ব্যবহার করতে পারে তবে কার্যকারিতা বাড়িয়ে তোলে।

আপনি যে উদাহরণটি উল্লেখ করেছেন তা এখানে বেশ ঝরঝরেভাবে আবৃত রয়েছে :

কোনও অবজেক্টের কার্যকারিতা প্রসারিত করা উত্তরাধিকার ব্যবহার করে স্থিতিশীলভাবে (সংকলন সময়ে) করা যেতে পারে তবে কোনও বস্তুর ব্যবহার হিসাবে কোনও বস্তুর কার্যকারিতা গতিশীলভাবে (রানটাইম সময়ে) বাড়ানো প্রয়োজন হতে পারে।

গ্রাফিকাল উইন্ডোর সাধারণ উদাহরণ বিবেচনা করুন। উদাহরণস্বরূপ গ্রাফিকাল উইন্ডোটির কার্যকারিতা বাড়াতে উইন্ডোতে একটি ফ্রেম যুক্ত করে ফ্রেমড উইন্ডো শ্রেণি তৈরি করতে উইন্ডো শ্রেণি প্রসারিত করা প্রয়োজন। ফ্রেমযুক্ত উইন্ডো তৈরি করতে ফ্রেমড উইন্ডো শ্রেণীর একটি অবজেক্ট তৈরি করা প্রয়োজন। তবে একটি সরল উইন্ডো দিয়ে শুরু করা এবং ফ্রেমযুক্ত উইন্ডোতে রানটাইমের সময় এর কার্যকারিতা বাড়ানো অসম্ভব।

http://www.oodesign.com/decorator-pattern.html

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.