উদাহরণ
আমি একচেটিয়া কোড জুড়ে এসেছি যা এক জায়গায় "সবকিছু" করে - ডাটাবেস থেকে ডেটা লোড করা, এইচটিএমএল মার্কআপ দেখানো, রাউটার / নিয়ামক / ক্রিয়া হিসাবে অভিনয় করা। আমি এসআরপি মুভিং ডাটাবেস কোডটিকে তার নিজের ফাইলে প্রয়োগ করতে শুরু করেছিলাম, জিনিসগুলির জন্য আরও ভাল নামকরণ সরবরাহ করে, এবং এটি সমস্ত ভাল দেখায়, তবে আমি কেন এটি করছি তা নিয়ে আমার সন্দেহ হতে শুরু করে।
রিফ্যাক্টর কেন? উদ্দেশ্য কি? এটা কি অকেজো? লাভ কী? মনে রাখবেন যে আমি বেশিরভাগ ক্ষেত্রে একচেটিয়া ফাইলটি রেখে দিয়েছি, তবে কেবলমাত্র সেই ছোট অংশটিই রিফ্যাক্ট করেছিলাম যেখানে আমার কিছু কাজ করার প্রয়োজন ছিল to
আসল কোড:
একটি কংক্রিট উদাহরণ দেওয়ার জন্য, আমি এই কোড স্নিপেট জুড়ে এসেছি - এটি পরিচিত পণ্য আইডি দ্বারা বা কোনও ব্যবহারকারী-নির্বাচিত সংস্করণ আইডি দ্বারা পণ্য স্পেসিফিকেশন লোড করে:
if ($verid)
$sql1 = "SELECT * FROM product_spec WHERE id = " . clean_input($verid);
else
$sql1 = "SELECT * FROM product_spec WHERE product_id = " . clean_input($productid) ;
$result1 = query($sql1);
$row1 = fetch_array($result1);
/* html markup follows */
refactoring:
যেহেতু আমি কোডের এই নির্দিষ্ট অংশে আমাকে জিনিসগুলি পরিবর্তন করার জন্য কিছু কাজ করছি, তাই আমি এটি সংগ্রহস্থল প্যাটার্ন ব্যবহার করতে পরিবর্তন করেছি এবং এটি অবজেক্ট-ভিত্তিক মাইএসকিউএল সুবিধাদি ব্যবহার করতে আপগ্রেড করেছি:
//some implementation details omitted
$this->repository = new SpecRepository($mysql);
if ($verid)
$row1 = $this->repository->getSpecByVersion($verid);
else
$row1 = $this->repository->getSpecByProductId($productid);
/* html markup follows to be refactored or left alone till another time*/
//added new class:
class SpecRepository extends MySqlRepository
{
function getSpecByVersion(int $verid)
{
return $this->getMySql()->paramQuery("
SELECT * FROM product_spec WHERE id = ?
", $verid)->getSingleArray();
}
function getSpecByProductId(int $productid)
{
return $this->getMySql()->paramQuery("
SELECT * FROM product_spec WHERE product_id = ?
", $productid)->getSingleArray();
}
}
আমার এই করা উচিত?
পরিবর্তনের দিকে ফিরে তাকালে, কোডটি এখনও আছে, একই কার্যকারিতা সহ কোড, তবে বিভিন্ন ফাইলগুলিতে, বিভিন্ন নাম, স্থানগুলিতে, পদ্ধতিগত পরিবর্তে আরও অবজেক্ট-ভিত্তিক শৈলী ব্যবহার করে। প্রকৃতপক্ষে এটি লক্ষণীয় যে মজাদার কোডটি দেখতে একই রকম কার্যকারিতা থাকা সত্ত্বেও অনেক বেশি ফুলে যায়।
আমি কিছু উত্তরের আগেই বলেছিলাম "যদি আপনি চুল্লি কেনার কারণগুলি না জানেন তবে তা করবেন না" এবং সম্ভবত আমি তাতে সম্মত হতে পারি। আমার কারণগুলি হল সময়ের সাথে সাথে কোডের মান উন্নত করা (এবং আমার আশা এই যে আমি এসআরপি এবং অন্যান্য নীতিগুলি অনুসরণ করে এটি করব)।
সেগুলি কি যথেষ্ট পর্যাপ্ত কারণ বা আমি এইভাবে "চারপাশে কোডটি পুনরায় সাজানোর" জন্য আমার সময় নষ্ট করছি? সামগ্রিকভাবে রিফ্যাক্টরিং এটিকে জলকে সততার মতো চালানোর মতো মনে হয় - এটি সময় নেয় এবং এসআরপি যতদূর যায় ততই এটি আরও "বিচ্ছিন্ন" হয়ে যায় তবে আমার ভাল উদ্দেশ্য সত্ত্বেও আমি মনে করি না যে আমি আশ্চর্যজনক উন্নতি করছি। অতএব, বিতর্ক করা যদি আগের মতো কোডটি ছেড়ে দেওয়া ভাল এবং চুল্লিটি না রাখাই ভাল।
আমি কেন প্রথম জায়গায় রিফ্যাক্টর করলাম?
আমার ক্ষেত্রে আমি একটি নতুন পণ্য লাইনের জন্য নতুন কার্যকারিতা যুক্ত করছি, সুতরাং আমাকে হয় অনুরূপ পণ্য লাইনের জন্য বিদ্যমান কোড কাঠামো অনুসরণ করতে হবে, বা আমার নিজের লিখতে হবে।
select *
একটি "সেরা অনুশীলন" হয়ে যায়।
Select * from ..
এন্টি-প্যাটার্ন হিসাবে বিবেচনা করা যেতে পারে। দেখুন stackoverflow.com/q/3639861/31326