"মিশ্র" ভাষায় ডিজাইন: অবজেক্ট ওরিয়েন্টেড ডিজাইন বা ফাংশনাল প্রোগ্রামিং?


11

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

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

আমি প্রথমদিকে এটি "কার্যকরী" করেছিলাম:

producer.foo(item => { updateItemInDb(item); insertLog(item) })
// calls the function passed as argument as an item is processed

তবে আমি এখন ভাবছি যে আমার আরও "OO" পদ্ধতির ব্যবহার করা উচিত:

interface IItemObserver {
  onNotify(Item)
}
class DBObserver : IItemObserver ...
class LogObserver: IItemObserver ...

producer.addObserver(new DBObserver)
producer.addObserver(new LogObserver)
producer.foo() //calls observer in a loop

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

সম্পাদনা: আমার নির্দিষ্ট দৃশ্যে আমার এটির দরকার নেই, তবে .. আপনি কীভাবে কার্যকরীভাবে "পর্যবেক্ষক" অপসারণ এবং সংযোজন বাস্তবায়ন করবেন? (অর্থাৎ আপনি কীভাবে সমস্ত কার্যকারিতাটি প্যাটার্নে প্রয়োগ করবেন?) স্রেফ একটি নতুন ফাংশন পাস করা, উদাহরণস্বরূপ?


অভিনেতাদের কী হবে?
কিরিতসুকু

ক্লাসগুলি এবং সমস্ত OOPish অকেজো স্টাফগুলি ভুলে যান। পরিবর্তে মডিউলগুলির ক্ষেত্রে আপনি আরও ভালভাবে চিন্তা করতে চান (অনুপ্রেরণার জন্য এসএমএল এবং ওক্যামেল ভাষা দেখুন) see
এসকে-যুক্তি

@ অ্যান্টোরাস যদি আপনি অভিনেতাদের উপর ভিত্তি করে কোনও পদ্ধতির সাথে তুলনা করতে পারেন তবে এটি আরও স্বাগত হবে :)
লরেঞ্জো ডিম্যাট

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

1
আমার মনে হয় আরও ভাল প্রশ্ন "এফপি উপায়ে এটি করার মাধ্যমে আপনি কোনও স্পষ্টতা বা সংস্থা হারাতে পারেন?"
djechlin

উত্তর:


0

এটি দুটি পৃথক পদ্ধতির একটি ভাল উদাহরণ যা কলিং অবজেক্টের জন্য উদ্বেগের সীমা ছাড়িয়ে কোনও কার্য সম্পাদন করার ধারণা বহন করে।

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

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


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

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

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

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

5

কার্যকরী সংস্করণটি অনেক খাটো, বজায় রাখা সহজ, সহজভাবে পড়া সহজ এবং সাধারণভাবে প্রায় প্রতিটি শ্রদ্ধায় কল্পনাযোগ্য in

Many- যদিও সবকিছু নিদর্শন থেকে অনেক দূরে হয় এমন পর্যবেক্ষকদের হিসাবে গলি বৈশিষ্ট্য, অভাব জন্য আপ করা হয়। এগুলি কার্যত কার্যত মডেল করা।


আমি একমত এবং একই অনুভূতি আছে।
লরেঞ্জো ডিম্যাট

আমি একমত এবং আমার একই অনুভূতি আছে B তবে আমার ক্রিয়ামূলক কোডটি দিয়ে আমি "প্রতারক" ছিলাম: আমার ক্ষেত্রে আমার যা প্রয়োজন তা সবই কিন্তু আমার যদি "পর্যবেক্ষক" যুক্ত এবং অপসারণের প্রয়োজন হয় তবে কী হবে? আমি আমার প্রশ্নটি সম্পাদনা করেছি
লোরেঞ্জো ডিম্যাট

5

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

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


(আইএমও) একটি ভাল উত্তরের জন্য +1। এছাড়াও, কাগজের লিঙ্কটির জন্য ধন্যবাদ: আমি এটি কিছু সময় আগে পড়েছি এবং তারপর এটি হারিয়েছি। এখন আবার খুঁজে পেয়েছি।
জর্জিও

-1

আমি কার্যত প্রশ্নের উত্তর দিতে পারি না কারণ আমি কার্যকরী ভাষায় ভাল না; তবে আমি মনে করি যতক্ষণ আপনার কাজ রয়েছে ততক্ষণ আপনার দৃষ্টিভঙ্গির বিষয়ে কম চিন্তা করা উচিত। আমি যা বুঝতে পেরেছি, যতক্ষণ না আপনি ভবিষ্যতে আরও শ্রোতাদের যোগ করছেন না বা কার্যকর করার সময় শ্রোতাদের পরিবর্তন করছেন না, আপনি খুব ভালভাবে এখানে পর্যবেক্ষক প্যাটার্ন এড়িয়ে যেতে পারেন।

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


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

এছাড়াও, আমি কোডটির সাথে সম্পর্কিত নই: তবে আমি সহযোগী প্রোগ্রামারদের সাথে মতামতটি নিয়ে মুখোমুখি করতে চাই (আমার বোঝার জন্য, এটিই প্রোগ্রামার্স
se সি এর

প্রতিবার যখন আপনি কোনও পুনরাবৃত্তি প্যাটার্নটি দেখছেন, এটি আপনার ভাষা এবং মডেলিং কাঠামোর একটি গুরুতর সীমাবদ্ধতার ইঙ্গিত ছাড়া কিছুই নয়। কোনও আদর্শ বিশ্বে কোনও নিদর্শন থাকবে না।
এসকে-যুক্তি

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

1
@ এসকে-যুক্তি: আমি ভালভাবে জানি যে কয়েকটি ভাষাগুলি প্রোগ্রামযোগ্য এবং কিছু কিছু প্রকারের সিস্টেম থেকেও প্রভাব প্রয়োগের অনুমতি দেয়। আমার বক্তব্যটি হ'ল "ওওপি" এর মতো "প্যাটার্ন" একটি দুঃখজনকভাবে ভুল বোঝাবুঝি শব্দ। একটি নিদর্শন এমন একটি জিনিস যা একই রকম তবে বিভিন্ন রূপে পুনরায় প্রদর্শিত হতে থাকে , এটি অভিন্ন সমাধানকে স্বীকার করে না । কখনও কখনও আপনি সেই ক্যাসিরিপিটিশনগুলি অদৃশ্য করে দিতে পারেন - মাল্টিমিডাডগুলি ভিজিটর / ডাবল প্রেরণকে রিডানড্যান্ট করে তোলে। এটি বোঝায় না যে "সমস্ত নিদর্শনগুলি একটি ঘাটতির লক্ষণ", কারণ এর অর্থ সত্যিকারের বিশ্বের অভাব রয়েছে। প্যাটার্নগুলি আর্কিটেকচারে উত্পন্ন , সফ্টওয়্যার নয়।
ফ্র্যাঙ্ক শায়ারার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.