আমি কেন সরাসরি কারুকার্য তৈরির পরিবর্তে কারখানার শ্রেণি ব্যবহার করব?


162

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

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

কেন এই ধরনের পরিবর্তন কার্যকর হবে? এভাবে রিফ্যাক্টর করার কী লাভ? স্ট্যাটিক ফ্যাক্টরি পদ্ধতি কল সহ পাবলিক ক্লাস কন্সট্রাক্টরদের কলগুলি প্রতিস্থাপনের কী কী সুবিধা রয়েছে?

আমি কখন সর্বজনীন নির্মাতা ব্যবহার করব এবং কখন আমার কারখানাগুলি ব্যবহার করা উচিত?



1
একটি ফ্যাব্রিক শ্রেণি / পদ্ধতি কি?
ডোভাল

উত্তর:


56

কারখানা ক্লাসগুলি প্রায়শই প্রয়োগ করা হয় কারণ তারা প্রকল্পটিকে আরও ঘনিষ্ঠভাবে সলাইড নীতি অনুসরণ করতে দেয় । বিশেষত, ইন্টারফেস পৃথককরণ এবং নির্ভরতা বিপরীত নীতিগুলি।

কারখানা এবং ইন্টারফেস অনেক দীর্ঘমেয়াদী নমনীয়তার জন্য অনুমতি দেয়। এটি আরও decoupled - এবং তাই আরও পরীক্ষামূলক - নকশা জন্য অনুমতি দেয়। আপনি কেন এই পথে নামতে পারেন তার একটি অব্যক্ত তালিকা এখানে নেই:

  • এটি আপনাকে সহজেই নিয়ন্ত্রণের একটি ইনভার্সন (আইওসি) ধারক প্রবর্তন করতে দেয়
  • আপনি ইন্টারফেসকে মক করতে পারেন এটি আপনার কোডটিকে আরও পরীক্ষামূলক করে তোলে
  • অ্যাপ্লিকেশন পরিবর্তন করার সময় আসার পরে এটি আপনাকে আরও অনেক নমনীয়তা দেয় (যেমন আপনি নির্ভরযোগ্য কোড পরিবর্তন না করেই নতুন বাস্তবায়ন তৈরি করতে পারেন)

এই পরিস্থিতি বিবেচনা করুন।

সমাবেশ এ (-> এর অর্থ নির্ভর করে):

Class A -> Class B
Class A -> Class C
Class B -> Class D

আমি বি বি ক্লাসিকে বিধানসভা বিতে স্থানান্তর করতে চাই, যা বিধানসভা এ-এর উপর নির্ভরশীল these যদি আমি ইন্টারফেস ব্যবহার করি তবে আমি ব্যথা অনেকটা এড়াতে পারি।

সমাবেশ এ:

Class A -> Interface IB
Class A -> Interface IC
Class B -> Interface IB
Class C -> Interface IC
Class B -> Interface ID
Class D -> Interface ID

আমি এখন ক্লাস বি কে কোনও ব্যথা ছাড়াই বিধানসভা বিতে স্থানান্তর করতে পারি। এটি এখনও সমাবেশ এ এর ​​ইন্টারফেসের উপর নির্ভর করে

আপনার নির্ভরতাগুলি সমাধান করতে আইওসি পাত্রে ব্যবহার আপনাকে আরও নমনীয়তা দেয় allows আপনি যখনই ক্লাসের নির্ভরতা পরিবর্তন করেন কনস্ট্রাক্টরের কাছে প্রতিটি কল আপডেট করার দরকার নেই।

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


40
আইএমও কারখানাগুলি সলিডের জন্য কমপক্ষে গুরুত্বপূর্ণ জিনিস। কারখানা ছাড়াই আপনি সলিড ঠিক করতে পারেন।
ইউফোরিক

26
একটা জিনিস যা আমার কাছে কখনই বোধগম্য হয়নি তা হ'ল আপনি যদি নতুন নতুন জিনিস তৈরির জন্য কারখানাগুলি ব্যবহার করেন তবে আপনাকে প্রথমে কারখানাটি তৈরি করতে হবে । সুতরাং ঠিক যে আপনি পেতে কি? এটা কি ধরে নেওয়া হয় যে আপনি নিজেরাই ইনস্ট্যান্ট করার পরিবর্তে অন্য কারও কারখানা আপনাকে দেবে, না অন্য কিছু? উত্তরে এটি উল্লেখ করা উচিত, অন্যথায় এটি স্পষ্ট নয় যে কারখানাগুলি আসলে কোনও সমস্যার সমাধান করে।
মেহরদাদ

