मेरे पास निम्न दो तरीकों कि (जैसा कि आप देख सकते हैं) एक को छोड़कर अपने बयान से ज्यादातर में समान हैं (विवरण के लिए नीचे देखें)Refactor दो सी ++ तरीकों का पालन डुप्लिकेट कोड बाहर स्थानांतरित करने के
unsigned int CSWX::getLineParameters(const SURFACE & surface, vector<double> & params)
{
VARIANT varParams;
surface->getPlaneParams(varParams); // this is the line of code that is different
SafeDoubleArray sdParams(varParams);
for(int i = 0 ; i < sdParams.getSize() ; ++i)
{
params.push_back(sdParams[i]);
}
if(params.size() > 0) return 0;
return 1;
}
unsigned int CSWX::getPlaneParameters(const CURVE & curve, vector<double> & params)
{
VARIANT varParams;
curve->get_LineParams(varParams); // this is the line of code that is different
SafeDoubleArray sdParams(varParams);
for(int i = 0 ; i < sdParams.getSize() ; ++i)
{
params.push_back(sdParams[i]);
}
if(params.size() > 0) return 0;
return 1;
}
क्या कोई ऐसी तकनीक है जिसका उपयोग मैं दो विधियों के कोड की सामान्य रेखाओं को एक अलग विधि से स्थानांतरित करने के लिए उपयोग कर सकता हूं, जिसे दो भिन्नताओं से बुलाया जा सकता है - या - संभवतः दो तरीकों को एक विधि में जोड़ना?
निम्न प्रतिबंध हैं:
- कक्षाएं सतह और वक्र 3 पार्टी पुस्तकालयों और इसलिए unmodifiable से कर रहे हैं। (यदि यह मदद करता है कि वे दोनों IDispatch से प्राप्त कर रहे)
- भी अधिक समान वर्गों (जैसे चेहरा) है कि यह "टेम्पलेट" में खरी उतर सकती हैं (नहीं सी ++ टेम्पलेट, बस कोड की लाइनों के प्रवाह)
मैं निम्नलिखित (? संभवतः) समाधान के रूप में लागू किया जा सकता है, लेकिन वास्तव में आशा करता हूं वहाँ एक बेहतर समाधान है:
- मैं 2 तरीकों की एक 3 पैरामीटर जोड़ सकते हैं - जैसे एक enum - जो पहले पैरामीटर की पहचान करता है (उदाहरण के लिए enum :: input_type_surface, enum :: input_type_curve)
- मैं एक आईडीस्पैच में पास कर सकता हूं और गतिशील_कास्ट <> और परीक्षण कर सकता हूं कि कौन सी कास्ट NON_NULL है और दाएं कॉल करने के लिए एक और करें विधि (जैसे getPlaneParams() बनाम get_LineParams())
निम्नलिखित एक प्रतिबंध नहीं है, लेकिन अपनी टीम के साथियों प्रतिरोध की वजह से एक आवश्यकता होगा:
- नहीं एक नया वर्ग है कि सतह से विरासत को लागू/CURVE इत्यादि। (वे ऊपर बताए गए enum समाधान का उपयोग करके इसे हल करना पसंद करेंगे)
आप 'पैराम्स' वेक्टर को साफ़ नहीं करते हैं। क्या आप इसे कई वस्तुओं से पैरामीटर के साथ भरना चाहते हैं? संभवतः आपके कोड को दोबारा करने के लिए बहुत बेहतर तरीके हैं जो आप geXXXX पैरामीटर विधियों से पहले क्या करते हैं। –
'बूल' पर्याप्त होने पर 'हस्ताक्षरित int' क्यों लौटा रहे हैं? –
'SafeDoubleArray' का प्रकार क्या है? मुझे संदेह है कि यह और अधिक प्रतिक्रिया दे सकता है, लेकिन हमें पहले इसकी आवश्यकता है। मैं 'बूल' के लिए @ मैथ्यूयू की गति को दूसरा स्थान देता हूं। – GManNickG