কী ডিকপলিং হয় এবং এটি কোন উন্নয়ন ক্ষেত্রগুলিতে প্রয়োগ করতে পারে? [বন্ধ]


21

আমি সম্প্রতি একটি প্রশ্নে একটি বিষয় হিসাবে ডিকপলিং লক্ষ্য করেছি এবং এটি কী এবং এটি কোথায় প্রয়োগ করতে পারে তা জানতে চাই।

"এটি কোথায় প্রয়োগ করতে পারে" এর দ্বারা, আমার অর্থ:

সি এবং জাভা এর মতো সংকলিত ভাষা জড়িত সেখানে এটি কি কেবল প্রাসঙ্গিক?

ওয়েব ডেভেলপার হিসাবে এটি সম্পর্কে / অধ্যয়ন করা আমার জানা উচিত?


আপনি যদি একটু গবেষণা করেন এবং সংজ্ঞাটির কোনও অস্পষ্ট অংশের উপর ভিত্তি করে একটি প্রশ্ন জিজ্ঞাসা করেন তবে এটি সহায়তা করবে।
জেফো

2
@ জেফো - আমি মনে করি বিশ্ব নির্দিষ্ট ধারণাগুলি থেকে যতটা পূর্ণ ধারণা ধারণাগুলি থেকে লাভ করে। "আকাশ কেনো নীল?" সুনির্দিষ্ট বিবরণগুলিতে চূড়ান্ত বিশদে না গিয়ে উত্তরগুলি ধারণাটি নিজেই কভার করতে দেয়। সে কারণেই আমি এগিয়ে গিয়ে আমার প্রশ্নটি গবেষণা ছাড়াই জিজ্ঞাসা করেছি।

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

আমি মনে করি যে এখানে উত্তরগুলি ধারণাটি বর্ণনা করার একটি নিখুঁত কাজ করে। এটি "প্রোগ্রামিংয়ের সাথে এই শব্দের সংজ্ঞা কী" জিজ্ঞাসার মতো - তবে কীভাবে এটি খুব বিস্তৃত? @ গ্লেনএইচ 7

1
@ jt0dd আমাকে একমত হতে হবে আপনি কোনও বইয়ের সাহায্যে কিছু ব্যাখ্যা করতে পারার অর্থ এই নয় যে আরও উত্তম উত্তরের কোনও মূল্য নেই। প্রোগ্রামিং সাহিত্যের সাথে, লোকেরা প্রায়শই আপনাকে একটি উচ্চতর স্তরের পর্যালোচনা দেওয়ার আগে বিশদ দিয়ে স্যাম্প করে। "ওওপ কি?" উপায় খুব বিস্তৃত হবে। তবে এটি একটি যুক্তিসঙ্গতভাবে নির্দিষ্ট বিষয় আইএমও।
এরিক রেপেন

উত্তর:


57

'কাপলিং' এমন একটি শব্দ যা একটি সফ্টওয়্যার সিস্টেমে (সাধারণত ক্লাস) দুটি সত্তার মধ্যে সম্পর্কের বর্ণনা দেয়।

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

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

সুতরাং: অনুশীলনে দৃ strong় সংযোগের তুলনায় আলগা-সংযুক্তকরণ কী এবং আমরা কেন সত্তাগুলি আলগাভাবে মিলিত করব?


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

ক্লাসএ যখন ক্লাসবি'র উপর নির্ভর করে, ক্লাসবি পরিবর্তিত হয় তখন ক্লাসএ প্রভাবিত হওয়ার সম্ভাবনা বেশি থাকে। এটি দৃ strong় মিলন।

ক্লাসবি কোড পরিবর্তন করে কোনওভাবে ক্লাসএ আক্রান্ত হওয়ার সম্ভাবনার চেয়ে ক্লাসি যদি ক্লাসবিতে হালকাভাবে নির্ভর করে তবে তা কম। এটি আলগা দম্পতি বা 'ডিউপলড' সম্পর্ক।

আলগা সংযুক্তি ভাল কারণ আমরা আমাদের সিস্টেমের উপাদানগুলি একে অপরের উপর নির্ভর করতে চাই না। আমরা আমাদের সিস্টেমটিকে মডুলার রাখতে চাই, যেখানে আমরা অন্য অংশকে প্রভাবিত না করে নিরাপদে একটি অংশ পরিবর্তন করতে পারি।

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

উদাহরণস্বরূপ, গাড়ী তৈরি করার সময়, আপনি ইঞ্জিনের অভ্যন্তরীণ পরিবর্তনটি স্টিয়ারিং হুইলে কিছু ভাঙ্গতে চাইবেন না।

গাড়ি তৈরি করার সময় এটি কখনই দুর্ঘটনার দ্বারা ঘটবে না, প্রোগ্রামারদের সাথে সর্বদা একই ঘটনা ঘটে। লুজ কাপলিং এর অর্থ এই জাতীয় ঘটনার ঝুঁকি হ্রাস করা।