8
@ বিও - আপনি যতবারই নতুন বাস্তবায়ন যুক্ত করবেন তা বাদে, এখন আপনি ফ্যাক্টরিটি খুলুন এবং নতুন বাস্তবায়নের জন্য অ্যাকাউন্টটিতে এটি সংশোধন করতে পারবেন - স্পষ্টভাবে ওসিপি লঙ্ঘন করে।
টেলাস্টিন

6
@ টেলাস্টিন হ্যাঁ, তবে তৈরি বস্তুগুলি ব্যবহার করে কোড পরিবর্তন হয় না। কারখানার পরিবর্তনগুলি পরে এটি আরও গুরুত্বপূর্ণ।
BЈовић

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

126

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

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

অনেকগুলি কারখানা তৈরি করা হয়েছে কারণ "হয়তো, একদিন, আমার অবশ্যই সেই ক্লাসগুলি আলাদাভাবে তৈরি করা দরকার" in যা YAGNI এর স্পষ্ট লঙ্ঘন ।

আপনি আইওসি কাঠামোটি চালু করার সময় কারখানাগুলি অচল হয়ে যায়, কারণ আইওসি কেবল এক ধরণের কারখানা। এবং অনেক আইওসি ফ্রেমওয়ার্ক নির্দিষ্ট কারখানার বাস্তবায়ন তৈরি করতে সক্ষম হয়।

এছাড়াও, এমন কোনও ডিজাইনের প্যাটার্ন নেই যা বলছে এমন CreateXXXপদ্ধতিগুলির সাথে বিশাল স্ট্যাটিক ক্লাস তৈরি করতে যা কেবলমাত্র কনস্ট্রাক্টরকে কল করে। এবং এটিকে বিশেষত কারখানা (না বিমূর্ত কারখানা) বলা হয় না।


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

11
@ অ্যালেক্সজি - হ ... অনুশীলনে, অনেকগুলি আইওসি পাত্রে কারখানা হিসাবে কাজ করে।
টেলাস্টিন

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

5
একটি পার্থক্য করা আছে। কারখানা প্যাটার্ন একটি প্রোগ্রাম এর রানটাইম সময় সত্ত্বা তৈরি করতে একটি ভোক্তা দ্বারা ব্যবহৃত হয়। একটি আইওসি পাত্রে প্রারম্ভকালীন সময় প্রোগ্রামটির অবজেক্ট গ্রাফ তৈরি করতে ব্যবহৃত হয়। আপনি হাত দিয়ে এটি করতে পারেন, ধারকটি কেবল একটি সুবিধা। কোনও কারখানার গ্রাহককে আইওসি পাত্রে সচেতন হওয়া উচিত নয়।
অ্যালেক্সফক্সগিল

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

79

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

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

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

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

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


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

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

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

2
নিখুঁত উত্তর. 'তত্ত্বটি বাস্তবের সাথে মিলিত হয়' অংশের সাথে ডান পয়েন্ট। আপনার কয়েক হাজার বিকাশকারী এবং মানব সময় কার্গো-কাল্টকে প্রশংসা, ন্যায্যতা, বাস্তবায়ন, তাদের ব্যবহার করে আপনার বর্ণিত একই পরিস্থিতিতে পড়ার জন্য ব্যয় করেছেন তা ভেবে দেখুন কেবল মাতাল হওয়া। YAGNI অনুসরণ করে, Ive কখনই কোনও কারখানা বাস্তবায়নের প্রয়োজনীয়তা সনাক্ত করতে পারেনি
Breno Salgado

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

33

সংক্ষিপ্ত, সাধারণ কোড থাকাতে কনস্ট্রাক্টররা ভাল থাকে।

