অবজেক্ট ওরিয়েন্টেড দৃষ্টান্তে আলগা সংযোগ এবং টাইট কাপলিংয়ের মধ্যে পার্থক্য কী?


272

অবজেক্ট ওরিয়েন্টেড দৃষ্টান্তে আলগা সংযোগ এবং টাইট কাপলিংয়ের মধ্যে কেউ সঠিক পার্থক্য বর্ণনা করতে পারে?


উত্তর:


338

আঁটসাঁটো মিলন তখন হয় যখন একদল শ্রেণীর একে অপরের উপর নির্ভরশীল।

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

আলগা সংযোগ একটি নকশার মাধ্যমে অর্জন করা হয় যা একক-দায়বদ্ধতা এবং উদ্বেগের বিচ্ছেদকে উত্সাহ দেয়।

একটি lyিলে .ালা-কাপল শ্রেণিটি অন্যান্য (কংক্রিট) শ্রেণীর থেকে স্বাধীনভাবে গ্রাস এবং পরীক্ষা করা যেতে পারে।

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

টাইট মিলনের উদাহরণ:

class CustomerRepository
{
    private readonly Database database;

    public CustomerRepository(Database database)
    {
        this.database = database;
    }

    public void Add(string CustomerName)
    {
        database.AddRow("Customer", CustomerName);
    }
}

class Database
{
    public void AddRow(string Table, string Value)
    {
    }
}

আলগা সংযোগের উদাহরণ:

class CustomerRepository
{
    private readonly IDatabase database;

    public CustomerRepository(IDatabase database)
    {
        this.database = database;
    }

    public void Add(string CustomerName)
    {
        database.AddRow("Customer", CustomerName);
    }
}

interface IDatabase
{
    void AddRow(string Table, string Value);
}

class Database implements IDatabase
{
    public void AddRow(string Table, string Value)
    {
    }
}

এখানে আরও একটি উদাহরণ ।


এতক্ষণ আপনি যা বলেছেন নিখুঁত তা বোঝায় .. আপনি কী দয়া করে ব্যাখ্যা করতে পারবেন কীভাবে সংযোজন পদ্ধতিটি পর্যবেক্ষক নিদর্শনটির সাথে সম্পর্কিত হতে পারে?
জিম

1
পর্যবেক্ষক প্যাটার্নটি এখানে বর্ণিত হয়েছে: en.wikiki.org/wiki/Observer_ Pattern । যেহেতু সাবজেক্ট ক্লাসটি 'পর্যবেক্ষক' থেকে উত্তরাধিকার সূত্রে প্রাপ্ত ক্লাসগুলির একটি তালিকা বজায় রাখতে পারে, প্রকৃতপক্ষে classes শ্রেণীর কংক্রিটের ধরণটি না জেনে, এটি আলগা মিলনের উদাহরণ। বিষয়টি তার পর্যবেক্ষকদের কোনও বা তাদের অভ্যন্তরীণ উদ্বেগের উপর নির্ভর করে না। পর্যবেক্ষকরা বিষয় বা এর উদ্বেগের উপর নির্ভর করে না।
জোনাথন

4
জাভা ইন্টারফেস হ'ল এমন সরঞ্জাম যা এটিকে সহায়তা করতে পারে। তবে তারা প্রয়োজন হয় না। ইন্টারফেসে প্রোগ্রামের ধারণার বাস্তবায়ন নয় মানে জনসাধারণের পদ্ধতি / বৈশিষ্ট্যগুলির জন্য প্রোগ্রাম (বা ভাষাগুলি সি এর মতো অ্যাক্সেস মডিফায়ারগুলিকে সমর্থন না করে যখন বাহ্যিক কলাররা এটি ব্যবহার করে) বোঝায়। ইন্টারফেসটি পরিবর্তন না করে এই বোঝানো চুক্তিকে সম্মান করার কথা honor অ্যাক্সেস মোডিফায়ারবিহীন ভাষাগুলিতে (সি এর মতো), এর অর্থ কেবল প্রকাশিত ইন্টারফেস / ফাংশন ব্যবহার করা এবং অভ্যন্তরীণভাবে ব্যবহার করা যা বোঝানো হয় সেগুলি হিট না করা, যেহেতু প্রকাশিত ক্রিয়াকলাপগুলি সমর্থন করার জন্য প্রয়োজনীয় পরিবর্তন হতে পারে।
বিল রোসমাস

