কৌশল কৌশল এবং নির্ভরতা ইনজেকশন ব্যবহার করে আমরা কি উত্তরাধিকার সম্পূর্ণরূপে প্রতিস্থাপন করতে পারি?


10

উদাহরণ স্বরূপ:

var duckBehaviors = new Duckbehavior();
duckBehaviors.quackBehavior = new Quack();
duckBehaviors.flyBehavior = new FlyWithWings();
Duck mallardDuck = new Duck(DuckTypes.MallardDuck, duckBehaviors)

যেহেতু হাঁসের শ্রেণিতে সমস্ত আচরণ (বিমূর্ত) রয়েছে, তাই একটি নতুন শ্রেণি তৈরি করা MallardDuck(যা প্রসারিত Duck) প্রয়োজন মনে হয় না।

তথ্যসূত্র: প্রধান প্রথম নকশার প্যাটার্ন, অধ্যায় 1।


Duckbehavior.quackBehaviorআপনার কোডে এবং অন্যান্য ক্ষেত্রগুলির প্রকারগুলি কী ?
সর্বাধিক 630

আপনার উদাহরণে কোনও নির্ভরতা ইঞ্জেকশন নেই।
ডেভিড কনরাড

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


5
@ ডেভিডকনরড: ওপি ক্লাসের মধ্যে নতুন-ই-আপ করছে না । দ্বি / আইওসি নির্ভরতা, ইনজেকশনের সম্পর্কে না পাত্রে সম্পর্কে বা ব্যবহার না "নতুন" সম্পর্কে; এটি একটি সম্পূর্ণ orthogonal উদ্বেগ। তদাতিরিক্ত, আপনাকে সর্বদা কোথাও কোথাও কোড পরিবর্তন করতে হবে - এটি কম্পোজিশনের মূল বা কিছু কনফিগার ফাইল। নিয়ন্ত্রণটি এখানে হাঁসের প্রকারের মধ্যে উল্টানো হয় , যেহেতু নির্ভরতা তৈরির বিষয়টি নিয়ন্ত্রণ করে এমন জিনিসটি ডক কোর নয়, বাইরের কিছু প্রসঙ্গ আছে; এটি স্পষ্টতার জন্য দেওয়া খেলনার উদাহরণ হিসাবে, এটি পুরোপুরি ঠিক আছে যে বাইরের প্রসঙ্গটি কেবলমাত্র কলিং কোড দ্বারা প্রতিনিধিত্ব করা হয়।
ফিলিপ মিলোভানোভিć

উত্তর:


21

অবশ্যই, কিন্তু আমরা যে কল রচনা ও প্রতিনিধিদলের । কৌশল প্যাটার্ন এবং নির্ভরতা ইনজেকশন কাঠামোগতভাবে অনুরূপ মনে হতে পারে তবে তাদের উদ্দেশ্যগুলি পৃথক।

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

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

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

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

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

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

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

"আমরা কি" এবং "আমাদের উচিত" আলাদা প্রশ্ন। উত্তরাধিকারের উপর পছন্দসই সংমিশ্রণ কখনও উত্তরাধিকার ব্যবহার করবেন না বলে বলে। এখনও এমন ঘটনা রয়েছে যেখানে উত্তরাধিকার সর্বাধিক অর্থপূর্ণ হয়। আমি আপনাকে আমার প্রিয় উদাহরণটি দেখাব :

public class LoginFailure : System.ApplicationException {}

উত্তরাধিকার আপনাকে কেবলমাত্র একটি লাইনে আরও নির্দিষ্ট, বর্ণনামূলক নাম সহ ব্যতিক্রম তৈরি করতে দেয় ceptions

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


1
" কোনও ভাল নামের মূল্যকে কখনই হ্রাস করবেন না "। সম্রাটের নতুন পোশাকের সময়: LoginExceptionভাল নাম নয়। এটি ক্লাসিক "স্মুর নামকরণ" এবং আমি যদি তা সরিয়ে নিই তবে Exceptionআমার যা কিছু আছে Loginতা এটি আমাকে কী ভুল হয়েছে তা কিছুই বলে দেয় না।
ডেভিড আরনো

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

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

আমি তাদের নাম চাই StackOverflow, OutOfMemory, NullReferenceAccess, LoginFailureইত্যাদি মূলত, "ব্যতিক্রম" নাম অপসৃত করা। এবং প্রয়োজনে এগুলি ঠিক করুন যাতে এটি কী ভুল হয়েছে তা বর্ণনা করে।
ডেভিড আরনো

আপনার আদেশ অনুসারে ডেভিড আর্নো
candied_orange

7

আপনি প্রায় কোনও পদ্ধতিটি অন্য যে কোনও পদ্ধতিতে প্রতিস্থাপন করতে পারেন এবং এখনও কার্যক্ষম সফ্টওয়্যার উত্পাদন করতে পারেন। তবুও কিছু অন্যের তুলনায় একটি নির্দিষ্ট সমস্যার সাথে আরও ভাল ফিট।

এটি নির্ভরযোগ্য অনেক কিছুর উপর নির্ভর করে। অ্যাপ্লিকেশনটিতে পূর্ব শিল্প, দলে অভিজ্ঞতা, প্রত্যাশিত ভবিষ্যতের বিকাশ, ব্যক্তিগত পছন্দ এবং নতুনদের পক্ষে মাথা ঘুরিয়ে নেওয়া কতটা কঠিন হতে পারে, কয়েকটির নাম দেওয়া উচিত।

আপনি যেমন আরও অভিজ্ঞ এবং অন্যান্য মানুষের সৃষ্টির সাথে প্রায়শই লড়াই করতে থাকেন, আপনি সম্ভবত শেষ চিন্তার দিকে আরও বেশি জোর দেবেন।

