প্লাগইনগুলির কী ব্যবহার করা উচিত: হুকস, ইভেন্ট বা অন্য কিছু?


24

এমন একটি অ্যাপ্লিকেশন বিবেচনা করুন যা প্লাগইনগুলিকে তার প্রোগ্রাম প্রবাহে প্রতিক্রিয়া জানাতে দেয়।

আমি এটি অর্জনের 2 টি উপায় জানি: হুকস এবং ইভেন্টগুলি

1. হুকস

মূল প্রোগ্রাম প্রবাহের ভিতরে খালি ফাংশনগুলিতে কলগুলি ব্যবহার করুন। এই ফাংশনগুলি প্লাগইনগুলির মাধ্যমে ওভাররেড করা যায়।

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

function file_copy(stdClass $source, $destination = NULL, $replace = FILE_EXISTS_RENAME) {
    // ... [File copying routine]

    // Inform modules that the file has been copied.
    module_invoke_all('file_copy', $file, $source);

    return $file;
    // ...
}

একটি মডিউল একটি modulename_file_copy($file, $source)ফাংশন বাস্তবায়ন করতে পারে যা module_invoke_allইন দ্বারা ডাকা হবে file_copy। এই ফাংশনটি শেষ হওয়ার পরে, file_copyপুনরায় কার্যকর করা শুরু হবে।

2. ইভেন্টগুলি

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

উদাহরণস্বরূপ, একটি জিকুয়েরি গ্যালারী প্লাগইন ফোটোরমা বেশ কয়েকটি ইভেন্ট প্রয়োগ করে । উদাহরণস্বরূপ, এখানে তার showপদ্ধতির একটি অংশ যা fotorama:showঘটনাকে আগুন ধরিয়ে দেয় ।

  that.show = function (options) {
    // ... [show the new frame]

    // [fire the event]
    options.reset || triggerEvent('show', {
      user: options.user,
      time: time
    });

    // ... [do lots of other stuff with navigation bars, etc.]
  };

একটি স্ক্রিপ্ট এই ইভেন্টটি শুনতে পারে এবং আগুনের সময় কিছু করতে পারে:

$('.fotorama').on(
  'fotorama:show',
  function (e, fotorama, extra) {
    console.log(e.type + (extra.user ? ' after user’s touch' : ''));
    console.log('transition duration: ' + extra.time);
  }
);

প্রশ্ন

  1. এই ধরনের প্লাগইন আচরণ বাস্তবায়নের জন্য কি মূলধারার অন্যান্য উপায় আছে?

  2. যদি তা না হয় তবে কখন হুক ব্যবহার করা উচিত এবং কখন ইভেন্ট ব্যবহার করা উচিত? চূড়ান্ত লক্ষ্য বিবেচনা করে কোডটি আরও রক্ষণাবেক্ষণযোগ্য এবং পঠনযোগ্য করে তোলা, অ্যাপ এবং প্লাগইন বিকাশকারী উভয়ের দৃষ্টিকোণ থেকে?

উত্তর:


17

একটি হুক এবং ইভেন্টের মধ্যে প্রধান পার্থক্য হ'ল আলগা সংযোগ বনাম টাইট কাপলিং।

হুক হ'ল সম্প্রচারের একটি সাধারণ উপায় যা কিছু ঘটেছে। আপনি প্লাগিনগুলি পুনরায় সংকলন না করেই নতুন হুক যুক্ত করতে পারেন এবং সমস্ত হুক জেনেরিক ডিজাইনের ধরণ অনুসরণ করে। হুক এপিআই একবার সংজ্ঞায়িত হয়ে গেলে এটি পরিবর্তিত হয় না তাই অ্যাপ এবং প্লাগইনের মধ্যে সংযোগটি ভেঙে যাওয়ার সম্ভাবনা নেই।

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

তারা উভয় একই ফলাফল অর্জন। এটি কীভাবে আপনি অ্যাপ্লিকেশনটিতে প্লাগইনটি জোড়া দিতে চান তার উপর নির্ভর করে।

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

ইভেন্টগুলি আপনাকে সংকলন সময়ের ত্রুটিগুলি পাওয়ার ক্ষমতা দেয় যা প্লাগইনটি সংশোধন করা দরকার, কারণ ইভেন্টের কিছু স্বাক্ষর বদলেছে।

