পটভূমি
আমি একটি চলমান সি # প্রকল্পে কাজ করছি। আমি সি # প্রোগ্রামার নই, প্রাথমিকভাবে একজন সি ++ প্রোগ্রামার। সুতরাং আমাকে মূলত সহজ এবং পুনরায় নিয়ন্ত্রণের কাজ অর্পণ করা হয়েছিল।
কোডটি একটি গণ্ডগোল। এটি একটি বিশাল প্রকল্প। যেহেতু আমাদের গ্রাহক নতুন বৈশিষ্ট্য এবং বাগ ফিক্সগুলির সাথে ঘন ঘন রিলিজের দাবি করেছেন, অন্য সমস্ত বিকাশকারী কোডিং করার সময় নিষ্ঠুর বল প্রয়োগ করতে বাধ্য হয়েছিল। কোডটি অত্যন্ত অনিবার্য এবং অন্যান্য সমস্ত বিকাশকারী এটির সাথে একমত হন।
তারা এখানে ঠিকঠাক করেছে কিনা তা নিয়ে আমি বিতর্ক করতে আসছি না। আমি যেমন রিফ্যাক্টর করছি, আমি ভাবছি যে আমার রিফ্যাক্টর কোডটি জটিল বলে মনে হচ্ছে আমি সঠিক উপায়ে এটি করছি কিনা! এখানে সহজ উদাহরণ হিসাবে আমার কাজ।
সমস্যা
ছয় শ্রেণীর আছে: A
, B
, C
, D
, E
এবং F
। সমস্ত ক্লাসের একটি ফাংশন আছে ExecJob()
। সমস্ত ছয়টি বাস্তবায়ন খুব একই রকম। মূলত, প্রথমে A::ExecJob()
লেখা ছিল। তারপরে কিছুটা আলাদা সংস্করণ প্রয়োজন ছিল যা B::ExecJob()
কপি-পেস্ট-সংশোধন করে প্রয়োগ করা হয়েছিল A::ExecJob()
। যখন আরেকটি ভিন্ন সংস্করণ প্রয়োজন হয়, C::ExecJob()
তখন লেখা ছিল এবং ইত্যাদি। সমস্ত ছয়টি বাস্তবায়নের কয়েকটি সাধারণ কোড রয়েছে, তারপরে কোডের কিছু আলাদা লাইন, তারপরে আবার কিছু সাধারণ কোড এবং এরকম। বাস্তবায়নগুলির একটি সাধারণ উদাহরণ এখানে:
A::ExecJob()
{
S1;
S2;
S3;
S4;
S5;
}
B::ExecJob()
{
S1;
S3;
S4;
S5;
}
C::ExecJob()
{
S1;
S3;
S4;
}
যেখানে SN
ঠিক একই বক্তব্যগুলির একটি গ্রুপ।
এগুলিকে সাধারণ করার জন্য, আমি অন্য একটি ক্লাস তৈরি করেছি এবং একটি ফাংশনে সাধারণ কোডটি সরিয়ে নিয়েছি। কোন গ্রুপের বিবৃতিগুলি কার্যকর করা উচিত তা নিয়ন্ত্রণ করতে প্যারামিটার ব্যবহার করে:
Base::CommonTask(param)
{
S1;
if (param.s2) S2;
S3;
S4;
if (param.s5) S5;
}
A::ExecJob() // A inherits Base
{
param.s2 = true;
param.s5 = true;
CommonTask(param);
}
B::ExecJob() // B inherits Base
{
param.s2 = false;
param.s5 = true;
CommonTask(param);
}
C::ExecJob() // C inherits Base
{
param.s2 = false;
param.s5 = false;
CommonTask(param);
}
মনে রাখবেন যে, এই উদাহরণে কেবল তিনটি শ্রেণি এবং ওভারসিম্প্লিফাইড স্টেটমেন্ট নিয়োগ করা হয়েছে। অনুশীলনে, CommonTask()
ফাংশনটি সমস্ত পরামিতি পরীক্ষার সাথে খুব জটিল দেখায় এবং আরও অনেক স্টেটমেন্ট রয়েছে। এছাড়াও, বাস্তব কোডে, বেশ কয়েকটি CommonTask()
দেখার মতো ফাংশন রয়েছে।
যদিও সমস্ত বাস্তবায়নগুলি সাধারণ কোড ভাগ করে নিচ্ছে এবং ExecJob()
ফাংশনগুলি কর্টর খুঁজছেন, সেখানে দুটি সমস্যা রয়েছে যা আমাকে বিরক্ত করছে:
- যে কোনও পরিবর্তনের জন্য
CommonTask()
, সমস্ত ছয়টি (এবং ভবিষ্যতে আরও বেশি হতে পারে) বৈশিষ্ট্যগুলি পরীক্ষা করা দরকার। CommonTask()
ইতিমধ্যে জটিল। এটি সময়ের সাথে আরও জটিল হয়ে উঠবে।
আমি কি এটি সঠিক উপায়ে করছি?