पृष्ठभूमि
मैं एक चालू C # प्रोजेक्ट पर काम कर रहा हूं। मैं C # प्रोग्रामर नहीं हूं, मुख्य रूप से C ++ प्रोग्रामर हूं। इसलिए मुझे मूल रूप से आसान और रीफैक्टरिंग कार्य सौंपे गए।
कोड एक गड़बड़ है। बहुत बड़ा प्रोजेक्ट है। जैसा कि हमारे ग्राहक ने नई सुविधाओं और बग फिक्स के साथ लगातार रिलीज की मांग की, अन्य सभी डेवलपर्स को कोडिंग करते समय क्रूर बल दृष्टिकोण लेने के लिए मजबूर किया गया। कोड अत्यधिक अचूक है और अन्य सभी डेवलपर्स इससे सहमत हैं।
मैं यहां बहस करने के लिए नहीं हूं कि क्या उन्होंने इसे सही किया है। जैसा कि मैं पुन: सक्रिय कर रहा हूं, मैं सोच रहा हूं कि क्या मैं इसे सही तरीके से कर रहा हूं क्योंकि मेरा रिफलेक्टेड कोड जटिल लगता है! यहाँ मेरा कार्य सरल उदाहरण के रूप में है।
मुसीबत
छह वर्गों के होते हैं: 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()
फ़ंक्शंस cuter लग रहे हैं, दो समस्याएं हैं जो मुझे परेशान कर रही हैं:
- किसी भी बदलाव के लिए
CommonTask()
, सभी छह (और भविष्य में अधिक हो सकते हैं) सुविधाओं का परीक्षण करने की आवश्यकता है। CommonTask()
पहले से ही जटिल है। यह समय के साथ अधिक जटिल हो जाएगा।
क्या मैं इसे सही तरीके से कर रहा हूं?