সম্প্রতি আমি একটি কারখানার পদ্ধতিতে টিডিডিং করছিলাম। পদ্ধতিটি হ'ল হয় একটি সরল বস্তু তৈরি করা বা একটি সাজসজ্জারে আবৃত একটি বস্তু তৈরি করা। সজ্জিত অবজেক্টটি সমস্ত প্রসারিত স্ট্র্যাটেজিক্লাসের মধ্যে বিভিন্ন ধরণের একটি হতে পারে।
আমার পরীক্ষায় আমি যাচাই করতে চেয়েছিলাম, প্রত্যাশিত অবজেক্টের ক্লাসটি কিনা as প্লেইন অবজেক্ট ওস ফিরে এলে এটি সহজ, কিন্তু যখন এটি কোনও ডেকোরেটরের মধ্যে আবৃত থাকে তখন কী করতে হবে?
আমি পিএইচপিতে কোড করি যাতে আমি ext/Reflection
একটি ক্লাসযুক্ত মোড়কযুক্ত বস্তুর সন্ধান করতে পারি তবে আমার কাছে মনে হয় এটি অত্যধিক জটিল জিনিস এবং কিছুটা আবার টিডিডি-র বিধিবিধানের বিরুদ্ধে রয়েছে।
পরিবর্তে আমি getClassName()
স্ট্র্যাটেজিক্লাস থেকে ডাকা হলে অবজেক্টের শ্রেণির নামটি ফিরিয়ে আনব তা প্রবর্তন করার সিদ্ধান্ত নিয়েছি । ডেকোরেটারের কাছ থেকে কল করার পরে, এটি সাজানো বস্তুতে একই পদ্ধতি দ্বারা ফেরত মানটি ফিরিয়ে দেয়।
এটি আরও স্পষ্ট করার জন্য কিছু কোড:
interface StrategyInterface {
public function getClassName();
}
abstract class StrategyClass implements StrategyInterface {
public function getClassName() {
return \get_class($this);
}
}
abstract class StrategyDecorator implements StrategyInterface {
private $decorated;
public function __construct(StrategyClass $decorated) {
$this->decorated = $decorated;
}
public function getClassName() {
return $this->decorated->getClassName();
}
}
এবং একটি PHPUnit পরীক্ষা
/**
* @dataProvider providerForTestGetStrategy
* @param array $arguments
* @param string $expected
*/
public function testGetStrategy($arguments, $expected) {
$this->assertEquals(
__NAMESPACE__.'\\'.$expected,
$this->object->getStrategy($arguments)->getClassName()
)
}
//below there's another test to check if proper decorator is being used
আমার বক্তব্যটি এখানে: এই জাতীয় পদ্ধতিগুলি চালু করা কি ঠিক আছে, ইউনিট পরীক্ষা সহজ করা ছাড়া অন্য কোনও ব্যবহার নেই? একরকম আমার কাছে ঠিক মনে হচ্ছে না।