ম্যাজেন্টো 2 - যাদু গেটারগুলি ব্যবহার / এড়ানো ভাল অনুশীলন?


21

Varien_Object(এম 1) এবং DataObject(এম 2) অন ​​ম্যাজিক প্রাপ্তরা সাধারণ অনুশীলন, তবে ম্যাজেন্টো 2 এর সাথে এটি ব্যবহার করা ভুল বলে মনে করে।

ভাল:

  • পড়তে / লিখতে সহজ

খারাপ

প্রশ্ন

ম্যাজেন্টো 2 এর সাথে আমাদের দুটি নতুন পদ্ধতি রয়েছে:

  • getDataByKey($key)
  • getDataByPath($path)

এখনও ব্যবহার করার কোনও ভাল কারণ getData($key)বা কোনও যাদুবিদ্যার কি আছে ?


সম্পাদনা:

@ বিনাই ধন্যবাদ আমি @methodপদ্ধতিটি উল্লেখ করিনি , কারণ আমার পদ্ধতিটি একেবারেই আলাদা ছিল।

এটি কেবল আইডিইকে সহায়তা করে, তবে অন্যান্য জিনিসে কোনও প্রভাব ফেলবে না।

এর উপর বেশ কয়েকটি মার্জড পিআর রয়েছে "মাইক্রো-অপ্টিমাইজেশন" এর (int)পরিবর্তে intval()লুপের বাইরে অ্যারের আকার (এমনকি ছোট অ্যারেগুলির জন্যও) কাস্টিংয়ের মতো ।

অন্যদিকে আছে

  1. জাদুকরী গেটরস, মারিয়াস বর্ণনা হিসাবে কিছু "ওভারহেড" আছে ....

    strtolower(trim(preg_replace('/([A-Z]|[0-9]+)/', "_$1", $name), '_'));
  2. getData($key) মেহটডগুলিকে আরও 2-3 টি চেক করতে হয় ...

    • if ('' === $key) {
    • if (strpos($key, '/')) {
    • if ($index !== null) {

নিজস্ব কোডের জন্য সত্যিকারের পদ্ধতিগুলি পছন্দ করতে সম্পূর্ণ সম্মত হয় তবে একই ক্ষেত্রে এটি সম্ভবত হয় না ... যেমন আপনি একটি কাস্টম ইভেন্ট তৈরি করেছেন ...

$value = $observer->getVar_1();
$value = $observer->getData('var_1');
$value = $observer->getDataByKey('var_1');

3 য় ব্যবহার /** @var some $value */করা আমার কাছে সেরা বলে মনে হচ্ছে। (?)


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

উত্তর:


20

উপরের প্রশ্নটি ম্যাজিক পদ্ধতি বনাম getDataByKeyবা ব্যবহার সম্পর্কে getDataByPath। আমি মনে করি একটি তৃতীয় বিকল্প আছে, এবং এটি বাস্তব গিটার এবং সেটার পদ্ধতিগুলি প্রয়োগ করছে।

getData*পদ্ধতি সব downside হয় আছে কাজ টাইপ অনুমান জন্য সটীক করা থাকতে হবে যে, তারা।
সাধারণত /* @var string $foo */এটি getData*কলের উপরে টিকা দিয়ে করা হয় ।
এটি কিছুটা দুর্গন্ধযুক্ত, কারণ যে শ্রেণিতে ডেটা রয়েছে সেগুলিতে ডেটা ধরণের ঘোষণা করা উচিত, যে ক্লাসটি কল করে না getData*
এর কারণ হ'ল ডেটা পরিবর্তন হলে ক্লাসটি সবচেয়ে বেশি আপডেট হওয়ার সম্ভাবনা রয়েছে, সমস্ত getData*কল সাইটই নয়।
এ কারণেই আমি মনে করি আসল পদ্ধতিগুলি getData*অ্যাক্সেসর ব্যবহারের তুলনায় রক্ষণাবেক্ষণযোগ্যতা বাড়ায় ।

সুতরাং আমি মনে করি এটি রক্ষণাবেক্ষণযোগ্যতা এবং দ্রুত বাস্তবায়নের (লেখার জন্য কম কোড) এর মধ্যে বাণিজ্য বন্ধ হয়ে যায়।

ভাগ্যক্রমে, আজকাল আইডিইগুলি আমাদের জন্য গিটার এবং সেটার বাস্তবায়ন তৈরি করতে সত্যিই ভাল, যাতে যুক্তিটি আর প্রয়োগ করে না।

উপরের প্রশ্নটি থেকে যে যাদু গেটার্স এবং সেটটারগুলি হারিয়ে যাচ্ছে তার বিরুদ্ধে আরও একটি যুক্তি হ'ল তাদের জন্য প্লাগিন তৈরি করা সম্ভব নয়।

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

পেশাদাররা

  • @methodএকটি সত্যিকারের গেটর এবং সেটার বাস্তবায়নের তুলনায় একটি টীকা লেখার জন্য একটু কম কোড is আজকাল এটি সবেমাত্র সত্য কারণ আইডিইগুলি অ্যাকসেসর পদ্ধতি উত্পন্ন করার ক্ষেত্রে ভাল, সুতরাং এটি আর কোনও আসল উপকার নয়।

কনস

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

উপরের কারণে আমি ব্যক্তিগতভাবে @methodটীকাগুলি ব্যবহার করি না যদি আমি সেগুলি এড়াতে পারি।
কোড দীর্ঘায়িত করার উদ্দেশ্যে আমি বাস্তব গেটর এবং সেটার পদ্ধতিগুলি প্রয়োগ করি। রক্ষণাবেক্ষণযোগ্যতা লাভ তাদের তৈরি করতে আইডিই ট্রিগার করার প্রয়াসের পক্ষে মূল্যবান।

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


চমৎকার সারসংক্ষেপ। ধন্যবাদ বিনাই। আমি উত্তর চেয়েছি যে উত্তর।
এসভি

1

getData*পদ্ধতি সব downside হয় আছে কাজ টাইপ অনুমান জন্য সটীক করা থাকতে হবে যে, তারা।

সাধারণত /*@var string $foo */এটি getData*কলের উপরে টিকা দিয়ে করা হয় । এটি কিছুটা দুর্গন্ধযুক্ত, কারণ যে শ্রেণিতে ডেটা রয়েছে সেগুলিতে ডেটা ধরণের ঘোষণা করা উচিত, গেটডেটা * নামক শ্রেণি নয়।

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

হ্যাঁ এটি দুর্গন্ধযুক্ত, তবে (এবং হওয়া উচিত) এড়ানো যায়? আমি মনে করি এটি খুব সাধারণ কোড এবং প্রায়শই পরামর্শ দেওয়া হয়:

/** @var Foo $product */
$product = $model->getProduct()
if ($product->getId()) {
    $product->doSomething();
}

সমস্যাগুলি আপনি কেবল অনুমান করেন যে কল করার Fooযোগ্য getId()মেথোডের সাথে ফেরতের মান টাইপ হয় type

রক্ষণাবেক্ষণের জন্য কেন ভেরিয়েবল টাইপ ধরে ধরে একটি যুক্ত করবেন না InvalidArgumentException?

$product = $model->getProduct()
if ($product instanceof Foo && $product->getId()) {
    $product->doSomething();
}

এর $model->getProduct()মতো বিভিন্ন রিটার্নের ধরণের ক্ষেত্রে স্থির কোড বিশ্লেষণও ঠিক করে Foo|false। প্রথম ক্ষেত্রে এটি doSomething()সম্ভব কল করার বিষয়ে অভিযোগ করবে false

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