পাইথনের মতো গতিময় ভাষায় এমন কোনও ডিজাইনের নিদর্শন রয়েছে যা অপ্রয়োজনীয়?


98

আমি জিওএফ দ্বারা ডিজাইন প্যাটার্ন বইটি পড়া শুরু করেছি। কিছু নিদর্শন কেবলমাত্র সামান্য ধারণামূলক পার্থক্যের সাথে খুব মিল বলে মনে হয়।

পাইথনের মতো গতিময় ভাষায় (যেমন উদাহরণস্বরূপ এগুলি একটি গতিশীল বৈশিষ্ট্য দ্বারা প্রতিস্থাপিত করা হয়েছে) অযৌক্তিক অনেকগুলি নিদর্শনগুলির মধ্যে থেকে মনে করেন?


1
একটি আকর্ষণীয় প্রশ্নের ধরণ, যেহেতু এটি বোঝায় যে ভাষা পছন্দ কার্যকরভাবে কোড গঠনের বিকল্প তৈরি করতে পারে।
joshin4colours

3
কোনও উত্তর নয়, তবে প্রাসঙ্গিক - আমি ভেবেছিলাম যে জিওএফ ডিজাইনের প্যাটার্নগুলি কিছু সাধারণ নীতিগুলির জন্য যেমন প্রাসঙ্গিক ছিল তেমনি নির্দিষ্ট নিদর্শনগুলির মতো এগুলি ছড়িয়ে দেওয়া যেতে পারে। আমি কোনও প্যাটার্নের ধারণাটি বোঝাতে চাইছি না (যদিও এটি অবশ্যই তাৎপর্যপূর্ণ) তবে নিখুঁত ওওপি নীতিগুলি লঙ্ঘনকারী নির্দিষ্ট উপায়ে ক্লাস ব্যবহারের আরও অনুমতি। উদাহরণস্বরূপ, প্রচুর নিদর্শন রয়েছে যেখানে "আকৃতি" পুরোপুরি স্পষ্টভাবে "নিজেকে আঁকেন" না, বা কমপক্ষে কাজের কিছু দিক অন্য কোনও বিষয়কে অর্পণ করে। আমি মনে করি যে পাঠ্যটি ওওপি সমর্থন করে এমন কোনও ভাষায় গুরুত্বপূর্ণ।
স্টিভ 314

খুব মজার প্রশ্ন। আমি চাই +1 এর পরিবর্তে +5 করতে পারতাম।
ম্যাথঅ্যাটাক

1
দ্য ডিজাইন প্যাটার্নগুলি হারিয়ে যাওয়া ভাষার বৈশিষ্ট্য এবং নকশার প্যাটার্নগুলি সি 2 এ ভাষা বৈশিষ্ট্যগুলি হারিয়েছে । এটি কোনও 'গতিশীল ভাষা' ইস্যুও নয়। এর সহজ উদাহরণটি পুনরাবৃত্ত প্যাটার্ন যা অজগর, পার্ল (এবং এমনকি জাভা - গতিশীল নয়) এর ক্ষেত্রেও তুচ্ছ।

উত্তর:


92

পিটার নরভিগ দেখিয়েছেন যে জিওএফ বইয়ের মধ্যে পাওয়া 23 টির মধ্যে নকশাগুলির মধ্যে 16 টি অদৃশ্য বা গতিশীল ভাষায় সহজ (তিনি লিস্প এবং ডিলানের দিকে মনোনিবেশ করেছেন)।

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

আমি পাইথনের সর্বাধিক সাধারণ নকশার নিদর্শনগুলির প্রয়োগগুলি (অন্যান্য ব্যক্তি দ্বারা) সহ গিথুব সংগ্রহস্থল রাখি ।


গ্রেট! এটি উত্তরের একটি জায়গা হবে :) আমি আশা করি প্রত্যেকে যে প্রশ্নটি পরিষ্কারভাবে বুঝতে পেরেছিল।
জেরেনুক

2
নরভিগের মতে, 16 টির মধ্যে 2 জন (দোভাষী এবং আইট্রেটার) ম্যাক্রোগুলির কারণে "হয় অদৃশ্য বা সহজ" (যা পাইথনের নেই)।
এমজেএস

1
এটি আমার কাছে পরিষ্কার নয় যে এই সমস্ত নিদর্শনগুলির প্রয়োজন নেই কারণ লিস্প গতিশীল, বরং দৃ a

@ এমজেএস ইটারেটরগুলি পাইথনের একটি অন্তর্নির্মিত বৈশিষ্ট্য।
সাকিস্ক

1
এই দুর্দান্ত উত্তরটি কিছুটা অর্থহীন লিঙ্ক ক্যাপশনগুলি প্রদর্শন করে , উপস্থাপনা এবং ভান্ডারগুলিতে পরিবর্তন করে কিছুটা উন্নত করা যেতে পারে - তারা এখানে আরও ভাল তবে আপনি জানেন ... :-)
ওল্ফ

59

কোন নকশা নিদর্শন প্রয়োজন হয় না। যে কোনও ভাষায়।

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

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