3
@ জোনাথনকনওয়ে স্যার আপনাকে ধন্যবাদ জানায় তবে কোডের দুটি অংশই একই কাজ করে: তবে তাদের মধ্যে পার্থক্য কী? অর্থাৎ আলগাভাবে মিলিত হওয়ার কী কী সুবিধা রয়েছে?
বিকেএসপুরজন

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

177

কোনও কোড ছাড়াই ব্যাখ্যা

সংক্ষিপ্তসার উদাহরণ:

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

হাটটি শরীরে "আলগাভাবে মিলিত" হয়।  এর অর্থ আপনি ব্যক্তি / শরীরে কোনও পরিবর্তন না করে সহজেই টুপিটি সরিয়ে ফেলতে পারেন।  চিত্রের বৈশিষ্ট্য: https://pixabay.com/en/greeting-cylinder-chapeau-dignity-317250/

আঁটসাঁট মিলন (বিস্তারিত উদাহরণ)

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

  • মূল পয়েন্ট # 1 : অন্য কথায়, আপনি যদি ত্বক পরিবর্তন করতে চান তবে আপনার শরীরের নকশাকেও পরিবর্তন করতে হবে কারণ দুজনে একসাথে যোগদান করেছেন - তারা দৃly়ভাবে একত্রিত।

শ্বর কোনও ভাল অবজেক্ট ওরিয়েন্টেড প্রোগ্রামার ছিলেন না।

আলগা সংযোগ (বিস্তারিত উদাহরণ)

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

  • এটি মূল পয়েন্ট # 2। আপনি যদি নিজের শার্ট পরিবর্তন করেন, তবে আপনাকে নিজের শরীর পরিবর্তন করতে বাধ্য করা হবে না - যখন আপনি এটি করতে পারেন, তখন আপনার আলগা দম্পতি হবে। আপনি যখন এটি করতে পারবেন না, তারপরে আপনার আঁটসাঁট মিলন হবে।

সংক্ষেপে এটিই মূল ধারণা।

কেন এই সব গুরুত্বপূর্ণ?

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

কোডিং করার সময় মিলিত হওয়ার বাস্তব উদাহরণ

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

  • গাড়ির যন্ত্রাংশ উদাহরণ: কারো চায় তাদের গাড়ী মধ্যে কালো , আপনি যে কাজ করতে সমগ্র গাড়ী পুনঃডিজাইন থাকবে না। একটি গাড়ী এবং এর অতিরিক্ত যন্ত্রাংশ আলগাভাবে মিলিত স্থাপত্যের নিখুঁত উদাহরণ হবে। আপনি যদি আরও ভাল ইঞ্জিনটি দিয়ে ইঞ্জিনটি প্রতিস্থাপন করতে চান তবে আপনার খুব বেশি প্রয়াস ছাড়াই কেবল আপনার ইঞ্জিনটি সরিয়ে ফেলতে হবে এবং আরও ভাল একটিটির জন্য এটি অদলবদল করতে সক্ষম হওয়া উচিত। যদি আপনার গাড়িটি কেবল রোলস রইস 1234 ইঞ্জিন এবং অন্য কোনও ইঞ্জিনের সাথে কাজ করে - তবে আপনার গাড়ীটি সেই ইঞ্জিনের সাথে শক্তভাবে মিলিত হবে (রোলস রইস 1234)। এটা তোলে ভাল হবে যদি আপনি আপনার গাড়ী নকশা পরিবর্তন যাতে এটি সঙ্গে কাজ করবে কোনইঞ্জিন, যাতে এটি এর উপাদানগুলির সাথে কিছুটা আলগাভাবে মিলিত হয়। আরও ভাল হতে পারে যদি আপনার গাড়িটি কোনও ইঞ্জিনের প্রয়োজন ছাড়াই কাজ করতে পারে! কিছু পরিমাণ সংযোগ ঘটতে চলেছে, তবে আপনার এটিকে যতটা সম্ভব কমিয়ে আনতে কাজ করা উচিত। কেন? কারণ যখন প্রয়োজনীয়তা পরিবর্তন হয় তখনও আমাদের খুব দ্রুত ভাল মানের সফ্টওয়্যার সরবরাহ করতে সক্ষম হওয়া উচিত এবং আলগা সংযোগের মাধ্যমে আমরা সেই লক্ষ্যে সহায়তা করি in

