একটি পদ্ধতি শৃঙ্খলা মাধ্যমে প্রসঙ্গ পাস করার জন্য বিন্যাস


19

এটি একটি নকশার সিদ্ধান্ত যা বেশ কিছুটা সামনে আসে: এটি এমন পদ্ধতির মাধ্যমে কীভাবে প্রসঙ্গটি পাস করবে যেটির কোনও পদ্ধতিতে এটির দরকার নেই। একটি সঠিক উত্তর আছে বা এটি প্রসঙ্গে নির্ভর করে।

নমুনা কোড যার সমাধান প্রয়োজন

// needs the dependency
function baz(session) {
  session('baz');
}

// doesn't care about the dependency
function bar() {
  baz();
}

// needs the dependency
function foo(session) {
   session('foo')
   bar();
}

// creates the dependency
function start() {
  let session = new Session();
  foo(session);
}

সম্ভাব্য সমাধান

  • threadlocal
  • বিশ্বব্যাপী
  • প্রসঙ্গ অবজেক্ট
  • মাধ্যমে নির্ভরতা পাস
  • কারি বাজ এবং প্রথম আর্গ হিসাবে নির্ভরতা সেট করে বারে এটি পাস করুন
  • নির্ভরতা ইনজেকশন

কোথায় আসে তার উদাহরণগুলি

এইচটিটিপি অনুরোধ প্রক্রিয়াজাতকরণ

অনুরোধ বৈশিষ্ট্যের আকারে প্রাসঙ্গিক অবজেক্টগুলি প্রায়শই ব্যবহৃত হয়: এক্সপ্রেস, জাভা সার্লেটস বা। নেট এর ওউইন দেখুন।

লগিং

জাভা লগিংয়ের জন্য লোকেরা প্রায়শই গ্লোবাল / সিঙ্গলেট ব্যবহার করে। সাধারণ লগ 4 জে / কমন্স লগিং / জাভা লগিং নিদর্শনগুলি দেখুন।

লেনদেন

থ্রেড স্থানীয়রা প্রায়শই কোনও প্রয়োজন নেই এমন সমস্ত পদ্ধতির পরামিতি হিসাবে তাদের পাস করার প্রয়োজন এড়াতে পদ্ধতি কলের সাথে সম্পর্কিত একটি লেনদেন বা সেশন রাখার জন্য ব্যবহৃত হয়।


আরও অর্থপূর্ণ উদাহরণ ব্যবহার করুন।
তুলিনাস কর্ডোভা

এটি যেখানে আসে তার কয়েকটি উদাহরণ যুক্ত করেছি।
জেমি ম্যাকক্রিন্ডল

3
আমি আরও অর্থপূর্ণ উদাহরণ কোড বোঝাতে চাইছি।
তুলিনাস কর্ডোভা

উত্তর:


11

একমাত্র ন্যায্য উত্তরটি হ'ল এটি আপনার প্রোগ্রামিং দৃষ্টান্তের আইডিয়ামগুলির উপর নির্ভর করে। আপনি যদি ওও ব্যবহার করে থাকেন তবে পদ্ধতি থেকে পদ্ধতিতে নির্ভরতা পাস করা প্রায় অবশ্যই ভুল। এটি ওও-তে একটি কোড গন্ধ। একটি বস্তু - আসলে, যে সমস্যার OO যেমন পণ্য সমাধান এক সংশোধন করা হয়েছে একটি প্রসঙ্গ। সুতরাং ওওতে, একটি সঠিক (সর্বদা অন্যান্য উপায় রয়েছে) পদ্ধতির হ'ল ঠিকাদার বা সম্পত্তির মাধ্যমে নির্ভরতা সরবরাহ করা। একজন মন্তব্যকারী "নির্ভরতা ইনজেকশন" উল্লেখ করেছেন এবং এটি পুরোপুরি বৈধ, তবে এটি কঠোরভাবে প্রয়োজনীয় নয়। কেবল নির্ভরতা সরবরাহ করুন যাতে এটি সদস্য হিসাবে fooএবং এর জন্য উপলব্ধ baz

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

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


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

3
@ ডেভিড আর্নো আমি একটি ভিন্ন দৃষ্টান্ত বনাম ব্যবহার করার পরামর্শ দিয়েছিলাম object অবজেক্ট অব স্টেটমেন্টালভিটি "ওও দৃষ্টান্তের দ্বারা করা সবচেয়ে বড় ভুলগুলির মধ্যে একটি" এবং তারপরে দৃষ্টান্তটিকে অবরুদ্ধ করে দেওয়া। আমার কাছে প্রায় কোনও পদ্ধতির বিপরীতে কিছুই নেই তবে সাধারণত কোডটি অপছন্দ করে যেখানে লেখক তাদের সরঞ্জামের সাথে লড়াই করছেন। ব্যক্তিগত রাষ্ট্র ওওর একটি স্বতন্ত্র বৈশিষ্ট্য। আপনি যদি এই বৈশিষ্ট্যটি রোধ করেন তবে আপনি ও এর কিছু শক্তি হারাবেন।
স্ক্যান্ট রজার

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

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

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

