জাভা / জাভা ইই এর মতো একই রকম জটিলতা পরিচালনার সময় অন্য একটি জনপ্রিয় ভাষা কীভাবে কারখানার ধরণটি ব্যবহার করা এড়াবে?


23

কারখানার ধরণ (বা অন্তত ব্যবহার FactoryFactory..) -এর মত অনেক ঢামালি এর গুঁতা হয় এখানে

এছাড়াও বাগাড়ম্বরপূর্ণ মত "সৃজনশীল" নামগুলো থাকার থেকে RequestProcessorFactoryFactory.RequestProcessorFactory , কিছু কারখানা প্যাটার্ন সঙ্গে মৌলিকভাবে ভুল আপনি জাভা / সি প্রোগ্রাম আছে ++ এবং সেখানে একটি usecase হলে হয় Abstract_factory_pattern ?

অনুরূপ জটিলতা পরিচালনার সময় কীভাবে আর একটি জনপ্রিয় ভাষা (উদাহরণস্বরূপ, রুবি বা স্কেলা ) এটি ব্যবহার না করা এড়াতে পারে?

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



4
সমস্যাটি কারখানার ব্যবহার নয় - এটি পুরোপুরি সূক্ষ্ম বিন্যাস। এটি কারখানাগুলির অতিরিক্ত ব্যবহার যা এন্টারপ্রাইজ জাভা বিশ্বে বিশেষত প্রচলিত।
কোডসইনচাওস

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

উত্তর:


28

আপনার প্রশ্নটি "জাভা" দিয়ে ট্যাগ করা হয়েছে, কারখানার ধাঁচটি কেন উপহাস করা হচ্ছে তা আপনি জিজ্ঞাসা করছেন না: জাভা নিজেই সেই প্যাটার্নটির একটি দুর্দান্ত প্যাকেজড আপত্তি নিয়ে আসে।

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

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder(); 

Document xmlDocument = builder.parse(new FileInputStream("c:\\employees.xml"));
XPath xPath =  XPathFactory.newInstance().newXPath();

xPath.compile(expression).evaluate(xmlDocument);

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

যেহেতু আপনি বিকল্পটি কী তা জিজ্ঞাসা করছেন যে এখানে সি # তে এক্সএমএল ফাইল লোড করা হচ্ছে:

XDocument xml = XDocument.Load("c:\\employees.xml");
var nodes = xml.XPathSelectElements(expression);

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

কারখানা এবং অন্য যে কোনও নিদর্শন হ'ল সরঞ্জাম, প্রতিটি নির্দিষ্ট কাজের জন্য উপযুক্ত। আপনি যদি তাদের চাকরিতে প্রয়োগ করেন তবে আপনার পক্ষে কুশল কোড থাকতে বাধ্য for


1
আপনার সি # বিকল্পটি এক্সএমএল-তে নতুন লিনকুই ব্যবহার করছে - একটি পুরানো ডিওএম বিকল্পটি দেখতে এরকম কিছু দেখতে পেত: XmlDocument xml = new XmlDocument(); xml.Load("c:\\employees.xml"); XmlNodeList nodes = xml.SelectNodes(expression); (সামগ্রিকভাবে, লিনকু থেকে এক্সএমএল ব্যবহার করা আরও সহজ, যদিও বেশিরভাগ ক্ষেত্রে অন্যান্য ক্ষেত্রে)) এবং এখানে একটি কেবি নিবন্ধ রয়েছে আমি একটি এমএস-প্রস্তাবিত পদ্ধতি সহ পেয়েছি: সমর্থন.microsoft.com/kb/308333
বব

36

প্রায়শই, লোকেরা কী ঘটছে তা ভুল বুঝে (এবং এতে অনেক হাসিও রয়েছে)।
এটি প্রতি কারখানার প্যাটার্ন নয় যা অনেকগুলি (সম্ভবত বেশিরভাগ) লোকেরা এটি ব্যবহার করে as

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

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

সিস্টেমে একটি ডেটাবেস 5 ম সাধারণ ফর্মালায় সাধারণ করা হয়েছিল (আমি আপনাকে ছাগল না)।

একটি সিস্টেম যা মূলত ঠিকানা বইয়ের চেয়ে সামান্য ছিল যা ইনকামিং এবং আউটগোয়িং ডকুমেন্টগুলিকে লগ এবং ট্র্যাক করতে ব্যবহৃত হতে পারে, এতে সি ++ এবং 50 টিরও বেশি ডাটাবেস টেবিলগুলিতে 100MB কোডবেস ছিল। সফটওয়্যারটি চালিত কম্পিউটারের সাথে সরাসরি সংযুক্ত প্রিন্টারটি ব্যবহার করে 500 ফর্ম চিঠিগুলি মুদ্রণ করতে 72 ঘন্টা সময় লাগবে।

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


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

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