সারসংক্ষেপ

সংক্ষেপে, আলগা সংযোগ কোড পরিবর্তন করা সহজ করে তোলে। উপরের উত্তরগুলিতে কিছু কোড সরবরাহ করা হয়েছে যা এই মুহুর্তে পড়ার জন্য উপযুক্ত।

পলিমারফিজম এবং সলিড নীতিগুলি

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

চিত্র অ্যাট্রিবিউশন


8
এটি নতুন প্রোগ্রামারদের জন্য এমন আন্ডাররেটেড ব্যাখ্যা। বড় বড় কিছু শব্দ অন্য কাউকে আমাদের বলার অপেক্ষা রাখে না, একবার আপনি যদি
বেসিকগুলি

6
কিছু জিনিস রয়েছে যা অবশ্যই দৃly়ভাবে একত্রে এবং কিছু কিছু আলগাভাবে এর পরিবেশের সাথে মিলিত হওয়া উচিত। টাইট মিলনের জন্য ত্বকের ব্যবহার সঠিক উপমা নয়। যদি ত্বকে শরীরের সাথে দৃ tight়ভাবে একত্রে মিলিত হিসাবে বিবেচনা করা হয় তবে অন্য প্রতিটি অঙ্গও তাই। দেহের (সামগ্রিকভাবে) সঠিকভাবে কাজ করার জন্য অংশগুলি (দৃly়ভাবে সংহত) থাকতে হবে (প্রকৃতির দ্বারা চিন্তা করা যেতে পারে - একটি উজ্জ্বল স্থপতি)। যদি সেই অংশগুলি প্রতিস্থাপনযোগ্য হিসাবে তৈরি করা হয় (টুপি পরিবর্তন করার মতো সহজ) তবে, 'মানব' দেহের একেবারে অর্থ এর সংজ্ঞাটি হারিয়ে ফেলে। মন্তব্য ১/২।
lupchiazoem

6
উদাহরণস্বরূপ, যদি ত্বককে প্রতিস্থাপনযোগ্য করে তোলা হয়, তবে মাথাটিও নতুন করে প্রতিস্থাপনযোগ্য হতে হবে। যদি এটি ঘটে থাকে, তবে লোকেরা একের থেকে অন্য সাক্ষাতে পরিচিত হতে পারে না। একটি ভাল আঁটসাঁট / আলগা মিলনের উপমাটি হ'ল - একটি গাড়ি এবং তার অংশগুলি, একটি কম্পিউটার এবং এর অংশগুলি ইত্যাদি ... যদি কোনও কম্পিউটারের মাউস / কীবোর্ড নিয়ে কোনও সমস্যা থাকে তবে পুরো কম্পিউটারকে অকেজো করে না দেওয়ার পরিবর্তে এটি অন্য অংশে প্রতিস্থাপন করা যেতে পারে car এবং ফেলে দিন মন্তব্য 2/2।
lupchiazoem