এটি লেখার জন্য নির্দিষ্ট বয়লারপ্লেট কোডের চেয়ে সমস্যা সম্পর্কে ভাবার ধারণা হিসাবে নকশার ধরণগুলি ভাবতে সহায়তা করে। এবং জাভাতে কাজের মতো অনেকটা বয়লারপ্লেটে ফ্রি ফাংশন এবং স্ট্যান্ডার্ড ফাংশন অবজেক্টের অভাব রয়েছে যা আপনি তাদের অন্যান্য বেশ কয়েকটি ভাষায় ব্যবহার করেন (যেমন পাইথন, সি #, সি ++ ইত্যাদি)।

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

সুতরাং ধারণা হিসাবে সমস্ত নিদর্শন শিখুন । এবং নির্দিষ্ট বাস্তবায়ন ভুলে যান। বাস্তব জাভাতে এমনকি জাভাতেও বাস্তবায়ন পরিবর্তিত হয় এবং পরিবর্তিত হওয়া উচিত।


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

2
বিটিডব্লিউ ভিজিটর পুরোপুরি উচ্চতর ক্রমের দ্বারা প্রতিস্থাপিত হয় না - এটি এমন একটি ভাষায় ডাবল প্রেরণ প্রয়োগের সমাধান যা স্থানীয়ভাবে এটি সমর্থন করে না (যেমন সি # এবং সি ++)। (এবং এটি প্রকৃতপক্ষে খুব অল্প পরিমাণে ব্যবহার করা উচিত - আমি এটিকে অন্যতম আরকেন এবং ব্যয়বহুল নিদর্শন বলে বিবেচনা করি যার ব্যবহারটি আইএমএইচওর পক্ষে এতটা কঠিন যে আমি নিজেই এখন পর্যন্ত এটি ব্যবহার করি নি))
পিটার টারিক

14
ঠিক আছে, আপনার কোনও প্যাটার্ন দরকার নেই । আপনার যা দরকার তা হ'ল সমস্যা সমাধান করা । যদি আপনি এর জন্য কোনও নিদর্শন জানেন না, আপনি এখনও এটি সমাধান করতে পারেন, এটি আরও চিন্তাভাবনা নেবে এবং আপনি এমন একটি সমাধান নিয়ে আসতে পারেন যা কিছু প্যাটার্নের সাথে মেলে না বা এর সাথে মিলছে না। নিদর্শনগুলি জানলে এটি আরও সহজ হয়।
জানু হুডেক

3
@ জেরেনুক: হ্যাঁ, তবে মূল কথাটি হ'ল নিদর্শনগুলি ভাষা-নির্দিষ্ট নয়, সেগুলি আপনার মাথার জন্য। আপনি প্রায়শই দেখতে পান যে কিছু প্যাটার্নটি খুব সহজেই উপলব্ধি হয়ে যায় এবং পাইথনে বিভিন্ন সরঞ্জাম ব্যবহার করে, তবে একই ধারণাটি সাধারণত উপস্থিত থাকে।
জানু হুডেক

4
@ পেটারট্রিক: দর্শকের দ্বারা কোনও কিছুই প্রতিস্থাপন করা হয় না। বিষয়টি হ'ল একই ধারণাটি বিভিন্ন ক্ষেত্রে বিভিন্ন সরঞ্জাম ব্যবহার করে প্রয়োগ করা যেতে পারে তবে আমি এখনও এটি একই প্যাটার্ন হিসাবে বিবেচনা করি।
জানু হুডেক

13

পাইথনের মতো হাঁস-টাইপিত ভাষায় অ্যাবস্ট্রাক্ট ফ্যাক্টরি প্যাটার্ন অপ্রয়োজনীয়, কারণ এটি ব্যবহারিকভাবে ভাষায় নির্মিত।


10
ভাল, আপনার এখনও বিভিন্ন কারখানা প্রয়োজন। আপনার কেবল ইন্টারফেস সংজ্ঞা দরকার নেই।
স্টেফানো বোরিনি

1
আপনার যদি ক্লাস থাকে তবে আপনার ইতিমধ্যে একটি কারখানা রয়েছে। ক্লাসগুলি প্রথম শ্রেণীর অবজেক্ট এবং সর্বত্র সর্বত্র পাস করা যায় এবং কেবল কোনও বস্তু তৈরি করার জন্য বলা যেতে পারে (জাভা থেকে আলাদা নয়)। আপনার আর কিছু তৈরি করার দরকার নেই। আপনি যদি এমন কোনও কিছু চান যা ডিফল্ট নির্মাতা নয়, কেবল একটি ধরণের ল্যাম্বদা / কলযোগ্য তৈরি করুন যা কোনওভাবে কনস্ট্রাক্টরকে আবৃত করে।
spookylukey

13

একমাত্র যেটি মনে আসে তা হ'ল সিঙ্গলটন প্যাটার্ন।

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

বেশিরভাগ ক্ষেত্রে পাইথনের সিঙ্গললেটগুলি একটি মডিউল দিয়ে প্রতিস্থাপন করা হয়। পাইথনের মডিউলগুলি তাদের প্রকৃতির সিঙ্গললেটস; পাইথন ইন্টারপ্রেটার এগুলি একবার এবং একবারে তৈরি করে।

ডিজাইন প্যাটার্সের অন্যান্য সমস্ত নিদর্শনগুলি আমি পাইথনটিতে এক সময় বা অন্য সময়ে ব্যবহার করেছি এবং আপনি পাইথন স্ট্যান্ডার্ড লাইব্রেরি জুড়ে এবং পাইথন নিজেই এর উদাহরণ পাবেন।


2
আজকাল কি আসলে এটি একটি বিরোধী ধরণ নয়?
ডেন

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

1
পাইথনে আমরা কখনও তা নিয়ে মাথা ঘামাইনি কারণ সমাধানের জন্য কখনও সমস্যা হয়নি।
মার্টিজন পিটারস

1
"পাইথন আপনাকে সমস্ত কিছুর জন্য অবজেক্ট ব্যবহার করতে বাধ্য করে না" সত্য নয়। এটি জাভা যেমন দুর্বল নয়, তবুও পাইথনে সবকিছুই একটি বস্তু। এমনকি মডিউল একটি অবজেক্ট।
ভের্টেক

3
@ ডার্থফেট: কীভাবে lenকাজ করে তা সম্পর্কে আমি ভালভাবে অবগত ; গাইডো এখানে একটি সুনির্দিষ্ট পছন্দ করেছেন । আমার বক্তব্যটি দেখানো হচ্ছে যে পাইথন একটি খাঁটি ওওপি ভাষা নয়; এটি একটি বাস্তববাদী ভাষা। আমি ঐ ভাবেই পছন্দ করি.
মার্টিজান পিটারস

8

ডিজাইনের নিদর্শনগুলি প্রোগ্রামারের জন্য, ভাষার জন্য নয়। প্রোগ্রামাররা এমন নিদর্শনগুলি ব্যবহার করে যা তাদের হাতের সমস্যাটি বোঝাতে সহায়তা করে। কোনও নকশার প্যাটার্ন কঠোরভাবে প্রয়োজনীয় নয়, তবে আপনি যা করতে চেষ্টা করছেন তা সরল করে তুলতে এটি ব্যবহারে কার্যকর হতে পারে।

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

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


এটি অবশ্যই আকর্ষণীয়। তাই বিশেষত কোন নিদর্শনগুলির অর্থ আপনার অর্থ এই যে কোনওটি ভুলে যেতে পারে, কারণ পাইথনের আরও ভাল উপায় আছে?
জেরেনুক

4

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

তবে, আপনার প্রশ্নের উত্তরটি এখনও "হ্যাঁ": এর মধ্যে কিছু নকশার নিদর্শনগুলি আধুনিক গতিযুক্ত টাইপের ভাষাগুলির সাথে অপ্রাসঙ্গিক হবে। আরও সাধারণভাবে, বিভিন্ন ভাষায় বিভিন্ন ডিজাইনের ধরণ থাকবে, বিশেষত বিভিন্ন ধরণের ভাষায়।

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

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


1

নকশার নিদর্শনগুলি নির্দিষ্ট সমস্যাগুলি সমাধান করার উপায়। যদি কোনও সমস্যা পূরণ না হয় তবে সমাধানের ধরণটির কোনও ব্যবহার নেই।

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

সম্ভবত পাইথনের নিজস্ব নকশা নিদর্শন জাভা এবং। নেট লোকের জন্য উপলব্ধ নেই (এই ভাষার প্রকৃতির কারণে)?


1

আমি বলব যে নিদর্শনগুলি সর্বদা ভাষা নির্ভর। বেশিরভাগ অজগর নিদর্শনগুলি জিওএফ-তে সংজ্ঞায়িত আকারের মতো লাগে কারণ পাইথনের ওওপি এর কারণ, বলা হচ্ছে ওওপি ওওপির মতো নয় (কোনও দুটি ভাষাই বস্তু এবং তাদের ম্যানিপুলেশনকে 100% একইভাবে সংজ্ঞায়িত করে না)।

সুতরাং কোনও সন্দেহ নেই যে কিছু নিদর্শনগুলি "যেমন রয়েছে" প্রযোজ্য হবে না, কিছুটি বুদ্ধিমান হতে পারে এবং এমন কিছু নিদর্শন রয়েছে যা পাইথনের কাছে কেবল অর্থবোধক হতে পারে।

আপনার প্রশ্নের ঠিক মত ফিরে পেতে: প্যাটার্নগুলি কেবল যদি আপনার প্রয়োজন হয় তবে প্রয়োজনীয় । তাদের কোনও প্রয়োজন না থাকলে আপনার সেগুলি ব্যবহার করতে হবে না (যেমন জান হুডেক ইতিমধ্যে বলেছিলেন)।

তদুপরি, জিওএফ-তে উল্লিখিত তুলনায় অনেক বেশি নিদর্শন রয়েছে। উইকিপিডিয়াতে অন্যান্য নিদর্শনগুলি দেখুন

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