শক্তিশালী মিলন সাধারণত ঘটে থাকে যখন সত্তা A সত্তা বি সম্পর্কে খুব বেশি জানে তবে সত্তা বি কীভাবে পরিচালনা করে বা কীভাবে এটি নির্মিত হয় সে সম্পর্কে অনেক বেশি অনুমান করে তবে সত্তা বিতে পরিবর্তন সত্তা এটিকে প্রভাবিত করে এমন উচ্চ ঝুঁকি রয়েছে This কারণ সত্তা বি সম্পর্কে এর একটি অনুমান এখন ভুল।

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

যে দিন আপনি কোনও ইঞ্জিন সহ নতুন গাড়ি কিনেছেন যা ভিন্নভাবে কাজ করে (বা কোনও কারণে আপনার ইঞ্জিনটি প্রতিস্থাপন করা হয়েছিল), আপনার পূর্ববর্তী অনুমানগুলি ভুল হবে। আপনি যদি একটি কম্পিউটারে কোড হন, আপনি এখন ভুল কোড হতে হবে যা সঠিকভাবে কাজ করে না।

তবে, গাড়ি সম্পর্কে চালক হিসাবে আপনি যে সমস্ত অনুমানগুলি করেন তা হ'ল: এ- তাদের স্টিয়ারিং হুইল এবং বি রয়েছে- গাড়ীর পরিবর্তনগুলি আপনাকে প্রভাবিত করবে না, যতক্ষণ না আপনার কয়েকটি অনুমান করা হয় সঠিক থাকুন এটি আলগা মিলন।


আলগা সংযোগ অর্জনের জন্য একটি গুরুত্বপূর্ণ কৌশল হ'ল এনক্যাপসুলেশন। ধারণাটি হ'ল কোনও শ্রেণি তার অভ্যন্তরীণ বিবরণ অন্যান্য শ্রেণি থেকে গোপন করে এবং অন্যান্য শ্রেণীর সাথে এটির সাথে যোগাযোগের জন্য একটি কঠোর সংজ্ঞায়িত ইন্টারফেস সরবরাহ করে।

সুতরাং উদাহরণস্বরূপ, যদি আপনি কোন ক্লাসে গাড়ি সংজ্ঞা ছিল, এটা ইন্টারফেস (পাবলিক পদ্ধতি) সম্ভবত হবে drive(), stop(), steerLeft(), steerRight(), getSpeed()। অন্যান্য বস্তুগুলি গাড়ী বস্তুগুলিতে প্রার্থনা করতে পারে সেগুলি এই methods

কার শ্রেণীর অন্যান্য সমস্ত বিবরণ: ইঞ্জিন কীভাবে কাজ করে, এটি ব্যবহার করে জ্বালানীর ধরণ ইত্যাদি অন্যান্য ক্লাস থেকে লুকায়িত থাকে - যাতে গাড়ী সম্পর্কে খুব বেশি কিছু জানতে না পারে।

মুহুর্তের ক্লাস এ ক্লাস বি সম্পর্কে খুব বেশি জানে: আমাদের দৃ a়তার সাথে একত্রে সম্পর্কযুক্ত সম্পর্ক রয়েছে, যেখানে ক্লাস এ ক্লাস বি এর উপর খুব নির্ভরশীল এবং ক্লাস বিতে পরিবর্তিত হওয়ার সম্ভাবনা রয়েছে ক্লাস এ-এর উপর এবং সিস্টেমকে প্রসারিত ও বজায় রাখা শক্ত করে তোলে।

দুটি সত্তার মধ্যে একটি সম্পর্ক, যেখানে তারা একে অপরের সম্পর্কে সামান্য জানেন (কেবলমাত্র প্রয়োজনীয়) - এটি একটি স্বচ্ছল যুগল বা হ'ল সম্পর্কযুক্ত।


3

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

তাদের মধ্যে নির্ভরতা থাকলে দুটি এবং , দুটি মিলিত হয়। যদি এ বি এর উপর নির্ভর করে তবে আপনি এটিকে বিবেচনায় না নিয়েই বি ব্যবহার করতে পারেন। আপনি যদি এ ব্যবহার করতে চান তবে আপনাকে বিও বহন করতে হবে, কারণ এ এটি নির্ভর করে।

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

এটি সম্ভবত বুনো অঞ্চলে পাওয়া সবচেয়ে সাধারণ ধরণের সংযোগ যা:

//Inside a class meant to display info for a particular Facebook user.
void DisplayFriends(FacebookUser user, FacebookClient client)
{
     Friend[] = (Friend[])client.GetConnection().ExecuteCommandForResult("getFriends:" + user.Name);
     ...
}

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

//Inside a class meant to display info for a particular Facebook user.
void DisplayFriends(FacebookUser user, FacebookClient client)
{
     Friend[] = client.GetFriends(user);
     ...
}

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