1
@ বি কে এসপুরজিয়ন অসাধারণ ব্যাখ্যা !! এবং ব্যাখ্যার জন্য উদাহরণ নেওয়ার উপায়টিও বেশ ভাল।
কিরণ জোশী

5
খুব সৃজনশীলভাবে ব্যাখ্যা করা হয়েছে। আমি দৃ answer়ভাবে এই উত্তর মিলিত হয়।
AliN11

72

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

আপনি এই পেপারটি মার্টিন ফাউলারের (পিডিএফ) সাহায্যকারী পেতে পারেন।


"ক্লাস এ-তে ক্লাস বি-তে কতবার পরিবর্তন হয়?" উপরের বাক্যটির জন্য আমার একটি সংক্ষিপ্ত উদাহরণ দরকার ??
কুমারসান পেরুমাল

15

টাইট কাপলিং সাধারণত খারাপ তবে বেশিরভাগ সময়, কারণ এটি নমনীয়তা এবং কোডের পুনঃব্যবহারযোগ্যতা হ্রাস করে, এটি পরিবর্তনকে আরও বেশি কঠিন করে তোলে, এটি টেস্টিবিলিটি ইত্যাদিতে বাধা দেয় etc.

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

সংক্ষেপে আমরা বলতে পারি, আলগা কাপলিং হ'ল একটি নকশা লক্ষ্য যা একটি উপাদানগুলির পরিবর্তনের জন্য অন্য যে কোনও উপাদানগুলির পরিবর্তনের প্রয়োজন হবে এমন ঝুঁকি হ্রাস করার লক্ষ্যে একটি সিস্টেমের উপাদানগুলির মধ্যে আন্তঃনির্ভরতা হ্রাস করতে চায়। লুজ কাপলিং একটি সিস্টেমের নমনীয়তা বৃদ্ধি, এটি আরও রক্ষণাবেক্ষণযোগ্য করে তোলার এবং পুরো কাঠামোটিকে আরও 'স্থিতিশীল' করার লক্ষ্যে অনেক বেশি জেনেরিক ধারণা।

কাপলিং বলতে বোঝায় যে প্রত্যক্ষ জ্ঞানের একটি ডিগ্রি যা একটি উপাদানের আরেকটির থাকে। আমরা একটি উদাহরণ বলতে পারি: A এবং B, কেবল বি তার আচরণ পরিবর্তন করে কেবল তখন A এর আচরণ পরিবর্তন করে। একটি আলগাভাবে জোড়াযুক্ত সিস্টেমটি সহজেই সংশোধনযোগ্য উপাদানগুলিতে বিভক্ত হয়ে যায়।


11

দুটি বস্তু যখন আলগাভাবে মিলিত হয় তখন তারা মিথস্ক্রিয়া করতে পারে তবে একে অপরের সম্পর্কে খুব কম জ্ঞান থাকতে পারে।

আলগাভাবে মিলিত ডিজাইনগুলি আমাদের পরিবর্তন করতে পারে এমন নমনীয় ওও সিস্টেমগুলি তৈরি করতে দেয়।

পর্যবেক্ষক ডিজাইনের ধরণটি ক্লাসগুলি আলগাভাবে মিলিত করার জন্য একটি ভাল উদাহরণ, আপনি উইকিপিডিয়ায় এটি দেখতে পারেন ।


6

আমার ব্লগ পোস্ট থেকে একটি নির্যাস :

কি টাইট জোড়া দেওয়া টিউব : -

উপরের সংজ্ঞা হিসাবে একটি টাইটলি কাপলড অবজেক্ট এমন একটি বস্তু যা অন্য বিষয়গুলির সম্পর্কে জানতে হবে এবং সাধারণত একে অপরের ইন্টারফেসের উপর অত্যন্ত নির্ভরশীল।

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

