সমস্ত প্লাগইনগুলিকে কোনও শ্রেণিতে আবদ্ধ করা উচিত?


28

একটি প্লাগইন বিকাশ করার সময় নামের জায়গার বিরোধগুলি এড়াতে ফাংশনগুলিকে একত্রে একটি শ্রেণিতে ভাগ করা উচিত?

ক্লাস ব্যবহার করে কি পিএইচপি-র জন্য পারফরম্যান্স ওভারহেড তৈরি করে?

যদি কোনও পারফরম্যান্স হিট হয় তবে তার পরিবর্তে ফাংশনটির নামগুলি কি পূর্ব-স্থির হওয়া উচিত?


8
সম্ভবত কোনও ওয়ার্ডপ্রেস চেয়ে পিএইচপি আরও বেশি প্রশ্ন, দেখুন এই স্ট্যাকওভারফ্লো প্রশ্নটি আপনার প্রশ্নের উপযুক্তভাবে সম্বোধন করে কিনা
t31os

উত্তর:


24

একটি প্লাগইন বিকাশ করার সময় নামের জায়গার বিরোধগুলি এড়াতে ফাংশনগুলিকে একত্রে একটি শ্রেণিতে ভাগ করা উচিত?

হ্যাঁ, তবে এটি কেবল একটি ছোটখাট যুক্তি। আসলে এটি OOAD এর কোনও শ্রেণির "সত্য" প্রকৃতি নয়

ক্লাস ব্যবহার করে কি পিএইচপি-র জন্য পারফরম্যান্স ওভারহেড তৈরি করে?

না, উল্লেখযোগ্যভাবে নয়। খারাপ ডিজাইন এবং / অথবা খারাপ লিখিত কোড বা প্রাক-পরিপক্ক অপ্টিমাইজেশন প্রকৃত ভাষার বৈশিষ্ট্যগুলির তুলনায় অনেক বেশি কার্যকারিতা সমস্যা তৈরি করে।

যদি কোনও পারফরম্যান্স হিট হয় তবে তার পরিবর্তে ফাংশনটির নামগুলি কি পূর্ব-স্থির হওয়া উচিত?

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


শেষের সারি:

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

/* global function */
function myplug_hook()
{
}

add_filter('the_hook', 'myplug_hook');


/* global static function */
class myplug
{
    public static function hook()
    {
    }
}

add_filter('the_hook', 'myplug::hook');

এটি কেবলমাত্র একটি সামান্য উদাহরণ যা দেখায় যে আপনাকে একক হুকের জন্য আরও টাইপ করতে হবে। অতিরিক্তভাবে এটি দেখায় যে নেমস্পেসিং কীভাবে কাজ করে: আপনি সমস্ত স্থিতিশীল ফাংশনগুলির নাম পরিবর্তন করতে একক শ্রেণীর নামটি আরও সহজে প্রতিস্থাপন করতে পারেন এবং তারপরে অনুসন্ধান এবং প্রতিস্থাপন myplug::করতে পারেন যা myplug_মিথ্যা ধনাত্মকতার কারণে শক্ত হতে পারে । তবে শেষ পর্যন্ত খুব বেশি পার্থক্য নেই।

মূল বক্তব্যটি হ'ল: স্থির শ্রেণীর ফাংশন ডক্স আসলে আর কিছু নয় তবে গ্লোবাল ফাংশন ডক্স

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

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

তাহলে এটি কেবল সিনট্যাকটিক চিনির চেয়ে বেশি।

মূল বক্তব্যটি হ'ল: এমন কিছু করুন যা আপনাকে সহজেই ডিল করতে এবং বজায় রাখতে পারে এমন কোড লিখতে সহায়তা করে। ওভার-রেট পারফরম্যান্স করবেন না, এটি একটি সাধারণ ভুল। আরও গুরুত্বপূর্ণ হ'ল আপনি এমন কোড লিখুন যা সহজেই পড়তে এবং বুঝতে সহজ হয়, যা আপনার প্রয়োজন অনুযায়ী করে। হতে পারে এই প্রশ্নোত্তর এই প্রসঙ্গে আরও বড় ছবির জন্য সহায়ক: একাধিক কাস্টম মেটাবক্স সহায়তা

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

<?php
/** Plugin Headers ... */

return MyPlugin::bootstrap(); 

class MyPlugin
{
    /** @var MyPlugin */
    static $instance;
    static public function bootstrap() {
        if (NULL === self::$instance) {
            self::$instance = new __CLASS__;
        }
        return self::$instance;
    }
    # ...
}

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

উদাহরণটি দেখায়, প্লাগইনের একটি উদাহরণ তৈরি করা হবে। এই আপনি একটি মত পরিচিত কমন্স ব্যবহার করতে পারবেন রচয়িতা ডক্স ( __construct) প্রকৃত প্লাগইন আরম্ভ করতে:

# ...
class MyPlugin
{
    # ...
    public function __construct()
    {
        add_filter('the_hook', array($this, 'hook'));
    }

    public function hook()
    {
    }
    # ...
}

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

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

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