ফাংশনগুলির জন্য ডেমিটারের আইন অনুসরণ করে এই ধরণের ডিকপলিং সহজেই করা যায়, যা বলে (উইকিপিডিয়া উদ্ধৃত করে):

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

  • ও নিজেই
  • মিটার প্যারামিটার
  • এম এর মধ্যে যে কোনও বস্তু তৈরি / তাত্ক্ষণিক
  • ও এর সরাসরি উপাদান উপাদান
  • মিটার স্কোপটিতে ও দ্বারা অ্যাক্সেসযোগ্য একটি বৈশ্বিক পরিবর্তনশীল

যেহেতু আমি উত্তরের শুরুতে অস্থায়ী সংযুক্তি সম্পর্কে উল্লেখ করেছি, আমি শীঘ্রই এটি বর্ণনা করতে যাচ্ছি।

সমান্তরালভাবে অ্যালগরিদমগুলি সম্পাদন করে এমন অ্যাপ্লিকেশনগুলি ডিজাইন করার সময় সাধারণত অস্থায়ী সংযুক্তি বিবেচনা করা হয়। দুটি এক্সিকিউটেবল ইউনিট বিবেচনা করুন (সেগুলি প্রকৃত নির্দেশাবলী, পদ্ধতিগুলি বা আপনি যে কোনও ইউনিট হিসাবে বিবেচনা করতে চান), এ এবং বি say যদি A সাময়িকভাবে B এর সাথে মিলিত না হয় তবে A এবং B একই সময়ে কার্যকর করা যেতে পারে। এর জন্য আপনার নিজের উদাহরণ তৈরি করুন: আপনি আপনার প্রতিদিনের জীবনে সাধারণ কাজগুলি সম্পর্কে ভাবেন। আপনি কি একের পর এক এমন দুটি কাজ করেন যা আপনি একই সাথে করতে পারেন?

অবশেষে, আপনার শেষ বিট উত্তর দিতে:

ওয়েব ডেভেলপার হিসাবে এটি সম্পর্কে / অধ্যয়ন করা আমার জানা উচিত?

হ্যাঁ. উদাহরণস্বরূপ, ওয়েব বিকাশের জন্য সবচেয়ে জনপ্রিয় নকশার ধরণগুলির একটি (এমভিসি) হ'ল ডিক্লোলিং সম্পর্কে।


1

অন্যান্য উত্তরগুলি ডিকোপলিং কী তা বর্ণনা করার জন্য একটি ভাল কাজ করে। আমি আপনার চূড়ান্ত প্রশ্ন আলোচনা করতে চেয়েছিলেন।

ওয়েব ডেভেলপার হিসাবে এটি সম্পর্কে / অধ্যয়ন করা আমার জানা উচিত?

উত্তরটি একটি জোরালো হ্যাঁ। আপনি কী ধরণের বিকাশকারী তা বিবেচ্য নয়। আপনি একটি ওয়েব বিকাশকারী বা এম্বেড থাকা সিস্টেম বিকাশকারী হতে পারেন।

ধরা যাক যে আপনার একটি ক্লাস রয়েছে যা কাস্টম ইউআরএলগুলি তৈরি করে যা আপনার ওয়েব পৃষ্ঠায় স্থাপন করা হয়েছে। আপনি ক্লাসটি কোনও ট্যাগের href এ রেখে সরাসরি পৃষ্ঠায় URL গুলি লিখতে প্ররোচিত হতে পারেন। এটি প্রথমে সহজ মনে হতে পারে। কিন্তু যখন আপনাকে কোনও ইমেলটিতে লিঙ্কগুলি যুক্ত করতে এবং কোনও ব্যবহারকারীর কাছে প্রেরণ করার প্রয়োজন হয় তখন কী হয়? আপনার বর্তমান কোডটি কাজ করবে না কারণ আপনার ইউআরএল জেনারেটরটি আপনি ব্যবহার করছেন এমন ওয়েব ফ্রেমওয়ার্কের সাথে শক্তভাবে মিলিত হয়েছে।

আরও ভাল বিকল্পটি হ'ল ইউআরএল জেনারেটর শ্রেণি থাকে যা URL টি স্ট্রিং হিসাবে ফেরত দেয় returns এটি আপনার ওয়েব কোড ব্যবহার করতে পারে এবং এটি আপনার ইমেল কোড দ্বারাও ব্যবহৃত হতে পারে। ডিকোপলড কোড থাকলে আরও বেশি কাজ করার মতো মনে হতে পারে, তবে প্রচেষ্টা সময়ের সাথে সাথে তার জন্য অর্থ প্রদান করে।

আপনি যে প্রোগ্রামিং ডোমেইনে কাজ করছেন তা বিবেচনা না করেই যে কোডটি মডুলারাইজড এবং ডিকোপলড করা হয়েছে তা আপনার কোডটিকে আরও বোঝা, আরও পরীক্ষামূলক এবং আরও রক্ষণাবেক্ষণযোগ্য করে তুলবে।


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