আমার জন্য, যখন শুরু করার সাথে সাথে এগুলির পয়েন্টটি তখনই স্পষ্ট হয়ে যায় যখন আপনি আপনার কোডটি সহজ / দ্রুত লেখার বিষয় হিসাবে তাদের হিসাবে দেখা বন্ধ করে দেন - এটি তাদের উদ্দেশ্য নয়। তাদের বেশ কয়েকটি ব্যবহার রয়েছে:
(এটি পিজ্জা উপমা হারাতে চলেছে, কারণ এটির ব্যবহারটি কল্পনা করা খুব সহজ নয়)
বলুন আপনি স্ক্রিনে একটি সহজ গেম তৈরি করছেন এবং এতে এমন প্রাণীর উপস্থিতি রয়েছে যার সাথে আপনি ইন্টারঅ্যাক্ট করেন।
উত্তর: ভবিষ্যতে আপনার সামনের প্রান্ত এবং আপনার পিছনের শেষের প্রয়োগের মধ্যে একটি আলগা দম্পতি প্রবর্তন করে তারা ভবিষ্যতে আপনার কোড বজায় রাখা সহজ করতে পারে।
আপনি এটি শুরুতে লিখতে পারতেন, কারণ কেবল ট্রল হতে চলেছে:
// This is our back-end implementation of a troll
class Troll
{
void Walk(int distance)
{
//Implementation here
}
}
সামনের অংশ:
function SpawnCreature()
{
Troll aTroll = new Troll();
aTroll.Walk(1);
}
দুই সপ্তাহ অবধি, বিপণন স্থির করে নিন যে আপনার ওআরকেও দরকার, যেমন তারা টুইটারে তাদের সম্পর্কে পড়ে, তাই আপনাকে এরকম কিছু করতে হবে:
class Orc
{
void Walk(int distance)
{
//Implementation (orcs are faster than trolls)
}
}
সামনের অংশ:
void SpawnCreature(creatureType)
{
switch(creatureType)
{
case Orc:
Orc anOrc = new Orc();
anORc.Walk();
case Troll:
Troll aTroll = new Troll();
aTroll.Walk();
}
}
এবং আপনি দেখতে পাবেন কীভাবে এটি অগোছালো হতে শুরু করে। আপনি এখানে একটি ইন্টারফেস ব্যবহার করতে পারেন যাতে আপনার সামনের প্রান্তটি একবার লেখা হয়ে যায় এবং (এখানে গুরুত্বপূর্ণ বিটটি দেওয়া হয়) পরীক্ষা করা যায় এবং তারপরে আপনি প্রয়োজনীয়ভাবে পরবর্তী পিছনের আইটেমগুলিতে প্লাগ ইন করতে পারেন:
interface ICreature
{
void Walk(int distance)
}
public class Troll : ICreature
public class Orc : ICreature
//etc
সামনের প্রান্তটি তখন:
void SpawnCreature(creatureType)
{
ICreature creature;
switch(creatureType)
{
case Orc:
creature = new Orc();
case Troll:
creature = new Troll();
}
creature.Walk();
}
সামনের প্রান্তটি কেবল ইন্টারফেস আইক্রিচারের বিষয়ে চিন্তা করে - এটি কোনও ট্রল বা একটি অর্কের অভ্যন্তরীণ বাস্তবায়ন সম্পর্কে মাথা ঘামায় না, তবে কেবল তারা আইক্রিচারকে বাস্তবায়িত করে।
এই দৃষ্টিকোণ থেকে এটি দেখার সময় একটি গুরুত্বপূর্ণ বিষয় আপনি যে সহজেই একটি বিমূর্ত প্রাণী শ্রেণি ব্যবহার করতে পারে, এবং এই দৃষ্টিকোণ থেকে, এটি একই প্রভাব ফেলে।
এবং আপনি কোনও কারখানায় সৃজনটি বের করতে পারবেন:
public class CreatureFactory {
public ICreature GetCreature(creatureType)
{
ICreature creature;
switch(creatureType)
{
case Orc:
creature = new Orc();
case Troll:
creature = new Troll();
}
return creature;
}
}
এবং আমাদের সামনের প্রান্তটি তখন হয়ে যাবে:
CreatureFactory _factory;
void SpawnCreature(creatureType)
{
ICreature creature = _factory.GetCreature(creatureType);
creature.Walk();
}
এখন সামনের প্রান্তে এমনকি লাইব্রেরি যেখানে ট্রল এবং অর্ক প্রয়োগ করা হয়েছে তার কোনও উল্লেখ নেই (কারখানাটি একটি পৃথক লাইব্রেরিতে সরবরাহ করা হয়) - এটি তাদের সম্পর্কে কিছুই জানতে হবে না।
বি: বলুন যে আপনার কার্যকারিতা রয়েছে যে কেবলমাত্র কিছু প্রাণী আপনার অন্যথায় সমজাতীয় ডেটা কাঠামোতে থাকবে , যেমন
interface ICanTurnToStone
{
void TurnToStone();
}
public class Troll: ICreature, ICanTurnToStone
সম্মুখ সমাপ্তি তখন হতে পারে:
void SpawnCreatureInSunlight(creatureType)
{
ICreature creature;
switch(creatureType)
{
case Orc:
creature = new Orc();
case Troll:
creature = new Troll();
}
creature.Walk();
if (creature is ICanTurnToStone)
{
(ICanTurnToStone)creature.TurnToStone();
}
}
সি: নির্ভরতা ইনজেকশন জন্য ব্যবহার
যখন ফ্রন্ট এন্ড কোড এবং পিছনের শেষের প্রয়োগের মধ্যে খুব আলগা সংযোগ হয় তখন বেশিরভাগ নির্ভরতা ইনজেকশন ফ্রেমওয়ার্কগুলি কাজ করা সহজ। যদি আমরা উপরে আমাদের কারখানার উদাহরণ নিই এবং আমাদের কারখানায় একটি ইন্টারফেস প্রয়োগ করা হয়:
public interface ICreatureFactory {
ICreature GetCreature(string creatureType);
}
আমাদের সামনের প্রান্তে কনস্ট্রাক্টরের মাধ্যমে সাধারণত (সাধারণত একটি এমভিসি এপিআই নিয়ন্ত্রণকারী) ইনজেকশন দেওয়া যেতে পারে (সাধারণত):
public class CreatureController : Controller {
private readonly ICreatureFactory _factory;
public CreatureController(ICreatureFactory factory) {
_factory = factory;
}
public HttpResponseMessage TurnToStone(string creatureType) {
ICreature creature = _factory.GetCreature(creatureType);
creature.TurnToStone();
return Request.CreateResponse(HttpStatusCode.OK);
}
}
আমাদের ডিআই ফ্রেমওয়ার্ক (যেমন নিনজেক্ট বা অটোফ্যাক) এর সাহায্যে আমরা এগুলি সেট আপ করতে পারি যাতে রানটাইমের সময় যখন কোনও কনস্ট্রাক্টরে আইক্রিটিচারফ্যাক্টরি প্রয়োজন হয় তখন ক্রাইচারফ্যাক্টির একটি উদাহরণ তৈরি হবে - এটি আমাদের কোডটিকে সুন্দর এবং সহজ করে তোলে।
এর অর্থ হ'ল আমরা যখন আমাদের নিয়ামকের জন্য একটি ইউনিট পরীক্ষা লিখি, তখন আমরা একটি উপহাসকৃত আইক্রিয়াচারফ্যাক্টারি সরবরাহ করতে পারি (যেমন যদি কংক্রিট প্রয়োগের ক্ষেত্রে ডিবি অ্যাক্সেসের প্রয়োজন হয় তবে আমরা আমাদের ইউনিট পরীক্ষাগুলি এর উপর নির্ভরশীল চাই না) এবং আমাদের নিয়ামকটিতে কোডটি সহজেই পরীক্ষা করতে পারি) ।
ডি: অন্যান্য ব্যবহার রয়েছে যেমন আপনার দুটি প্রকল্প 'এ' এবং 'বি' রয়েছে যা 'উত্তরাধিকারের কারণে' সুগঠিত নয়, এবং এ এর বিতে একটি উল্লেখ রয়েছে A
এরপরে আপনি বি তে কার্যকারিতা পাবেন যা ইতিমধ্যে এ-তে একটি পদ্ধতিতে কল করতে হবে যা আপনি একটি বিজ্ঞপ্তিযুক্ত রেফারেন্স পেয়েছেন আপনি কংক্রিট বাস্তবায়ন ব্যবহার করে এটি করতে পারবেন না।
আপনার বিতে ঘোষিত একটি ইন্টারফেস থাকতে পারে যা এ এর পরে শ্রেণি প্রয়োগ করে। আপনার বিতে পদ্ধতিটি এমন কোনও শ্রেণীর উদাহরণ দিয়ে যেতে পারে যা কোনও সমস্যা ছাড়াই ইন্টারফেস প্রয়োগ করে, যদিও কংক্রিট অবজেক্ট এ এর ধরণের হয় even