আপনি বিকল্প পদ্ধতির জন্য জিজ্ঞাসা করেছেন।

আদেশগুলি:

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

ম্যাক্রো:

প্লাগইনগুলির পরিবর্তে যখন জিনিসগুলি ঘটে তখন প্রতিক্রিয়া জানায়। প্লাগইনগুলি সক্রিয়ভাবে জিনিসগুলিকে ঘটায়। ম্যাক্রো হ'ল একটি উচ্চ-স্তরের ভাষা যা অ্যাপ্লিকেশনটির উপরে চলে যা যা এটি করতে বলছে।

রাষ্ট্র পরিবর্তন শ্রোতা:

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


2
বিকল্প জন্য +1, -1 সংজ্ঞা ও কাপলিং যুক্তি (যার জন্য আছে থাকবেই কিন্তু কাপলিং নকশা পছন্দের ফলত, যেটা নামটি আপনি আপনার প্লাগইন সিস্টেমে দিতে হয়)

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

3

অবশ্যই ঘটনাগুলি, এটি ইতিমধ্যে স্থাপত্য স্তরে প্রয়োজনীয় বিমূর্ততা মঞ্জুরি দেয়।

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

হুক সহ নিম্নলিখিত উদাহরণটি ধরুন: আপনার এমন একটি সিস্টেম রয়েছে যেখানে ২০ টি প্লাগইন চলছে। এই প্লাগইনগুলির মধ্যে একটি file_copyপদ্ধতিটিকে ডকুমেন্ট করার পদ্ধতিতে কল করে এবং ডকুমেন্ট হিসাবে ফলাফলের প্রত্যাশা করে। তবে অন্য কয়েকটি প্লাগইন সেই ফাংশনটিকে আটকিয়েছে এবং সুতরাং নিম্নলিখিত সমস্যার মধ্যে একটি ক্রাশ বা ত্রুটির কারণ ঘটেছে:

  • হুক ফাংশনটি কেবল ক্র্যাশ করে। অন্যান্য সমস্ত প্লাগইন এখনই স্ক্রুযুক্ত, কারণ তারা আর ফাইল_কপি বা ফাংশনটি প্রত্যাশিত থেকে আলাদাভাবে কাজ করতে পারে না।
  • ডকুমেন্টেশনের ভিত্তিতে ইনপুটটি সঠিক, তবে অন্যান্য প্লাগইন এটি আশা করে না এবং অদ্ভুত ফলাফল বা ক্র্যাশ সরবরাহ করে।
  • কলটি ঠিকঠাক হয়ে যায়, তবে ফলাফলটি ডকুমেন্টেশন অনুযায়ী যা প্রত্যাশিত তা আর হয় না তাই প্লাগইন ব্যর্থ হয় বা ক্রাশ হয়।

আপনি যদি সেই প্লাগইনগুলির মধ্যে একই সমস্যাগুলির সাথে ইভেন্টগুলির সাথে উপরের মতোটি করেন তবে নিম্নলিখিতগুলি ঘটে:

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

1

উত্তরাধিকার একটি বিকল্প হতে পারে।

হুক ব্যতীত উত্তরাধিকারের অতিরিক্ত পদ্ধতির সংজ্ঞা প্রয়োজন হয় না এবং কোনও কিছু জড়িত না হলে খালি পদ্ধতিটি কল করার জন্য কোনও কার্যকারিতা হ্রাস পায় না।

ইভেন্টগুলি ব্যতীত, উত্তরাধিকারের ইভেন্ট ইভেন্টের জন্য অতিরিক্ত কোডেরও প্রয়োজন হয় না।

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


-1 কারণ আপনি উত্তরাধিকার ব্যবহার করেন এবং তারপরে আপনার স্পেসিফিকেশনটি ব্যবহার করার জন্য তাত্ক্ষণিক কোডটি পরিবর্তন করুন এবং উত্তরাধিকারের অপব্যবহার করবেন কারণ নতুন আচরণের মূল প্রয়োগ হিসাবে আলাদা উদ্দেশ্য রয়েছে ...
স্পার্ক

0

অবশ্যই ঘটনা। এটি আপনার আর্কিটেকচারকে আরও প্রশস্ত-মাপেরযোগ্য হতে দেয়।

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

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