কারখানা প্যাটার্ন কি খোলা / বন্ধ নীতি লঙ্ঘন করে?


14

এই শেফফ্যাক্টরি শর্তসাপূর্ণ বিবৃতিগুলি কী কী অবজেক্টটি ইনস্ট্যান্ট করতে হবে তা নির্ধারণ করতে ব্যবহার করে। আমরা কি ভবিষ্যতে অন্যান্য ক্লাস যুক্ত করতে চাইলে আমাদের শেপফ্যাক্টরি সংশোধন করতে হবে না? কেন এটি খোলা বন্ধ নীতি লঙ্ঘন করে না?

কারখানার প্যাটার্ন ডিজাইন

শেপফ্যাক্টরি ডিজাইন


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


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

@ আরমনসফাই: আপনি এই ব্লগ পোস্টটিকে অনেকগুলি সংযুক্ত করছেন, তবে কেন এটি সত্য তা ব্যাখ্যা করছেন না। আমরা সবাই কি কোনওভাবে এই প্যাটার্ন সম্পর্কে অজ্ঞ? আমাদের মতো গুগলও আছে, ঠিক তেমনি।
রবার্ট হার্ভে

1
@ রবার্টহারভে আমি এই ব্লগ পোস্টটির সাথে লিঙ্কটি দেখিয়ে দিচ্ছি যে পৃষ্ঠাটির কারখানার প্যাটার্নটি কীভাবে শর্তসাপেক্ষ ব্যবহার করছে
আরমন সাফাই

উত্তর:


20

প্রচলিত অবজেক্ট-ভিত্তিক জ্ঞান হ'ল ifবিবৃতি এড়ানো এবং একটি বিমূর্ত শ্রেণীর সাবক্লাসে ওভাররাইড পদ্ধতিগুলির গতিশীল প্রেরণের মাধ্যমে তাদের প্রতিস্থাপন করা। এ পর্যন্ত সব ঠিকই.

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

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


2
প্রচুর ifএস ছাড়াই কারখানার প্যাটার্ন তৈরি করা পুরোপুরি সম্ভব । এটি কীভাবে অর্জন করা যায় তার একটি সহজ উদাহরণের জন্য @ বি এর উত্তর দেখুন। Downvoted।
ডেভিড আরনো


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

1
ভয়ঙ্কর বিবৃতি যা কোনওভাবেই প্রশ্নের উত্তর দেয় না।
মার্টিন মাট

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

5

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

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

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


আপনি কীভাবে একটি মানচিত্র / কনফিগারেশন / রেজিস্ট্রি কাজ করবে তা ব্যাখ্যা করতে পারেন?
আরমন সাফাই

@ আরমনসফাই: এখানে একটি উদাহরণ: jkfill.com/2010/12/29/self-registering-factories-in-c-sharp
জ্যাকবিবি

স্ব-নিবন্ধকরণ কারখানাগুলি, আফাইক, স্ট্যাটিক লাইব্রেরির ভিতরে সি ++ এ অসম্ভব, যেহেতু অব্যবহৃত (অর্থাত অদ্ভুত-ব্যবহৃত) গ্লোবাল ভেরিয়েবলগুলি সরঞ্জামচেইনগুলি দ্বারা বাতিল করা হয়।
void.pointer

@ আরমনসফাই আরও বুঝতে goo.gl/RYuNSM
এজেড_

2

প্যাটার্নটি নিজেই ওপেন / ক্লোজড নীতি (ওসিপি) লঙ্ঘন করে না। তবে, আমরা যখন প্যাটার্নটি ভুলভাবে ব্যবহার করি তখন আমরা ওসিপি লঙ্ঘন করি।

এই প্রশ্নের সহজ উত্তর নিম্নরূপ:

  1. কারখানার পদ্ধতি প্যাটার্ন ব্যবহার করে আপনার বেস কার্যকারিতা তৈরি করুন ।
  2. বিমূর্ত কারখানা প্যাটার্ন ব্যবহার করে আপনার কার্যকারিতা প্রসারিত করুন EX