10

যদি barনির্ভরশীল হয় baz, যার পরিবর্তে প্রয়োজন হয় dependency, তবে সঠিকভাবে ব্যবহারের barজন্য dependencyখুব বেশি প্রয়োজন baz। অতএব, সঠিক পন্থাগুলি হয় হয় প্যারামিটার হিসাবে নির্ভরতাটি পেরিয়ে যাওয়ার জন্য bar, বা তরকারী bazএবং তা পাস করা bar

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

আপনার প্রস্তাবিত অন্য সমস্ত বিকল্পগুলির প্রস্তাব আমি উভয়ই "হ্যাকি" প্রকৃতির এবং পরীক্ষার ক্ষেত্রে এবং বাগগুলি খুঁজে বের করতে অসুবিধা উভয়ই সমস্যার কারণ হতে পারে।


1
আমি প্রায় সম্পূর্ণ সম্মত। নির্ভরতা ইনজেকশন আরেকটি অ-"হ্যাকি" অ্যাপ্রোচ হতে পারে।
জোনাথন ভ্যান ডি ভীন

1
@ জোনাথনভান্ডেভিন, নিশ্চয়ই dependencyপরামিতিগুলির মধ্য দিয়ে পার হয়ে যাওয়া নির্ভরতা ইনজেকশন?
ডেভিড আরনো

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

@ জোনাথানভান্ডেও আমি সম্মত, নির্ভরতা ইনজেকশন একটি বৈধ সমাধান। আসলে এটিই আমি প্রায়শই বাছাই করি।
জেমি ম্যাকক্রিন্ডল

1

দার্শনিকভাবে বলছি

আমি একমত ডেভিড আরনো উদ্বিগ্নতা তুলে ধরে

বাস্তবায়ন সমাধানগুলির সন্ধান হিসাবে আমি ওপি পড়ছি reading তবে, উত্তরটি হ'ল নকশা পরিবর্তন করুন । "প্যাটার্নস"? ওও ডিজাইনটি, প্রসঙ্গে সমস্তই বলতে পারেন। এটি সম্ভাবনার সাথে গর্ভবতী কাগজের একটি বিশাল, ফাঁকা শিট।

বিদ্যমান কোডের সাথে লেনদেন করা একটি আলাদা, ভাল, প্রসঙ্গে।



আমি এখনই ঠিক একই সমস্যা নিয়ে কাজ করছি। ঠিক আছে, আমি কয়েকশ লাইন কোড কপি-এন-পেস্ট ঠিক করে চলেছি যা ঠিক তখনই একটি মান সংযোজন করা যায়।

কোডটি আধুনিকীকরণ করুন

আমি সদৃশ কোডের 600 টি লাইন ফেলে দিয়েছিলাম তখন "এ কল বি সি কল কল ডি ..." এর পরিবর্তে আমার কাছে "কল এ, রিটার্ন, কল বি, রিটার্ন, কল সি ..." রয়েছে। এখন আমাদের কেবলমাত্র সেই পদ্ধতিগুলির মধ্যে একটিতে মানটি ইনজেক্ট করতে হবে, আসুন পদ্ধতি E বলি let's

কনস্ট্রাক্টরটিতে একটি ডিফল্ট প্যারামিটার যুক্ত করুন। বিদ্যমান কলার পরিবর্তন হয় না - "optionচ্ছিক" এখানে অপারেটিভ শব্দ। যদি কোনও যুক্তি পাস না করা হয় তবে ডিফল্ট মান ব্যবহৃত হয়। তারপরে রিফ্যাক্টরড, মডিউলার স্ট্রাকচারে ভেরিয়েবলটি পাস করার জন্য কেবল 1 লাইন পরিবর্তন; এবং এটি ব্যবহারের জন্য E পদ্ধতিতে একটি ছোট পরিবর্তন।


বন্ধ

একটি প্রোগ্রামার থ্রেড - "কেন কোনও প্রোগ্রাম একটি ক্লোজার ব্যবহার করবে?"

মূলত, আপনি কোনও পদ্ধতিতে মানগুলি ইনজেকশন দিচ্ছেন যা মানগুলির সাথে কাস্টমাইজড পদ্ধতিটি দেয়। সেই কাস্টমাইজড পদ্ধতিটি পরে কার্যকর করা হয়।

এই কৌশলটি আপনাকে একটি বিদ্যমান পদ্ধতিতে এর স্বাক্ষর পরিবর্তন না করে পরিবর্তন করতে দেয়।



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