1
@ ডোভাল আপনি কি আমাকে বলতে পারবেন যে আপনি যখন এক্সিকিউটিভ পাস করতে পারবেন তখন আপনি কীভাবে এক্সিকিউটড কমান্ড বা ডাকা কৌশল হিসাবে মূল্য ফেরান? এবং যদি আপনি ক্লোজারগুলি বলেন, তবে মনে রাখবেন এটি আরও ক্লাসিক বাদে ক্লাস তৈরির মতো একই জিনিস।
ইউফোরিক

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

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

17

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

WidgetFactory redWidgetFactory = new ColoredWidgetFactory(COLOR_RED);
Widget widget = redWidgetFactory.create();

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

WidgetBuilder widgetBuilder = new WidgetBuilder();
widgetBuilder.setColor(COLOR_RED);
Widget widget = widgetBuilder.create();

কিন্তু যখন ওভাররেইঞ্জিরিং আপনার সমস্যা হয় তখন কোনও বিল্ডারের সাথে কারখানার প্রতিস্থাপন করা সম্ভবত কোনও উন্নতি হয় না।

উভয়ই প্যাটার্নের সর্বাধিক সহজ প্রতিস্থাপনটি অবশ্যই newঅপারেটরের সাথে একটি সাধারণ কনস্ট্রাক্টরের সাথে অবজেক্ট-ইনস্ট্যান্স তৈরি করা :

Widget widget = new ColoredWidget(COLOR_RED);

কনস্ট্রাক্টরগুলির অবশ্য বেশিরভাগ অবজেক্ট-ভিত্তিক ভাষাগুলিতে একটি গুরুত্বপূর্ণ ত্রুটি রয়েছে: তাদের অবশ্যই সেই সঠিক শ্রেণীর একটি বস্তু ফেরত দিতে হবে এবং উপ-প্রকারটি ফিরে আসতে পারে না।

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

 Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget

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


2
একটি কারখানা প্রায়শই তৈরির পরে কনফিগার করা যায়। একজন বিল্ডারের কাছে প্রধান পার্থক্য হ'ল একজন বিল্ডার সাধারণত একটি একক, জটিল উদাহরণ তৈরি করতে ব্যবহৃত হয়, যখন কারখানাগুলি অনেকগুলি অনুরূপ উদাহরণ তৈরি করতে ব্যবহৃত হয়।
সেফালপড

1
ধন্যবাদ (+1), তবে উত্তরটি অন্য PLs কীভাবে এটি সমাধান করবে তা ব্যাখ্যা করতে ব্যর্থ হয়েছে, তবুও জাভা 8 পদ্ধতির উল্লেখগুলি উল্লেখ করার জন্য ধন্যবাদ।
সেন্সিইউউ

1
আমি প্রায়শই ভেবেছি যে কোনও বস্তু-ভিত্তিক কাঠামোয় এটি প্রকৃত অবজেক্ট নির্মাণকে প্রশ্নের ধরণে সীমাবদ্ধ করার জন্য অর্থবোধ করবে এবং এর foo = new Bar(23);সমতুল্য হবে foo = Bar._createInstance(23);। একটি অবজেক্ট একটি ব্যক্তিগত getRealType()পদ্ধতি ব্যবহার করে নির্ভরযোগ্যভাবে তার নিজস্ব ধরণের অনুসন্ধান করতে সক্ষম হওয়া উচিত, তবে বস্তুগুলি বাইরের কলগুলিতে ফিরে যাওয়ার জন্য একটি সুপার টাইপ নির্দিষ্ট করতে সক্ষম হওয়া উচিত getType()। বাইরের কোডের কোনও কল নেই যে কোনও কল new String("A")আসলে String[উদাহরণস্বরূপ যেমন - উদাহরণস্বরূপ বিপরীতে SingleCharacterString] এর কোনও উদাহরণ দেয় কিনা n't
সুপারকেট

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

1
@ সুপের্যাট আপনি উদ্দেশ্য-সি-তে একবার নজর দিতে আগ্রহী হতে পারেন। সেখানে অবজেক্টগুলি নির্মাণ করার জন্য সাধারণত সাধারণ পদ্ধতি কল থাকে [[SomeClass alloc] init]। সম্পূর্ণ ভিন্ন শ্রেণীর উদাহরণ বা অন্য কোনও অবজেক্ট (যেমন একটি ক্যাশেড মান)
ফিরিয়ে দেওয়া সম্ভব