সুতরাং নাম-ফাঁক দেওয়ার জন্য আরও একটি সুবিধা রয়েছে। সেরা পরামর্শ আমি দিতে পারি: নিজের চেষ্টা করুন। আপনি খুব শিথিল নেই, আবিষ্কার করার জন্য কেবল নতুন জিনিস।

আপনার প্লাগইনটি সামঞ্জস্য রেখে আপনি সম্ভবত ওয়ার্ডপ্রেসের আরও কয়েকটি বড় আপডেটগুলি পাস করার পরে পার্থক্যগুলি লক্ষ্য করবেন।

ক্যাভ্যাট : কাজটি করার জন্য যদি আপনার প্লাগইন সরাসরি ওয়ার্ডপ্রেসের সাথে একীভূত হয় তবে এক বা দুটি পাবলিক ফাংশন ব্যবহার করা আপনার আরও ভাল মানায়। কাজের জন্য সঠিক সরঞ্জামটি নিন।


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

@ অ্যালেক্সভ্যালিজো: একা নেমস্পেসিংয়ের জন্য, সত্যিকারের প্রয়োজনীয়তা নেই (যেমন আমি উত্তরে লিখেছি, স্থির শ্রেণির পদ্ধতিগুলি বিশ্বব্যাপী ফাংশনগুলির মতো প্রায় একই রকম)। সুতরাং আপনি নিজের নিজস্ব নামের স্থানটি করতে পারেন (পিএইচপি 5.3 প্রকারের নেমস্পেসিংটি যা)। সুতরাং আপনি যে পুরোপুরি ঠিক লক্ষ্য করেছেন। স্থির বুটস্ট্র্যাপ ফাংশনের সাথে একই: প্রযুক্তিগতভাবে এটি প্রয়োজনীয় নয়, একটি সরল এছাড়াও return $myPlugin = new MyPlugin(); এটি করে। তবে বড় ছবি জন্য, একটি সহজ নতুন পারে যথেষ্ট নাও হতে, তুলনা ওয়ার্ডপ্রেস প্লাগইন: আমি "আঁট কাপলিং" কিভাবে এড়ানো করেন?
হ্যাক্রে

9

ক্লাস ভিএস ফাংশন সেট


কর্মক্ষমতা

সাধারণ: আফাইক, ক্লাস এবং ফাংশন সেটের মধ্যে "পারফরম্যান্স" এর কোনও পার্থক্য নেই।

বিস্তারিত:

  • আপনি যদি function_exists()বনামকে প্রশ্ন করেন তবে একটি বড় পার্থক্য রয়েছে class_exists()কারণ সাধারণত আপনি প্রচুর ফাংশন পেয়েছেন (ডাব্লুপি কোরে 1.800 ডলার (?) বনাম ক্লাস (100 ডলার (?) ডাব্লুপি কোরে)) জিনিস "প্লাগেবল" উপার্জন এবং সেইজন্য existance জিজ্ঞাসাবাদ তাই হয় সঞ্চালনের সময় মধ্যে একটি পার্থক্য।
  • ক্লাসগুলি ফাংশন সেটগুলির চেয়ে একটি বড় সুবিধা দেয়: ফাংশন সহ, যেখানে আপনাকে এটির প্রয়োজন হয় না এমন কোনও অনুরোধে এটি কল করা থেকে আপনি আরও সহজে এড়াতে পারবেন। আপনাকে কেবল ক্লাসের জন্য শর্তসাপেক্ষ চেক করতে হবে এবং প্রতিটি ফাংশনের জন্য নয়। সুতরাং আপনার যদি প্রতিটি পৃষ্ঠার লোডে এটির প্রয়োজন না হয় এবং যদি / অন্য বিবৃতিতে প্রচুর কল করা এড়ানো যায় তবে একটি ফাংশন "আরও ভাল সম্পাদন করে"।

আর্কিটেকচার - কীভাবে স্টাফ কাজ করে:

ফাংশন সেট: সাধারণভাবে, ফাংশনগুলি আপনি যে সারিতে কল করেন তা কার্যকর হয়। সুতরাং আপনি যখনই স্টাফকে কল করবেন তখন আপনাকে আবার এটি লিখতে হবে, যদি আপনাকে একবারে একাধিকবার কল করতে হয়।

