স্ট্যাটিক খারাপ, কিন্তু কারখানার প্যাটার্নটির কী হবে?


13

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

আমি এই সমস্যার মুখোমুখি হচ্ছি: আমি একটি বস্তু "নিবন্ধ" এর সাথে "অপশন" (সংযোজনীয় "মাইক্রো-আর্টিকেল") যুক্ত থাকতে পারি।

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

আমার প্রকৃত দৃষ্টিকোণ থেকে, আমি 3 টি বিকল্প দেখতে পাচ্ছি:

1) নিবন্ধের ভিতরে তৈরি করুন:

class Article
{
    //[...]
    public function getArrOption(){
        //Build an array of Options instance.
        //return an array of Options.
    }
}

প্রো: সরাসরি এগিয়ে

কনস্ট: রক্ষণাবেক্ষণ: নিবন্ধের অবজেক্টে এখন অপশন অবজেক্টের জন্য বিল্ডিং লজিক রয়েছে। এটি সম্ভবত কোড সদৃশ দিকে পরিচালিত করবে।

2) একটি বিকল্প কারখানা ব্যবহার করে

class Article
{
    //[...]
    public function getArrOption(){
        return OptionFactory::buildFromArticleId($this->getId());
    }
}

প্রো: বিল্ডিং লজিক নিবন্ধ শ্রেণীর বাইরে নয়

কনস্ট: আমি "স্ট্যাটিককে ঠাট্টা করা শক্ত" নিয়ম ভঙ্গ করছি, আমার নিবন্ধের ক্লাসটি পরীক্ষা করা শক্ত করে তুলছে।

3) সমস্ত লজিক পৃথক।

//Build the array of Option instance in a controller somewhere, using a Factory:
$arrOption = OptionFactory::buildFromArticleId($article->getId());

প্রো: আর্টিকেলটি কেবল তার নিজস্ব দায়বদ্ধতা পরিচালনা করে এবং বিকল্পগুলির সাথে তার "পিতা" লিঙ্কটি যত্ন করে না। বিষয়গুলি সত্যই ডিউপলড

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

সবচেয়ে ভাল উপায় কি? (আমি কি কিছু মিস করেছি?) ধন্যবাদ

সম্পাদনা:

ক্লাসের অভ্যন্তরে যদি আমি কারখানাকে কল করতে না পারি, তবে আমি প্রাথমিকভাবে অলস সূচনা প্যাটার্নটি কখনও ব্যবহার করতে পারি না তা উল্লেখ করার দরকার নেই ...


আমি এটি প্রাসঙ্গিক কিনা তা নিশ্চিত নই, তবে আমি পিএইচপিতে কোড করছি, সুতরাং "অ্যাপ্লিকেশন" রাষ্ট্রের চেয়ে কম। আমাদের অবশ্যই প্রতিটি পৃষ্ঠার মধ্যে থাকা সমস্ত ডেটা সেশন কুকিতে না সঞ্চয় করে রাখতে হবে। এর অর্থ হ'ল আমরা অ্যাপ্লিকেশন ভাষার মতো সমস্ত কিছু প্রাক লোড করতে পারি না ।
FMaz008

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

উত্তর:


12
  1. স্থিতিশীল "খারাপ" নয়, এটি অচলাচল করতে পারে। আপনি এখনও এটি ব্যবহার করতে পারেন যেখানে বিদ্রূপের কোনও অর্থ হয় না।

  2. এটি কোনও কারখানার প্যাটার্ন নয়, এটি একটি সংগ্রহস্থলের প্যাটার্নের মতো দেখায়, যদিও তা এটি নাও হতে পারে। কারখানাটি হ'ল যেখানে আপনার একই ইন্টারফেস / বেস ক্লাসের সাথে একাধিক ক্লাস রয়েছে এবং আপনি কোন যুক্তিকে আলাদা করতে চান যা কোন শ্রেণিতে ফিরবে dec সংগ্রহস্থলটি তার সংগ্রহস্থল থেকে ডেটা পায়, সেই সংগ্রহস্থলটির বাস্তবায়নকে বিমূর্ত করে তোলে (নিবন্ধটি তার ডিফল্টগুলি একই ডিবি, অন্য একটি, এক্সএমএল ফাইল, একটি সিএসভি ফাইল, যাই হোক না কেন সঞ্চিত আছে তা জানতে হবে না)।

  3. আপনি আর্টিকেল ক্লাসকে কনস্ট্রাক্টরে একটি অবজেক্টফ্যাক্টরি (বা রেপোজিটরি, বা যাই হোক না কেন) অবজেক্ট দেওয়ার বিষয়ে সম্ভাবনাটিকে এড়িয়ে গেছেন যার উপর ভিত্তি করে এটি বিল্ডফ্রোম আর্টিকাল পদ্ধতিতে কল করতে পারে।

আমার পিএইচপিটি মরিচা, তবে আমি মনে করি এটি এর মতো দেখাচ্ছে:

class Article
{
    private $_option_repository;

    public function __construct($option_repository) {
        $_option_repository = $option_repository;
    }

    //[...]

    public function getArrOption(){
        return $_option_repository->buildFromArticleId($this->getId());
    }
}

আমি মনে করি এটি উপরের আপনার সমস্ত প্রস্তাব পূরণ করে।


সুতরাং কারখানা / সংগ্রহশালা / ম্যাপারগুলির উদাহরণ থাকা ঠিক আছে? আমার একটি নির্ভরতা ধারক বা অন্য কিছু প্রয়োজন হবে কারণ যদি আমাদের কোনও সম্ভাব্য অবজেক্টের দ্বারা প্রত্যাবর্তনযোগ্য সমস্ত সম্ভাব্য অবজেক্টের জন্য সমস্ত কারখানা / সংগ্রহশালা / ম্যাপার ইনজেকশন প্রয়োজন হয়, এটি খুব দ্রুত তৈরি করে। (নিবন্ধ -> অপশন গ্রুপ -> বিকল্প -> নিবন্ধ, ইত্যাদি ..)
এফএমজ008

1
এটি ঠিক আছে এর চেয়ে বেশি, এটি পছন্দনীয়। আমি সাধারণত পুনরাবৃত্তি কোড অপসারণের জন্য স্থির ব্যবহার সংরক্ষণ করি, যেখানে একাধিক ক্লাসে পরীক্ষার জন্য এটি যথেষ্ট ছোট। এবং হ্যাঁ, একটি আইওসি / ডিআই কনটেইনার আপনার জীবনকে আরও সহজ করে তুলছে। একটি ব্যবহার করুন।
pdr

1

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

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

(1) বিশ্বব্যাপী প্রতিটি ঘটনাকে একটি উদাহরণ ভেরিয়েবলের অ্যাক্সেসের সাথে প্রতিস্থাপন করুন;

(২) তাত্ক্ষণিকভাবে তাত্ক্ষণিক হয় যখন সেই দৃষ্টান্তটি পরিবর্তনশীল স্বয়ংক্রিয়ভাবে বস্তুর মধ্যে সংযোজন করা যাক।

"সিউস: সূক্ষ্ম-দানযুক্ত কনফিগারেশনের জন্য স্থিতিশীল পদ্ধতিগুলি থেকে দায়িত্বগুলি হ্রাস করা"

ওয়েব্যাক মেশিন লিঙ্ক


3
যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে।
gnat
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.