3

এক বা অন্য ধরণের কারখানাগুলি যথাযথ পরিস্থিতিতে উপযুক্ত কোনও বস্তু-ভিত্তিক ভাষায় পাওয়া যায়। স্ট্রিংয়ের মতো সাধারণ প্যারামিটারের উপর ভিত্তি করে কোন ধরণের অবজেক্ট তৈরি করতে হবে তা নির্বাচনের জন্য আপনার মাঝে মাঝে কেবল সরল প্রয়োজন।

কিছু লোক এটিকে খুব বেশি দূরে নিয়ে যায় এবং কারখানার অভ্যন্তর ছাড়া কখনও কোনও কনস্ট্রাক্টরকে কল করার প্রয়োজন হয় না বলে তাদের কোডটি আর্কিটেক্ট করার চেষ্টা করে। আপনার কারখানার কারখানার জিনিসগুলি হাস্যকর হতে শুরু করে।

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

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


ধন্যবাদ (+1 টি)। আপনার উত্তর কীভাবে স্কালা এড়াতে পারে সে সম্পর্কে আমার কিছু সন্দেহের ব্যাখ্যা দেয়। সত্যিই, আপনি কি ভাবেন না যে একবার (যদি) স্কেল এন্টারপ্রাইজ স্তরে জাভা হিসাবে কমপক্ষে অর্ধেক জনপ্রিয় হয়ে উঠবে, ফ্রেমওয়ার্ক, প্যাটার্নস, পেইড অ্যাপ সার্ভার ইত্যাদির পপ আপ হয়ে যাবে?
সেন্সিওয়ু

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

2

সাধারণভাবে, এই প্রবণতাটি রয়েছে যে জাভা প্রোগ্রামগুলি ভয়াবহভাবে অতিরিক্ত ইঞ্জিনিয়ারড [উদ্ধৃতি প্রয়োজন]। ওভার ইঞ্জিনিয়ারিংয়ের অন্যতম সাধারণ লক্ষণ হ'ল বহু কারখানা থাকা; এই কারণেই লোকেরা তাদের মজা করে।

বিশেষত, জাভা কারখানার ক্ষেত্রে সমস্যাটি হ'ল জাভাতে ক) কনস্ট্রাক্টরগুলি ফাংশন নয় এবং খ) ফাংশনগুলি প্রথম শ্রেণির নাগরিক নয়।

কল্পনা করুন আপনি এই জাতীয় কিছু লিখতে পারেন (আসুন জেআরইরFunction একটি সুপরিচিত ইন্টারফেস হোক )

// Framework code
public Node buildTree(Function<BranchNode, Node, Node> branchNodeFactory) {
    Node current = nextNode();
    while (hasNextNode()) {
        current = branchNodeFactory.call(current, nextNode());
    }
    return current
}

// MyDataNode.java
public class MyBranchNode implements BranchNode {

    public MyBranchNode(Node left, Node right) { ... }
}

// Client code
Node root = buildTree(MyBranchNode::new);

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

সুতরাং, বিকল্পটি এতটা "আলাদা প্যাটার্ন ব্যবহার করুন" নয়, তবে আরও বেশি "আরও ভাল বস্তুর মডেল সহ একটি ভাষা ব্যবহার করুন" বা "ওভার ইঞ্জিনিয়ার সহজ সমস্যাগুলি করবেন না"।


2
এটি এমনকি জিজ্ঞাসিত প্রশ্নের উত্তর দেওয়ার চেষ্টাও করে না: "বিকল্পগুলি কী?"
gnat

1
দ্বিতীয় অনুচ্ছেদের অতীত পড়ুন এবং আপনি "অন্যান্য ভাষাগুলি কীভাবে এটি" অংশে পাবেন। (পিএস: অন্য
উত্তরটিও

4
@gnat তিনি কি পরোক্ষভাবে বলছেন না বিকল্পটি প্রথম শ্রেণির ফাংশন ব্যবহার করা? আপনি যা চান সেটি যদি একটি কালো বাক্স যা বস্তু তৈরি করতে পারে তবে আপনার বিকল্পগুলি হয় একটি কারখানা বা একটি ফাংশন এবং কারখানার ছদ্মবেশে কেবল একটি ফাংশন।
ডোভাল

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

সত্য, তবে এটি প্রায়শই গতিশীল ভাষাগুলিতে পাওয়া যায়। আমি আমার উত্তরের শুরুতে প্রথম শ্রেণির ফাংশনটির প্রয়োজনীয়তার কথা উল্লেখ করেছি।
সেফালোপড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.