ক্লাস: ক্লাসে বিভিন্ন অ্যাপ্রোচ রয়েছে। ক্লাসটি, যা কোনও ফাংশন সেটের নিকটে আসে তা হ'ল "কারখানা" শ্রেণি ( উইকিপিডিয়া / গুগল )। ইমো এটি ফাংশনগুলির সেট হিসাবে প্রায় একই, তবে একটি শ্রেণিতে আবদ্ধ ulated তবে ক্লাসের অন্যান্য "প্রকার" রয়েছে। আপনি উদাহরণস্বরূপ একটি বিমূর্ত বা পিতামাত্ত শ্রেণীর ক্লাস লিখতে পারেন , আপনি একটি শিশু শ্রেণীর সাথে প্রসারিত করেছেন। প্রকৃত বিশ্বের উদাহরণে: আসুন ধরা যাক আপনি একটি ক্লাস পেয়েছেন যা কিছু স্থির পাঠ্য ক্ষেত্র তৈরি করে। আপনার __construct()ফাংশনে আপনার কাছে "বাম_কলাম", "ডান_কলাম" এবং "পাদদেশ_ফিল্ড" এর মতো দৃশ্যের একটি সেট রয়েছে। তারপরে আপনি $text_field = new TextFieldClass();ক্লাসটি ইনস্ট্যান্ট করার মতো কিছু বলবেন । এবং পরে আপনি কেবল কল $text_field->add( $case => 'left_column', 'case' => 'foo text' );এবং$text_field->add( $case => 'footer_field', 'case' => 'bar text' );। তারপরে আপনার সমস্ত শর্তসাপেক্ষ এবং অন্যটি ইতিমধ্যে সম্পাদিত হয়েছে যখন আপনি ক্লাসটি ইনস্ট্যান্ট করেছিলেন এবং পাঠ্যের ক্ষেত্রগুলি তৈরি করার সময় কেবলমাত্র দুটি শ্রেণির ফাংশনগুলি ডাকা হত। এই জেনারিয়োতে ​​আপনি কার্যকর করার সময়টির কয়েক এমএস বাঁচাতে পারতেন।


ব্যক্তিগত মতামত

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

উদাহরণ:

// construction of object
if ( ! class_exists( 'WPSE_HelloWorld' ) )
{

class WPSE_HelloWorld
{
    function __construct( $args = array( 'text', 'html', 'echo' ) )
    {
        // call your object building procedures here
        $this->hello_world( 'text', 'html', 'echo' );
    }

    function hello_world( 'text', 'html', 'echo' )
    {
        $start_el = '<{$html}>';
        $end_el = '</{$html}>';
        if ( $echo )
        {
            return print "{$start_el}{$some}{$end_el}";
        }

        return "{$start_el}{$some}{$end_el}";
    }
} // END Class 

}

// API: public functions
function the_hello_world( $args( 'echo' => true ) )
{
    $new = new WPSE_HelloWorld();
    return $new->hello_world( $args );
}

function get_hello_world( array( $args( 'echo' => false) ) )
{
    $new = new WPSE_HelloWorld();
    return $new->hello_world( $args );
}

// then you can call it like get_the_title() or the_title(), which you know from the WP API:
// 'echo' is set to false per default:
$some_var = get_hello_world( array( 'text' => 'hello reader', 'html' => 'strong' ) );
# *returns* "<strong>hello reader</strong>"

// 'echo' is set to true per default:
the_hello_world( array( 'text' => 'hello reader', 'html' => 'strong' ) );
# *prints/echos* "<strong>hello reader</strong>"

দ্রষ্টব্য: দয়া করে মন্তব্যে পোস্ট করা @ t310s লিঙ্কটিও পড়ুন


শুধু কৌতূহল, আপনি কেন আপনার প্লাগইন ফাইলটি ওয়ার্ডপ্রেসের সাথে একাধিকবার অন্তর্ভুক্ত করবেন বলে আশা করছেন?
hakre

@hakre আমি ঠিক এটি কোথায় বলেছি? sry, মা খুব ক্লান্ত।
কায়সার

1
@ কাইজার, আমি ধরে নিচ্ছি @hakre if( ! class_exists )আপনার শুরুতে যে রেখাটি উল্লেখ করেছে তা উল্লেখ করছে ?
jjeaton

1
@hakre আমি ধরে নিয়েছি @ কাইজার চেকটি করছেন class_existsকারণ এটি আরও একবার অন্তর্ভুক্ত করা যেতে পারে তবে অন্য শ্রেণীর সাথে বিরোধ এড়াতে?
মিশাল মৌ

হ্যাঁ আমি ক্লাস_এক্টিস্টদের নিয়ে ভাবছিলাম।
hakre

4

এটি প্লাগইন লেখকের পক্ষে খাঁটি শৈলীগত পছন্দ। গতির দিক দিয়ে আসল পার্থক্য নেই।


1

ক্লাসগুলি পারফরম্যান্সের ক্ষেত্রে সাধারণত কোনও সুবিধা দেয় না, তবে তাদের খুব কমই কোনও বিরূপ প্রভাব পড়ে have তাদের আসল উপকারিতা কোড পরিষ্কার করা এবং নাম স্থান বিরোধগুলি এড়ানো।


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

@ অ্যালেক্সভ্যালিজো আমারও তাই অনুমান :)
বাইনারনেট

0

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

ক্লাস সহ, আপনার ক্লাসের নামটিতে প্লাগইনটির নাম সম্ভবত একবার ছিল have

অতিরিক্তভাবে, আপনি আচরণ খুব কার্যকরভাবে বাস্তবায়নের জন্য উত্তরাধিকার বা অন্যান্য oo নির্মাণগুলি ব্যবহার করতে পারেন। এখানে প্রাক্তন:

class animalplugin{
  //plugin functions...
  function talk(){print "animalnoise";}
}
class animalplugin_with_cat_mods extends abcplugin{
  //cat functions overrides
  function talk(){print "meow";}
}
if (iscat()){
  new animalplugin_with_cat_mods();
} else {
  new animalplugin();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.