इसलिए मैंने हाल ही में अपने कोड में कुछ प्रमुख रिफ्लेक्टरिंग किए हैं। मुख्य चीजों में से एक जो मैंने करने की कोशिश की, उसने मेरी कक्षाओं को डेटा ऑब्जेक्ट और वर्कर ऑब्जेक्ट में विभाजित कर दिया। यह अन्य चीजों के बीच, क्लीन कोड के इस भाग से प्रेरित था :
संकर
यह भ्रम कभी-कभी दुर्भाग्यपूर्ण संकर डेटा संरचनाओं की ओर जाता है जो आधी वस्तु और आधा डेटा संरचना होते हैं। उनके पास ऐसे कार्य हैं जो महत्वपूर्ण काम करते हैं, और उनके पास या तो सार्वजनिक चर या सार्वजनिक एक्सेसर्स और म्यूटेटर हैं, जो सभी इरादों और उद्देश्यों के लिए, निजी चर को सार्वजनिक करते हैं, अन्य बाहरी कार्यों को उन चर का उपयोग करने के लिए लुभाते हैं जिस तरह से एक प्रक्रियात्मक कार्यक्रम का उपयोग करेंगे। डेटा संरचना।
इस तरह के संकर नए कार्यों को जोड़ना कठिन बनाते हैं, लेकिन नए डेटा संरचनाओं को जोड़ना भी कठिन बनाते हैं। वे दोनों दुनिया के सबसे बुरे हैं। उन्हें बनाने से बचें। वे एक गुथे हुए डिज़ाइन के संकेत हैं जिनके लेखक अनिश्चित हैं - या इससे भी बदतर, अज्ञानी हैं - चाहे उन्हें कार्यों या प्रकारों से सुरक्षा की आवश्यकता हो।
हाल ही में मैं अपने एक कार्यकर्ता ऑब्जेक्ट के कोड को देख रहा था (जो विज़िटर पैटर्न को लागू करने के लिए होता है ) और इसे देखा।
@Override
public void visit(MarketTrade trade) {
this.data.handleTrade(trade);
updateRun(trade);
}
private void updateRun(MarketTrade newTrade) {
if(this.data.getLastAggressor() != newTrade.getAggressor()) {
this.data.setRunLength(0);
this.data.setLastAggressor(newTrade.getAggressor());
}
this.data.setRunLength(this.data.getRunLength() + newTrade.getLots());
}
मैंने तुरंत अपने आप से कहा "फीचर ईर्ष्या! यह तर्क Data
कक्षा में होना चाहिए - विशेष रूप से handleTrade
विधि में। handleTrade
और हमेशा एक साथ updateRun
होना चाहिए "। लेकिन फिर मैंने सोचा "डेटा क्लास सिर्फ एक डेटा संरचना है, अगर मैं ऐसा करना शुरू कर दूंगा, तो यह हाइब्रिड ऑब्जेक्ट आएगा!"public
क्या बेहतर है और क्यों? आप कैसे तय करते हैं कि क्या करना है?