যখন সূচনা ক্ষেত্রগুলিতে কয়েকটি ভেরিয়েবল নির্ধারণের চেয়ে বেশি হয়ে ওঠে, তখন একটি কারখানাটি বোধগম্য হয়। এখানে কিছু সুবিধা রয়েছে:

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

  • কিছু ভাষা এবং কিছু ক্ষেত্রে, নির্মাতাদের ব্যতিক্রম ছোঁড়া একটি সত্যই খারাপ ধারণা , যেহেতু এটি বাগগুলি প্রবর্তন করতে পারে।

  • আপনি যখন কোনও কনস্ট্রাক্টরকে ডাকেন, আপনাকে, কলার, আপনি যে উদাহরণটি তৈরি করতে চান তার সঠিক ধরণের বিষয়টি জানতে হবে। এটি সর্বদা ক্ষেত্রে হয় না (যেমন হিসাবে এটি খাওয়ানোর Feederজন্য আমার কেবল এটি নির্মাণ করা প্রয়োজন Animal; এটি কোনও Dogবা ক হয় কিনা তা আমি যত্ন করি না Cat)।


2
পছন্দগুলি কেবল "কারখানা" বা "নির্মাতা" নয়। একটি Feederনাও ব্যবহার করতে পারে এবং পরিবর্তে এটির Kennelবস্তুর getHungryAnimalপদ্ধতিটিকে কল করে ।
ডগএম

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

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

তবে এই যুক্তিটি বৈধ সত্য Builder Patternহিসাবেও ধরে নেওয়া যেতে পারে । তাই না?
soufrk

কনস্ট্রাক্টরদের নিয়ম
ব্রেণো সালগাদো

10

আপনি যদি ইন্টারফেসের সাথে কাজ করেন তবে আপনি প্রকৃত বাস্তবায়ন থেকে স্বতন্ত্র থাকতে পারেন। বিভিন্ন কার্যাবলী বাস্তবায়নের একটির ইনস্ট্যান্ট করতে একটি কারখানাটি (সম্পত্তি, পরামিতি বা অন্য কোনও পদ্ধতির মাধ্যমে) কনফিগার করা যায় can

একটি সাধারণ উদাহরণ: আপনি কোনও ডিভাইসের সাথে যোগাযোগ করতে চান তবে আপনি জানেন না এটি ইথারনেট, সিওএম বা ইউএসবি এর মাধ্যমে হবে কিনা you আপনি একটি ইন্টারফেস এবং 3 টি বাস্তবায়ন সংজ্ঞায়িত করেন। রানটাইমের সময় আপনি কোন পদ্ধতিটি চান তা নির্বাচন করতে পারেন এবং কারখানাটি আপনাকে যথাযথ বাস্তবায়ন দেবে।

এটি প্রায়শই ব্যবহার করুন ...


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

এখন আপনার যুক্ত নমনীয়তা রয়েছে এবং তত্ত্বের ভিত্তিতে আপনার অ্যাপ্লিকেশনটি ইথারনেট, সিওএম, ইউএসবি এবং সিরিয়াল ব্যবহার করতে পারে, তাত্ত্বিকভাবে ফায়ারলুপ বা যাই হোক না কেন, প্রস্তুত। বাস্তবে আপনার অ্যাপ্লিকেশন কেবল ইথারনেট .... সর্বদা যোগাযোগ করবে।
পিটার বি

7

এটি জাভা / সি # এর মডিউল সিস্টেমে সীমাবদ্ধতার লক্ষণ।

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

আপনি করতে পারেন সাজানোর ফাইল সিস্টেম এবং কম্পাইলার অপশন যাতে পরিবর্তন ঘটানোর মাধ্যমে এই কাছাকাছি পেতে com.example.Fooএকটি ভিন্ন ফাইলে মানচিত্র, কিন্তু এই বিস্ময়কর এবং unintuitive হয়। এমনকি যদি আপনি তা করেন তবে আপনার কোডটি এখনও শ্রেণীর একমাত্র প্রয়োগের সাথে আবদ্ধ। উদাহরণস্বরূপ, আপনি যদি ক্লাসের Fooউপর নির্ভর করে এমন কোনও ক্লাস লিখেন তবে আপনি সংকলনের সময় MySetএকটি বাস্তবায়ন বেছে নিতে পারেন MySetতবে আপনি এখনও Fooদুটি ভিন্ন বাস্তবায়ন ব্যবহার করে ইনস্ট্যান্ট করতে পারবেন না MySet

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

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

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


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

2