প্রদত্ত উদাহরণে আপনার বেস কার্যকারিতা তিনটি আকারকে সমর্থন করে: বৃত্ত, আয়তক্ষেত্র এবং স্কোয়ার। মনে করুন ভবিষ্যতে আপনার ট্রায়াঙ্গেল, পেন্টাগন এবং হেক্সাগনকে সমর্থন করতে হবে। এই কাজের জন্য ছাড়া OCP লঙ্ঘন, আপনি একটি অতিরিক্ত কারখানা আপনার নতুন আকার (আসুন নামক সমর্থন করার জন্য তৈরি করতে হবে AdvancedShapeFactory) এবং তারপর ব্যবহার AbstractFactory সিদ্ধান্ত নিতে কি কারখানা আপনি তৈরি করতে যাই হোক না কেন আপনি প্রয়োজন আকার তৈরি করতে হবে।


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

1

আপনি যদি অ্যাবস্ট্রাক্ট ফ্যাক্টরি প্যাটার্ন সম্পর্কে কথা বলছেন, সিদ্ধান্তটি প্রায়শই কারখানায় থাকে না তবে অ্যাপ্লিকেশন কোডে থাকে। এটি সেই কোড যা কোন কংক্রিট কারখানাটি ইনস্ট্যান্ট করতে এবং ক্লায়েন্ট কোডটি পাস করার জন্য চয়ন করে যা কারখানার দ্বারা উত্পাদিত অবজেক্টগুলিকে ব্যবহার করবে। জাভা উদাহরণের শেষটি এখানে দেখুন: https://en.wikedia.org/wiki/Abstract_factory_pattern

সিদ্ধান্ত গ্রহণ অগত্যা ifবিবৃতি বোঝায় না । এটি একটি কনফিগার ফাইল থেকে কংক্রিট কারখানার ধরণ পড়তে পারে, মানচিত্রের কাঠামো থেকে শুরু করে ইত্যাদি could



আমি যদি কলকারী সিদ্ধান্ত নিই যে কোন কংক্রিট ক্লাসটি ইনস্ট্যান্ট করবে, তবে আমি কেন একটি বিমূর্ত কারখানায় বিরক্ত হচ্ছি?
রবার্ট হার্ভে

দয়া করে "কলার" সংজ্ঞা দিন। আমি আমার উত্তরে যেমন বর্ণনা করছি, সেখানে গ্লোবাল অ্যাপ্লিকেশন কোড রয়েছে এবং তারপরে এমন একটি কোড রয়েছে যা একটি কারখানা ব্যবহার করে অবজেক্টগুলিকে স্প্যান করতে হবে। যদিও আধুনিক প্রকৃতপক্ষে instantiate করার কংক্রিট বর্গ অবিদিত করা প্রয়োজন, কিছু অন্যান্য প্রাসঙ্গিক কোড হয়েছে এটা এবং নতুন এটি আপ সম্পর্কে জানতে ...
guillaume31

0

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

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


0

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


-2

আপনি কীভাবে এটি বাস্তবায়ন করেন এটি নির্ভর করে। আপনি std::mapঅবজেক্ট তৈরির জন্য ফাংশন পয়েন্টার ধরে রাখতে ব্যবহার করতে পারেন । তাহলে উন্মুক্ত / ঘনিষ্ঠ নীতি লঙ্ঘন করা হয় না। অথবা স্যুইচ / কেস

যাইহোক, আপনি যদি কারখানার ধরণটি পছন্দ না করেন তবে আপনি সর্বদা নির্ভরতা ইনজেকশন ব্যবহার করতে পারেন।


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

1
@ এ্যামনে আমি অন্য ধরণের ডিআই ব্যবহার করতে চাইছিলাম - কারখানাটি নয়।
BЈовић


1
আপনার ফ্যাক্টরিটি কী পয়েন্টারটি ব্যবহার করবেন তা সিদ্ধান্ত নিতে চলেছে? অবশেষে আপনাকে একটি সিদ্ধান্ত নিতে হবে।

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