উত্তরাধিকার এখনও একটি বৈধ এবং শক্তিশালী মডেলিংয়ের সরঞ্জাম যা অগত্যা সর্বদা সবচেয়ে নমনীয় নয় তবে এটি নতুন লোকদের যারা শক্তিশালী ডোমেনের স্পষ্ট ম্যাপিংয়ের জন্য কৃতজ্ঞ হতে পারে তাদের দৃ strong় দিকনির্দেশনা সরবরাহ করে।


-1

উত্তরাধিকার যতটা গুরুত্বপূর্ণ ছিল তা ততটা গুরুত্বপূর্ণ নয় once এটি এখনও গুরুত্বপূর্ণ , এবং এটি অপসারণ একটি খারাপ ভুল হবে।

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

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


আপনার "চরম উদাহরণ" মোটামুটিভাবে কেমন অধিকাংশ আধুনিক OO যেমন পণ্য ভাষায় ফাংশন: পাইথন উপশ্রেণী type, যে থেকে জাভা উত্তরাধিকারী অ আদিম Object, জাভাস্ক্রিপ্ট সবকিছু প্রোটোটাইপ দিয়ে শেষ হয়েছে Object, ইত্যাদি
Delioth

-1

[আমি শিরোনামের প্রশ্নের এক উদ্ভট উত্তরটি বিপত্তিযুক্ত করব]]

কৌশল কৌশল এবং নির্ভরতা ইনজেকশন ব্যবহার করে আমরা কি উত্তরাধিকার সম্পূর্ণরূপে প্রতিস্থাপন করতে পারি?

হ্যাঁ ... কৌশল প্যাটার্ন বাদে নিজেই উত্তরাধিকার ব্যবহার করে। কৌশল প্যাটার্ন ইন্টারফেস উত্তরাধিকার নিয়ে কাজ করে। রচনা + কৌশল দ্বারা উত্তরাধিকার প্রতিস্থাপন উত্তরাধিকারকে আলাদা জায়গায় নিয়ে যায়। তবুও, এই ধরনের প্রতিস্থাপন প্রায়শই করা মূল্যবান কারণ এটি স্তরক্রমকে পৃথক করে দেয় ।


2
" কৌশল প্যাটার্ন ইন্টারফেস উত্তরাধিকার নিয়ে কাজ করে "। মনে রাখবেন, কৌশল প্যাটার্ন একটি ডিজাইনের প্যাটার্ন; বাস্তবায়ন প্যাটার্ন নয়। সুতরাং এটি ইন্টারফেস ব্যবহার করে প্রয়োগ করা যেতে পারে, তবে এটি কার্যকরভাবে হ্যাশ / ফাংশনগুলির অভিধান ব্যবহার করে এটি সমানভাবে প্রয়োগ করা যেতে পারে।
ডেভিড আরনো

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

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

@ ডেভিড আর্নো মন্তব্য : ওপি প্রশ্নের সাথে সংযুক্ত থাকলে এই মন্তব্যটি ঠিক থাকবে। ওপি প্রশ্নটি প্রযুক্তিগতভাবে ভুল বর্ণিত তবে আমরা এখনও তা পেয়েছি। বিষয়টি এই নির্দিষ্ট উত্তর নয়।
রাডারবাব

@DeepakMishra মন্তব্য: । একটি "ইন্টারফেস" কোনও শ্রেণীর সমস্ত পাবলিক সদস্য। দুর্ভাগ্যক্রমে "ইন্টারফেস" অর্থ ওভারলোড হয়েছে। আমাদের অবশ্যই একটি প্রোগ্রামিং ভাষার কীওয়ার্ডinterface
রাডারবব

-2

না। যদি কোনও ম্যালার্ড হাঁসের অন্য কিছু ধরণের হাঁসের চেয়ে তাত্ক্ষণিকভাবে বিভিন্ন পরামিতিগুলির প্রয়োজন হয়, তবে এটি পরিবর্তিত হওয়া দুঃস্বপ্ন d এছাড়াও আপনি একটি হাঁস ইনস্ট্যান্ট করতে সক্ষম হওয়া উচিত? এটি ম্যালার্ড হাঁস বা ম্যান্ডারিন হাঁস বা আপনার কাছে থাকা অন্য ধরণের হাঁস

এছাড়াও আমি প্রকারগুলির চারপাশে কিছু যুক্তি চাই যাতে একটি টাইপ শ্রেণিবদ্ধ আরও ভাল হতে পারে।

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

আবার এটি সত্যিই আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে। আপনার যদি কেবল একটি হাঁস এবং ম্যালার্ড হাঁস থাকে তবে শ্রেণি শ্রেণিবিন্যাস অনেক সহজ সমাধান।

তবে আপনি এখানে কৌশলটির ধরণটি ব্যবহার করতে চান এমন একটি উদাহরণ এখানে রয়েছে: আপনার যদি গ্রাহক শ্রেণি থাকে এবং আপনি একটি বিলিং কৌশল (ইন্টারফেস) পাস করতে চান যা সুখী ঘন্টা বিলিং কৌশল বা নিয়মিত বিলিং কৌশল হতে পারে তবে আপনি এটি পাস করতে পারেন কনস্ট্রাক্টর মধ্যে। এইভাবে আপনাকে দুটি পৃথক শ্রেণীর গ্রাহক তৈরি করতে হবে না এবং আপনার স্তরক্রমের দরকার নেই। আপনার কাছে কেবল একটি গ্রাহক শ্রেণি রয়েছে।

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