আমার মতে, তারা কেবল সিম্পল ফ্যাক্টরি ব্যবহার করছে, যা সঠিক নকশার ধরণ নয় এবং এটি অ্যাবস্ট্রাক্ট ফ্যাক্টরি বা কারখানার পদ্ধতির সাথে বিভ্রান্ত হওয়া উচিত নয়।

এবং যেহেতু তারা একটি "হাজার হাজার ক্রিয়েটএক্সএক্সএক্সএক্স স্ট্যাটিক পদ্ধতি সহ বিশাল ফ্যাব্রিক ক্লাস" তৈরি করেছে, এটি একটি বিরোধী-প্যাটার্নে মনে হয় (সম্ভবত Godশ্বর শ্রেণি?)।

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

আমি এটিকে কলও করব না যে একটি কারখানা, কিন্তু কেবল কয়েকটি ফ্যাক্টরি "ফ্যাক্টরি" প্রত্যয় সহ কিছু এলোমেলো শ্রেণিতে আবদ্ধ হয়।


1
সিম্পল ফ্যাক্টরির এর জায়গা আছে। কল্পনা করুন কোনও সত্তা দুটি কনস্ট্রাক্টর প্যারামিটার নেয় int xএবং IFooService fooService। আপনি fooServiceসর্বত্র ঘুরে বেড়াতে চান না , তাই আপনি একটি পদ্ধতি দিয়ে একটি কারখানা তৈরি করেন Create(int x)এবং কারখানার ভিতরে পরিষেবাটি ইনজেকশন করেন।
অ্যালেক্সফক্সগিল

4
@ অ্যালেক্সজি এবং তারপরে আপনাকে তার IFactoryপরিবর্তে সর্বত্রই যেতে হবে IFooService
ইওফোরিক

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

এটিকে জিজ্ঞাসা করা প্রশ্নের সম্পূর্ণ অপ্রাসঙ্গিক বলে মনে হচ্ছে, "সরাসরি অবজেক্ট কনস্ট্রাক্টের পরিবর্তে কেন আমি ফ্যাক্টরি ক্লাস ব্যবহার করব? কখন আমি পাবলিক কনস্ট্রাক্টর ব্যবহার করব এবং কখন কারখানা ব্যবহার করব?" দেখুন কিভাবে উত্তর দিতে
মশা

1
এটি কেবল প্রশ্নের শিরোনাম, আমি মনে করি আপনি এটির বাকীটি মিস করেছেন। প্রদত্ত লিঙ্কের শেষ পয়েন্টটি দেখুন;)।
ফ্রান্সমাউইঙ্কেল

1

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

কোনও লাইব্রেরির স্রষ্টা হিসাবে আপনি যদি এই নমনীয়তাটি নিজে ব্যবহার করতে চান তবে আপনি কারখানার পদ্ধতিগুলি ব্যবহার করবেন।

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


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

-4

এটি স্কেলার যুগে এবং কার্যকরী প্রোগ্রামিংয়ে অপ্রচলিত বলে মনে হয়। ফাংশনগুলির একটি শক্ত ভিত্তি একটি গাজিলিয়ান ক্লাস প্রতিস্থাপন করে।

এছাড়াও লক্ষণীয় যে {{কোনও কারখানা ব্যবহার করার সময় জাভার ডাবল আর কাজ করে না

someFunction(new someObject() {{
    setSomeParam(...);
    etc..
}})

যা আপনাকে একটি বেনাম শ্রেণি তৈরি করতে এবং এটি কাস্টমাইজ করতে দেয়।

সময় স্পেসের দ্বিধা সময়ে টাইম ফ্যাক্টর এখন দ্রুত সিপিইউগুলির জন্য এত সঙ্কুচিত হয়ে গেছে যে কার্যকরী প্রোগ্রামিং স্পেস সঙ্কুচিত করতে সক্ষম করে কোডের আকার এখন ব্যবহারিক।


2
এই আরো একটি স্পর্শিনী মন্তব্য (দেখুন মত দেখায় কিভাবে উত্তর দিতে ), এবং কিছু তৈরি পয়েন্ট উপর সারগর্ভ প্রস্তাব বলে মনে হচ্ছে না এবং পূর্বে 9 উত্তর ব্যাখ্যা
মশা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.