টাইট কাপলিং বোঝার জন্য শপিং কার্টের ডেমো কোডটি নেওয়া যাক:

namespace DNSLooseCoupling
{
    public class ShoppingCart
    {
        public float Price;
        public int Quantity;

        public float GetRowItemTotal()
        {
            return Price * Quantity;
        }
    }

    public class ShoppingCartContents
    {
        public ShoppingCart[] items;

        public float GetCartItemsTotal()
        {
            float cartTotal = 0;
            foreach (ShoppingCart item in items)
            {
                cartTotal += item.GetRowItemTotal();
            }
            return cartTotal;
        }
    }

    public class Order
    {
        private ShoppingCartContents cart;
        private float salesTax;

        public Order(ShoppingCartContents cart, float salesTax)
        {
            this.cart = cart;
            this.salesTax = salesTax;
        }

        public float OrderTotal()
        {
            return cart.GetCartItemsTotal() * (2.0f + salesTax);
        }
    }
}

উপরের উদাহরণ দিয়ে সমস্যা

টাইট কাপলিং কিছু অসুবিধা সৃষ্টি করে।

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


6

আলগা সংযোগের অর্থ হল যে দুটি উপাদানগুলির মধ্যে নির্ভরতার ডিগ্রি খুব কম।
উদাহরণ: জিএসএম সিম

আঁটসাঁট মিলনের মানে হল যে দুটি উপাদানগুলির মধ্যে নির্ভরতার ডিগ্রি খুব বেশি।
উদাহরণ: সিডিএমএ মোবাইল


5

আমি এটি যেভাবে বুঝতে পেরেছি তা হল, দৃly়ভাবে জোড়াযুক্ত আর্কিটেকচার আলগাভাবে মিলিত আর্কিটেকচারের তুলনায় পরিবর্তনের জন্য প্রচুর নমনীয়তা সরবরাহ করে না।

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


5

টাইট কাপলিং মানে একটি ক্লাস অন্য ক্লাসের উপর নির্ভরশীল।
আলগা সংযোজন মানে একটি ক্লাস ক্লাসের চেয়ে ইন্টারফেসের উপর নির্ভরশীল।

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

উদাহরণস্বরূপ, আমাদের একটি সিস্টেম রয়েছে যা দুটি বা ততোধিক উপায়ে যেমন JSON আউটপুট, সিএসভি আউটপুট ইত্যাদি প্রেরণ করতে পারে have

টাইট কাপলড

public interface OutputGenerator {
    public void generateOutput();
}

public class CSVOutputGenerator implements OutputGenerator {
    public void generateOutput() {
        System.out.println("CSV Output Generator");
    }
}

public class JSONOutputGenerator implements OutputGenerator {
    public void generateOutput() {
        System.out.println("JSON Output Generator");
    }
}

// In Other Code, we write Output Generator like...
public class Class1 {
    public void generateOutput() {
        // Here Output will be in CSV-Format, because of hard-coded code.
        // This method tightly coupled with CSVOutputGenerator class, if we want another Output, we must change this method.
        // Any method, that calls Class1's generateOutput will return CSVOutput, because Class1 is tight couple with CSVOutputGenerator.
        OutputGenerator outputGenerator = new CSVOutputGenerator();
        output.generateOutput();
    }
}

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

আলগা দম্পতি

public interface OutputGenerator {
    public void generateOutput();
}

public class CSVOutputGenerator implements OutputGenerator {
    public void generateOutput() {
        System.out.println("CSV Output Generator");
    }
}

public class JSONOutputGenerator implements OutputGenerator {
    public void generateOutput() {
        System.out.println("JSON Output Generator");
    }
}

