উত্তর:
আঁটসাঁটো মিলন তখন হয় যখন একদল শ্রেণীর একে অপরের উপর নির্ভরশীল।
এই দৃশ্যটি দেখা দেয় যখন কোনও শ্রেণি অনেকগুলি দায়বদ্ধতা গ্রহণ করে, বা যখন একটি উদ্বেগ নিজস্ব শ্রেণি না করে অনেকগুলি শ্রেণিতে ছড়িয়ে পড়ে।
আলগা সংযোগ একটি নকশার মাধ্যমে অর্জন করা হয় যা একক-দায়বদ্ধতা এবং উদ্বেগের বিচ্ছেদকে উত্সাহ দেয়।
একটি 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)
{
}
}
এখানে আরও একটি উদাহরণ ।
হাটটি শরীরে "আলগাভাবে মিলিত" হয়। এর অর্থ আপনি ব্যক্তি / শরীরে কোনও পরিবর্তন না করে সহজেই টুপিটি বন্ধ করতে পারেন। আপনি যখন এটি করতে পারেন তখন আপনার "আলগা দম্পতি" থাকে। বিস্তারিত জানার জন্য নীচে দেখুন।
আপনার ত্বকের কথা ভাবুন। এটি আপনার দেহে আটকে আছে। এটি একটি দস্তানা মত দেখাচ্ছে। তবে আপনি যদি নিজের ত্বকের রঙ সাদা থেকে সবুজতে পরিবর্তন করতে চান? আপনি কী ভাবতে পারেন যে আপনার ত্বকটি ছিটিয়ে দেওয়া, রং করা এবং তারপরে এটি আবার আটকানো কত কষ্টকর হবে? আপনার ত্বক পরিবর্তন করা শক্ত কারণ এটি আপনার দেহের সাথে শক্তভাবে মিলিত led আপনি কেবল সহজে পরিবর্তন করতে পারবেন না। এটি সম্ভব করার জন্য আপনাকে মূলত একজন মানুষকে নতুনভাবে ডিজাইন করতে হবে।
শ্বর কোনও ভাল অবজেক্ট ওরিয়েন্টেড প্রোগ্রামার ছিলেন না।
এখন সকালে পোশাক পরার কথা ভাবুন। তুমি নীল পছন্দ করো না? কোনও সমস্যা নেই: পরিবর্তে আপনি একটি লাল শার্ট লাগাতে পারেন। আপনি এটি সহজে এবং অনায়াসেই করতে পারেন কারণ শার্টটি আপনার ত্বকের মতোই সত্যিই আপনার শরীরে সংযুক্ত নেই। শার্টটি কী শরীরে চলছে তা জানে না বা যত্ন করে না । অন্য কথায়, আপনি সত্যিই নিজের দেহটি পরিবর্তন না করেই আপনার পোশাক পরিবর্তন করতে পারেন।
সংক্ষেপে এটিই মূল ধারণা।
এটি গুরুত্বপূর্ণ কারণ সফ্টওয়্যারটি সর্বদা পরিবর্তিত হয়। সাধারণত ভাষায় আপনি নিজের কোড পরিবর্তন না করে সহজেই আপনার কোডটি সংশোধন করতে সক্ষম হতে চান। আমি জানি যে অক্সিমোরনের মতো শোনাচ্ছে তবে দয়া করে আমার সাথে সহ্য করুন।
সিএসভি / জেএসএন / ডিবি উদাহরণস্বরূপ: কেউ যদি জেএসএন ইত্যাদির পরিবর্তে কোনও সিএসভি ফাইলে তাদের আউটপুট চায়, বা আপনি যদি মাইএসকিউএল থেকে পোস্টগ্রাইএসকিউএল পরিবর্তন করতে চান তবে আপনার কোডটিতে নতুন করে লিখতে না পেরে আপনি সেই পরিবর্তনগুলি খুব সহজেই তৈরি করতে সক্ষম হবেন পুরো ক্লাস ইত্যাদি। অন্য কথায়, আপনি কোনও নির্দিষ্ট ডাটাবেস বাস্তবায়ন (উদাহরণস্বরূপ মাইকিউএল) বা কোনও নির্দিষ্ট আউটপুট (যেমন সিএসভি ফাইল) এর সাথে আপনার অ্যাপ্লিকেশনটি দৃly়ভাবে জুটিতে চান না। কারণ, সফ্টওয়্যার যেমন অনিবার্য, পরিবর্তন আসবে। যখন তারা আসে, আপনার কোডের অংশগুলি আলগাভাবে মিশ্রিত করা খুব সহজ।
গাড়ির যন্ত্রাংশ উদাহরণ: কারো চায় তাদের গাড়ী মধ্যে কালো , আপনি যে কাজ করতে সমগ্র গাড়ী পুনঃডিজাইন থাকবে না। একটি গাড়ী এবং এর অতিরিক্ত যন্ত্রাংশ আলগাভাবে মিলিত স্থাপত্যের নিখুঁত উদাহরণ হবে। আপনি যদি আরও ভাল ইঞ্জিনটি দিয়ে ইঞ্জিনটি প্রতিস্থাপন করতে চান তবে আপনার খুব বেশি প্রয়াস ছাড়াই কেবল আপনার ইঞ্জিনটি সরিয়ে ফেলতে হবে এবং আরও ভাল একটিটির জন্য এটি অদলবদল করতে সক্ষম হওয়া উচিত। যদি আপনার গাড়িটি কেবল রোলস রইস 1234 ইঞ্জিন এবং অন্য কোনও ইঞ্জিনের সাথে কাজ করে - তবে আপনার গাড়ীটি সেই ইঞ্জিনের সাথে শক্তভাবে মিলিত হবে (রোলস রইস 1234)। এটা তোলে ভাল হবে যদি আপনি আপনার গাড়ী নকশা পরিবর্তন যাতে এটি সঙ্গে কাজ করবে কোনইঞ্জিন, যাতে এটি এর উপাদানগুলির সাথে কিছুটা আলগাভাবে মিলিত হয়। আরও ভাল হতে পারে যদি আপনার গাড়িটি কোনও ইঞ্জিনের প্রয়োজন ছাড়াই কাজ করতে পারে! কিছু পরিমাণ সংযোগ ঘটতে চলেছে, তবে আপনার এটিকে যতটা সম্ভব কমিয়ে আনতে কাজ করা উচিত। কেন? কারণ যখন প্রয়োজনীয়তা পরিবর্তন হয় তখনও আমাদের খুব দ্রুত ভাল মানের সফ্টওয়্যার সরবরাহ করতে সক্ষম হওয়া উচিত এবং আলগা সংযোগের মাধ্যমে আমরা সেই লক্ষ্যে সহায়তা করি in
সংক্ষেপে, আলগা সংযোগ কোড পরিবর্তন করা সহজ করে তোলে। উপরের উত্তরগুলিতে কিছু কোড সরবরাহ করা হয়েছে যা এই মুহুর্তে পড়ার জন্য উপযুক্ত।
পুনঃ @ টিমো হুভিনিন মন্তব্য করেছেন - looseিলে coupালা সংযোগের ধারণাটি পলিমারফিজমের ধারণার সাথে একসাথে চলে। যদি আপনি কোনও শার্ট / গাড়ির যন্ত্রাংশগুলির প্রাথমিক সাদৃশ্যটি উপলব্ধি করেন তবে আপনি বহুবর্ষকে বোঝাতে প্রস্তুত থাকবেন। সবচেয়ে ভাল উপায়, এই মুহুর্তে এই থ্রেডের অন্যান্য উত্তরে আমার অনুমিত সহকর্মীদের দেওয়া কোড নমুনাগুলি পড়া। যদি আমি আর বলি আপনি খুব বেশি তথ্যের সাথে ওভারলোড হয়ে যেতে পারেন।
অবজেক্ট ওরিয়েন্টেড ডিজাইনে, মিলনের পরিমাণ বোঝায় যে এক শ্রেণির নকশা অন্য শ্রেণীর নকশার উপর নির্ভর করে। অন্য কথায়, ক্লাস এ-তে প্রায়শই ক্লাস বি-তে পরিবর্তিত হয়? আঁটসাঁট মিলন মানে দুটি ক্লাস প্রায়শই একসাথে পরিবর্তিত হয়, আলগা মিলনের অর্থ তারা বেশিরভাগ স্বতন্ত্র। সাধারণভাবে, আলগা সংযোগের পরামর্শ দেওয়া হয় কারণ এটি পরীক্ষা করা এবং বজায় রাখা আরও সহজ।
আপনি এই পেপারটি মার্টিন ফাউলারের (পিডিএফ) সাহায্যকারী পেতে পারেন।
টাইট কাপলিং সাধারণত খারাপ তবে বেশিরভাগ সময়, কারণ এটি নমনীয়তা এবং কোডের পুনঃব্যবহারযোগ্যতা হ্রাস করে, এটি পরিবর্তনকে আরও বেশি কঠিন করে তোলে, এটি টেস্টিবিলিটি ইত্যাদিতে বাধা দেয় etc.
টাইটলি কাপল্ড অবজেক্ট হ'ল একটি অবজেক্ট একে অপরের সম্পর্কে বেশ কিছুটা জানতে হবে এবং সাধারণত একে অপরের ইন্টারফেসের উপর অত্যন্ত নির্ভরশীল। শক্তভাবে কাপল অ্যাপ্লিকেশনটিতে একটি বস্তু পরিবর্তন করার জন্য প্রায়শই অন্যান্য বিভিন্ন বস্তুর পরিবর্তনের প্রয়োজন হয়, ছোট প্রয়োগে আমরা সহজেই পরিবর্তনগুলি সনাক্ত করতে পারি এবং কোনও কিছু মিস করার সম্ভাবনা কম থাকে। তবে বড় অ্যাপ্লিকেশনগুলিতে এই আন্তঃনির্ভরশীলতাগুলি প্রতিটি প্রোগ্রামার দ্বারা সর্বদা জানা যায় না বা পরিবর্তনগুলি মিস করার সুযোগ থাকে। কিন্তু আলগাভাবে জোড়াযুক্ত বস্তুর প্রতিটি সেট অন্যের উপর নির্ভর করে না।
সংক্ষেপে আমরা বলতে পারি, আলগা কাপলিং হ'ল একটি নকশা লক্ষ্য যা একটি উপাদানগুলির পরিবর্তনের জন্য অন্য যে কোনও উপাদানগুলির পরিবর্তনের প্রয়োজন হবে এমন ঝুঁকি হ্রাস করার লক্ষ্যে একটি সিস্টেমের উপাদানগুলির মধ্যে আন্তঃনির্ভরতা হ্রাস করতে চায়। লুজ কাপলিং একটি সিস্টেমের নমনীয়তা বৃদ্ধি, এটি আরও রক্ষণাবেক্ষণযোগ্য করে তোলার এবং পুরো কাঠামোটিকে আরও 'স্থিতিশীল' করার লক্ষ্যে অনেক বেশি জেনেরিক ধারণা।
কাপলিং বলতে বোঝায় যে প্রত্যক্ষ জ্ঞানের একটি ডিগ্রি যা একটি উপাদানের আরেকটির থাকে। আমরা একটি উদাহরণ বলতে পারি: A এবং B, কেবল বি তার আচরণ পরিবর্তন করে কেবল তখন A এর আচরণ পরিবর্তন করে। একটি আলগাভাবে জোড়াযুক্ত সিস্টেমটি সহজেই সংশোধনযোগ্য উপাদানগুলিতে বিভক্ত হয়ে যায়।
দুটি বস্তু যখন আলগাভাবে মিলিত হয় তখন তারা মিথস্ক্রিয়া করতে পারে তবে একে অপরের সম্পর্কে খুব কম জ্ঞান থাকতে পারে।
আলগাভাবে মিলিত ডিজাইনগুলি আমাদের পরিবর্তন করতে পারে এমন নমনীয় ওও সিস্টেমগুলি তৈরি করতে দেয়।
পর্যবেক্ষক ডিজাইনের ধরণটি ক্লাসগুলি আলগাভাবে মিলিত করার জন্য একটি ভাল উদাহরণ, আপনি উইকিপিডিয়ায় এটি দেখতে পারেন ।
আমার ব্লগ পোস্ট থেকে একটি নির্যাস :
কি টাইট জোড়া দেওয়া টিউব : -
উপরের সংজ্ঞা হিসাবে একটি টাইটলি কাপলড অবজেক্ট এমন একটি বস্তু যা অন্য বিষয়গুলির সম্পর্কে জানতে হবে এবং সাধারণত একে অপরের ইন্টারফেসের উপর অত্যন্ত নির্ভরশীল।
যখন আমরা একটি বস্তুকে শক্তভাবে সংযুক্ত অ্যাপ্লিকেশনটিতে পরিবর্তন করি তখন প্রায়শই এটিতে অন্যান্য বেশ কয়েকটি অবজেক্টের পরিবর্তনের প্রয়োজন হয়। ছোট অ্যাপ্লিকেশনটিতে কোনও সমস্যা নেই আমরা সহজেই পরিবর্তনটি সনাক্ত করতে পারি। তবে বড় অ্যাপ্লিকেশনগুলির ক্ষেত্রে এই আন্তঃনির্ভরশীলতাগুলি প্রতিটি ভোক্তা বা অন্যান্য বিকাশকারীদের দ্বারা সর্বদা জানা যায় না বা ভবিষ্যতে পরিবর্তনের অনেক সম্ভাবনা থাকে।
টাইট কাপলিং বোঝার জন্য শপিং কার্টের ডেমো কোডটি নেওয়া যাক:
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()
পদ্ধতিগুলি আমাদের গাড়ীর বর্তমান আইটেমগুলির জন্য সম্পূর্ণ পরিমাণ প্রদান করে। আমরা যদি এই কার্ট সিস্টেমে ছাড়ের বৈশিষ্ট্যগুলি যুক্ত করতে চাই। উপরের কোডটি করা খুব কঠিন কারণ আমাদের প্রতি ক্লাসে পরিবর্তন আনতে হবে কারণ এটি খুব শক্তভাবে মিলিত হয়েছে।
আলগা সংযোগের অর্থ হল যে দুটি উপাদানগুলির মধ্যে নির্ভরতার ডিগ্রি খুব কম।
উদাহরণ: জিএসএম সিম
আঁটসাঁট মিলনের মানে হল যে দুটি উপাদানগুলির মধ্যে নির্ভরতার ডিগ্রি খুব বেশি।
উদাহরণ: সিডিএমএ মোবাইল
আমি এটি যেভাবে বুঝতে পেরেছি তা হল, দৃly়ভাবে জোড়াযুক্ত আর্কিটেকচার আলগাভাবে মিলিত আর্কিটেকচারের তুলনায় পরিবর্তনের জন্য প্রচুর নমনীয়তা সরবরাহ করে না।
কিন্তু আলগাভাবে সংযুক্ত আর্কিটেকচারের ক্ষেত্রে, বার্তা ফর্ম্যাটগুলি বা অপারেটিং প্ল্যাটফর্মগুলি বা ব্যবসায়িক যুক্তি পুনর্নির্মাণের অন্য প্রান্তকে প্রভাবিত করে না। যদি সিস্টেমটি পুনর্নির্মাণের জন্য নামানো হয় তবে অবশ্যই অন্য প্রান্তটি কিছুক্ষণের জন্য পরিষেবাটি অ্যাক্সেস করতে সক্ষম হবে না তবে এটির পরিবর্তে অপরিবর্তিত প্রান্তটি পুনর্নির্মাণের আগে যেমন ছিল বার্তা বিনিময় পুনরায় শুরু করতে পারে।
টাইট কাপলিং মানে একটি ক্লাস অন্য ক্লাসের উপর নির্ভরশীল।
আলগা সংযোজন মানে একটি ক্লাস ক্লাসের চেয়ে ইন্টারফেসের উপর নির্ভরশীল।
ইন আঁট কাপলিং , সেখানে হার্ড কোডেড নির্ভরতা পদ্ধতি ঘোষণা হয়।
ইন আলগা কাপলিং , আমরা পরিবর্তে হার্ড কোডেড এর রানটাইম এ বাহ্যিকভাবে নির্ভরতা পাস করতে হবে। (আলগা দম্পতি সিস্টেমগুলি শ্রেণীর সাথে নির্ভরতা হ্রাস করার জন্য ইন্টারফেস ব্যবহার করে))
উদাহরণস্বরূপ, আমাদের একটি সিস্টেম রয়েছে যা দুটি বা ততোধিক উপায়ে যেমন 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();
}
}
কিছু নির্দিষ্ট সরঞ্জাম রয়েছে যা তাদের লাইব্রেরির মাধ্যমে নির্ভরতা ইনজেকশন সরবরাহ করে, উদাহরণস্বরূপ। নেট এ আমাদের কাছে গ্রন্থাগার নিিনজেক্ট রয়েছে ।
আপনি যদি জাভাতে আরও যাচ্ছেন তবে বসন্ত এই ক্ষমতাগুলি সরবরাহ করে।
আপনার কোডটিতে ইন্টারফেসগুলি প্রবর্তন করে লসলি কাপল অবজেক্টগুলি তৈরি করা যেতে পারে, এই উত্সগুলি যা করে তা ঠিক।
আপনার কোডে লিখুন আপনি লিখছেন
Myclass m = new Myclass();
এখন আপনার পদ্ধতিতে এই বিবৃতিতে বলা হয়েছে যে আপনি এর উপর নির্ভরশীল myclass
একটি কঠোর দম্পতি বলা হয়। এখন আপনি কিছু কন্সট্রাক্টর ইনজেকশন, বা সম্পত্তি ইনজেকশন এবং তাত্ক্ষণিক অবজেক্ট সরবরাহ করুন তবে এটি দুগ্ধ হয়ে মিলবে।
সাদৃশ্যগুলি ব্যবহার করে এখানে অনেক সুন্দর উত্তর পাওয়া গেছে তবে কর্মস্থলে এক বন্ধু আমাকে একটি উদাহরণ দিয়েছেন যা আমি এখানে উল্লিখিত সমস্তগুলির চেয়ে বেশি পছন্দ করেছি ... চোখ এবং চশমা!
টাইট কাপলিং
আঁটসাঁট মিলন চোখ হবে। আমি যদি আমার দৃষ্টি সংশোধন করতে চাই তবে আমি চক্ষু প্রতিস্থাপনের জন্য খুব ব্যয়বহুল এবং এটিকে মোটামুটি ঝুঁকি রয়েছে। তবে কী যদি ডিজাইনার (মানব জাতি হচ্ছেন) এর থেকে আরও ভাল উপায় খুঁজে পান। এমন বৈশিষ্ট্য যুক্ত করুন যা শরীরে আলগাভাবে মিলিত হয় যাতে এটি সহজেই পরিবর্তন করা যায়! (হ্যাঁ .. চশমা)
আলগা সংযোজন
আমি আমার অন্তর্নিহিত দৃষ্টি ভঙ্গ না করে সহজেই আমার চশমাগুলি প্রতিস্থাপন করতে পারি। আমি চশমাটি খুলে ফেলতে পারি এবং আমার দৃষ্টিটি কেমন হবে এর আগে (এর চেয়ে ভাল বা খারাপ নয়)। বিভিন্ন জোড়া চশমা ব্যবহার করা কীভাবে আমরা সামান্য ঝুঁকি এবং সহজ রক্ষণাবেক্ষণের সাথে আমাদের চোখের মাধ্যমে বিশ্বকে দেখি changes
সারসংক্ষেপ
সুতরাং পরের বার কেউ আপনাকে জিজ্ঞাসা করবে "আমার কোডটি দৃly়ভাবে সংযুক্ত করা হয়েছে তবে কে কে যত্ন করে?" উত্তরটি হ'ল পরিবর্তনের প্রচেষ্টা, বজায় রাখার প্রচেষ্টা এবং পরিবর্তনের ঝুঁকি সম্পর্কে।
সুতরাং এটি সি # তে কীভাবে হয়? ইন্টারফেস এবং নির্ভরতা ইনজেকশন!
সম্পাদনা
এটি ডেকোরেটর প্যাটার্নেরও একটি দুর্দান্ত উদাহরণ, যেখানে চোখের ক্লাস হ'ল আমরা ইন্টারফেসের প্রয়োজনীয়তাগুলি পূরণ করে কিন্তু বিভিন্ন কার্যকারিতা প্রদান করে (যেমন সানগ্লাস, চশমা পড়া, জহরতদের জন্য চশমা ইত্যাদি)
আলগা কাপলিং হ'ল পুরানো স্টাইলের হার্ডকোডযুক্ত নির্ভরতা এবং সম্পর্কিত পরিবর্তনগুলি এবং কোডের পুনঃব্যবহারের সময় ঘন ঘন পুনঃসংশোধনের মতো সম্পর্কিত বিষয়গুলির উত্তর। এটি উপাদানগুলিতে কর্মী যুক্তি বাস্তবায়নের উপর চাপ দেয় এবং সেখানে সমাধান নির্দিষ্ট সুনির্দিষ্ট তারের কোড এড়ানোর উপর জোর দেয়।
লজ কাপলিং হ'ল আপনার শ্রেণীর প্রয়োজনীয়তার উপর নির্ভরশীলতার পরোক্ষভাবে প্রয়োজনীয়তা প্রদানের প্রক্রিয়া হ'ল নির্ভরতা সম্পর্কিত সমস্ত তথ্য সরবরাহ না করে (অর্থাত্ ইন্টারফেসের বাইরে) যদি আপনি সরাসরি নির্ভরশীলতার সাথে কোডিংয়ের পক্ষে সঠিক উপায় না হন তবে সংযুক্তি দেয়।
এটি অন্যগুলির সাথে শ্রেণীর নির্ভরতা হারের বিষয়ে যা আলগাভাবে দম্পতিতে এত কম এবং শক্তভাবে মিলিতভাবে এত বেশি। পরিষেবা ওরিয়েন্টেশন আর্কিটেকচারে পরিষ্কার হওয়ার জন্য , একচেটিয়া প্রতিরোধের বিরুদ্ধে পরিষেবাদিগুলি একে অপরের সাথে একত্রে মিলিত হয় যা ক্লাসগুলির একে অপরের উপর নির্ভরশীলতা উদ্দেশ্য ভিত্তিতে হয়
যদি কোনও বস্তুর সৃষ্টি / অস্তিত্ব যদি অন্য কোনও বস্তুর উপর নির্ভর করে যা উপযুক্ত করা যায় না, তবে তার আঁটসাঁট মিলন। এবং, যদি নির্ভরতাটি তৈরি করা যায় তবে এর আলগা মিলন। জাভাতে একটি উদাহরণ বিবেচনা করুন:
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" এর ইঞ্জিনের উপর নির্ভর করে না কারণ এটি প্রকারের সাহায্যে তৈরি করা যেতে পারে।
একটি জাভা নির্দিষ্ট নোট: জাভা ইন্টারফেসগুলি কেবল ডি-কাপলিংয়ের জন্য ব্যবহার করা কোনও সঠিক অনুশীলন পদ্ধতি নয়। জাভাতে, একটি ইন্টারফেসের একটি উদ্দেশ্য রয়েছে - এমন একটি চুক্তি হিসাবে কাজ করা যা অন্তঃসত্ত্বাভাবে ডি-কাপলিং আচরণ / সুবিধা সরবরাহ করে।
গৃহীত উত্তরে বিল রোসমাসের মন্তব্যটির একটি ভাল ব্যাখ্যা রয়েছে।
আঁটসাঁট মিলন মানে ক্লাস এবং অবজেক্টগুলি একে অপরের উপর নির্ভরশীল। সাধারণভাবে, আঁটসাঁটো মিলন সাধারণত ভাল হয় না কারণ এটি কোডের নমনীয়তা এবং পুনঃব্যবহারযোগ্যতা হ্রাস করে যখন লুজ কাপলিং মানে কোনও শ্রেণীর নির্ভরতা হ্রাস করা যা সরাসরি বিভিন্ন শ্রেণীর ব্যবহার করে।
আঁটসাঁট মিলন শক্তভাবে সংযুক্ত বস্তু এমন একটি বস্তু যা অন্য বিষয়গুলির সম্পর্কে জানতে হবে এবং সাধারণত একে অপরের ইন্টারফেসের উপর অত্যন্ত নির্ভরশীল। শক্তভাবে কাপল অ্যাপ্লিকেশনটিতে একটি অবজেক্ট পরিবর্তন করার জন্য প্রায়শই অন্যান্য বেশ কয়েকটি অবজেক্টের পরিবর্তন প্রয়োজন। ছোট অ্যাপ্লিকেশনগুলিতে, আমরা সহজেই পরিবর্তনগুলি সনাক্ত করতে পারি এবং কিছু মিস করার সুযোগ কম থাকে। তবে বড় অ্যাপ্লিকেশনগুলিতে, এই আন্তঃনির্ভরশীলতাগুলি প্রতিটি প্রোগ্রামার দ্বারা সর্বদা জানা যায় না এবং উপেক্ষা করার পরিবর্তনের সম্ভাবনা থাকে। উদাহরণ:
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