// In Other Code, we write Output Generator like...
public class Class1 {
    public void generateOutput(OutputGenerator outputGenerator) {
        // if you want to write JSON, pass object of JSONOutputGenerator (Dependency will be passed externally to this method)
        // if you want to write CSV, pass object of CSVOutputGenerator (Dependency will be passed externally to this method)

        // Due to loose couple with class, we don't need to change code of Class1, because Class1 is loose coupled with CSVOutputGenerator or JSONOutputGenerator class
        // Any method, that calls Class1's generateOutput will desired output, because Class1 does not tight couple with CSVOutputGenerator or JSONOutputGenerator class
        OutputGenerator outputGenerator = outputGenerator;
        output.generateOutput();
    }
}

3

কিছু নির্দিষ্ট সরঞ্জাম রয়েছে যা তাদের লাইব্রেরির মাধ্যমে নির্ভরতা ইনজেকশন সরবরাহ করে, উদাহরণস্বরূপ। নেট এ আমাদের কাছে গ্রন্থাগার নিিনজেক্ট রয়েছে

আপনি যদি জাভাতে আরও যাচ্ছেন তবে বসন্ত এই ক্ষমতাগুলি সরবরাহ করে।

আপনার কোডটিতে ইন্টারফেসগুলি প্রবর্তন করে লসলি কাপল অবজেক্টগুলি তৈরি করা যেতে পারে, এই উত্সগুলি যা করে তা ঠিক।

আপনার কোডে লিখুন আপনি লিখছেন

Myclass m = new Myclass();

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


3

সাদৃশ্যগুলি ব্যবহার করে এখানে অনেক সুন্দর উত্তর পাওয়া গেছে তবে কর্মস্থলে এক বন্ধু আমাকে একটি উদাহরণ দিয়েছেন যা আমি এখানে উল্লিখিত সমস্তগুলির চেয়ে বেশি পছন্দ করেছি ... চোখ এবং চশমা!

টাইট কাপলিং

আঁটসাঁট মিলন চোখ হবে। আমি যদি আমার দৃষ্টি সংশোধন করতে চাই তবে আমি চক্ষু প্রতিস্থাপনের জন্য খুব ব্যয়বহুল এবং এটিকে মোটামুটি ঝুঁকি রয়েছে। তবে কী যদি ডিজাইনার (মানব জাতি হচ্ছেন) এর থেকে আরও ভাল উপায় খুঁজে পান। এমন বৈশিষ্ট্য যুক্ত করুন যা শরীরে আলগাভাবে মিলিত হয় যাতে এটি সহজেই পরিবর্তন করা যায়! (হ্যাঁ .. চশমা)

আলগা সংযোজন

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

সারসংক্ষেপ

সুতরাং পরের বার কেউ আপনাকে জিজ্ঞাসা করবে "আমার কোডটি দৃly়ভাবে সংযুক্ত করা হয়েছে তবে কে কে যত্ন করে?" উত্তরটি হ'ল পরিবর্তনের প্রচেষ্টা, বজায় রাখার প্রচেষ্টা এবং পরিবর্তনের ঝুঁকি সম্পর্কে।

সুতরাং এটি সি # তে কীভাবে হয়? ইন্টারফেস এবং নির্ভরতা ইনজেকশন!

সম্পাদনা

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


2

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

আলগা সংযোজন = আইওসি দেখুন এই সহজ ব্যাখ্যা জন্য।


3
আমি মনে করি না যে শিথিল দম্পতি নিয়ন্ত্রণের বিপরীত হিসাবে একই। আপনার ডিজাইনের সংমিশ্রণ হ্রাস করার জন্য নিয়ন্ত্রণের বিপরীততা একটি খুব কার্যকর কৌশল, তবে আরও অনেক কৌশল রয়েছে।
ডন কির্কবি

2

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


2

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


1

যদি কোনও বস্তুর সৃষ্টি / অস্তিত্ব যদি অন্য কোনও বস্তুর উপর নির্ভর করে যা উপযুক্ত করা যায় না, তবে তার আঁটসাঁট মিলন। এবং, যদি নির্ভরতাটি তৈরি করা যায় তবে এর আলগা মিলন। জাভাতে একটি উদাহরণ বিবেচনা করুন:

class Car {

    private Engine engine = new Engine( "X_COMPANY" ); // this car is being created with "X_COMPANY" engine
    // Other parts

    public Car() { 
        // implemenation 
    }

}

এর ক্লায়েন্ট Carক্লাসের কেবলমাত্র "X_COMPANY" ইঞ্জিন দিয়ে একটি তৈরি করতে পারে।

এই সংযুক্তিকে পরিবর্তন করার ক্ষমতা সহ ভাঙ্গার বিষয়টি বিবেচনা করুন:

class Car {

    private Engine engine;
    // Other members

    public Car( Engine engine ) { // this car can be created with any Engine type
        this.engine = engine;
    }

}

এখন, একটি Car"X_COMPANY" এর ইঞ্জিনের উপর নির্ভর করে না কারণ এটি প্রকারের সাহায্যে তৈরি করা যেতে পারে।

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

গৃহীত উত্তরে বিল রোসমাসের মন্তব্যটির একটি ভাল ব্যাখ্যা রয়েছে।


0

আঁটসাঁট মিলন মানে ক্লাস এবং অবজেক্টগুলি একে অপরের উপর নির্ভরশীল। সাধারণভাবে, আঁটসাঁটো মিলন সাধারণত ভাল হয় না কারণ এটি কোডের নমনীয়তা এবং পুনঃব্যবহারযোগ্যতা হ্রাস করে যখন লুজ কাপলিং মানে কোনও শ্রেণীর নির্ভরতা হ্রাস করা যা সরাসরি বিভিন্ন শ্রেণীর ব্যবহার করে।

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

    class A {
       public int a = 0;
       public int getA() {
          System.out.println("getA() method");
          return a;
       }
       public void setA(int aa) {
          if(!(aa > 10))
             a = aa;
       }
    }
    public class B {
       public static void main(String[] args) {
          A aObject = new A();
          aObject.a = 100; // Not suppose to happen as defined by class A, this causes tight coupling.
          System.out.println("aObject.a value is: " + aObject.a);
       }
    }

In the above example, the code that is defined by this kind of implementation uses tight coupling and is very bad since class B knows about the detail of class A, if class A changes the variable 'a' to private then class B breaks, also class A's implementation states that variable 'a' should not be more than 10 but as we can see there is no way to enforce such a rule as we can go directly to the variable and change its state to whatever value we decide.

    Output
    aObject.a value is: 100

Loose Coupling
Loose coupling is a design goal to reduce the inter-dependencies between components of a system with the goal of reducing the risk that changes in one component will require changes in any other component.
Loose coupling is a much more generic concept intended to increase the flexibility of the system, make it more maintainable and makes the entire framework more stable.
Example:

class A {
   private int a = 0;
   public int getA() {
      System.out.println("getA() method");
      return a;
   }
   public void setA(int aa) {
      if(!(aa > 10))
         a = aa;
   }
}
public class B {
   public static void main(String[] args) {
      A aObject = new A();
      aObject.setA(100); // No way to set 'a' to such value as this method call will
                         // fail due to its enforced rule.
      System.out.println("aObject value is: " + aObject.getA());
   }
}

উপরের উদাহরণে, এই ধরণের প্রয়োগের মাধ্যমে সংজ্ঞায়িত কোডটি আলগা সংযুক্তিকে ব্যবহার করে এবং সুপারিশ করা হয় যেহেতু বি বি প্রয়োগ করা হয় যেখানে তার রাজ্য পেতে ক্লাস বি ক্লাসের মধ্য দিয়ে যেতে হয়। যদি শ্রেণি A অভ্যন্তরীণভাবে পরিবর্তিত হয়, তবে ক্লাস বিটি ভাঙবে না কারণ এটি যোগাযোগের উপায় হিসাবে কেবল ক্লাস এ ব্যবহার করে।

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