कोड के इस टुकड़े के साथ कई मुद्दे हैं, जो, इस तरह से छोटा किया जा सकता है:
public List<Money> getMoneyByPersons() {
return persons.size() == 1 ?
moneyService.getMoneyIfHasOnePerson() :
moneyService.getMoney();
}
यह स्पष्ट नहीं है कि एक व्यक्ति एक विशेष मामला क्यों है। मुझे लगता है कि एक विशिष्ट व्यवसाय नियम है जो बताता है कि एक व्यक्ति से पैसा प्राप्त करना कई व्यक्तियों से धन प्राप्त करने से अलग है। हालांकि, मैं जाने के लिए और दोनों के अंदर देखने के लिए है getMoneyIfHasOnePerson
और getMoney
समझने के लिए क्यों अलग मामलों रहे हैं उम्मीद कर रहा।
नाम getMoneyIfHasOnePerson
सही नहीं लगता है। नाम से, मैं यह जांचने की विधि की अपेक्षा करूंगा कि क्या कोई एकल व्यक्ति है और यदि यह मामला है, तो उससे धन प्राप्त करें; अन्यथा, कुछ न करें। आपके कोड से, यह वह नहीं है जो हो रहा है (या आप दो बार शर्त कर रहे हैं)।
क्या List<Money>
संग्रह के बजाय लौटने का कोई कारण है ?
अपने प्रश्न पर वापस जाएं, क्योंकि यह स्पष्ट नहीं है कि एक व्यक्ति के लिए एक विशेष उपचार क्यों है, अंक एक को एक निरंतर द्वारा प्रतिस्थापित किया जाना चाहिए, जब तक कि नियमों को स्पष्ट करने का एक और तरीका नहीं है। यहां, कोई भी किसी अन्य जादू की संख्या से बहुत अलग नहीं है। आपके पास व्यावसायिक नियम हो सकते हैं कि विशेष उपचार एक, दो या तीन व्यक्तियों या केवल बारह से अधिक व्यक्तियों पर लागू होता है।
मैं सबसे अच्छा समाधान चुनने के लिए संदर्भ को कैसे भेद कर सकता हूं?
आप अपने कोड को और अधिक स्पष्ट करते हैं।
उदाहरण 1
निम्नलिखित कोड की कल्पना करें:
if (sequence.size() == 0) {
return null;
}
return this.processSequence(sequence);
क्या यहाँ शून्य एक जादुई मूल्य है? कोड बल्कि स्पष्ट है: यदि अनुक्रम में कोई तत्व नहीं हैं, तो चलो इसे संसाधित नहीं करते हैं और एक विशेष मूल्य वापस करते हैं। लेकिन इस कोड को भी इस तरह से फिर से लिखा जा सकता है:
if (sequence.isEmpty()) {
return null;
}
return this.processSequence(sequence);
यहां, कोई अधिक स्थिर नहीं है, और कोड भी स्पष्ट है।
उदाहरण 2
कोड का एक और टुकड़ा लें:
const result = Math.round(input * 1000) / 1000;
यह समझने में बहुत अधिक समय नहीं लगता है कि यह जावास्क्रिप्ट जैसी भाषाओं में क्या करता है जिनमें round(value, precision)
अधिभार नहीं है ।
अब, यदि आप एक स्थिरांक का परिचय देना चाहते हैं, तो इसे कैसे कहा जाएगा? निकटतम शब्द जो आपको मिल सकता है Precision
। इसलिए:
const precision = 1000;
const result = Math.round(input * precision) / precision;
क्या यह पठनीयता में सुधार करता है? हो न हो। यहां, किसी स्थिरांक का मान सीमित होता है, और आप स्वयं से पूछ सकते हैं कि क्या आपको वास्तव में रिफ्लेक्टरिंग करने की आवश्यकता है। यहाँ अच्छी बात यह है कि अब, सटीक केवल एक बार घोषित किया जाता है, इसलिए यदि यह बदल जाता है, तो आप इस तरह की गलती करने का जोखिम नहीं उठाते हैं:
const result = Math.round(input * 100) / 1000;
एक स्थान पर मूल्य बदलना, और दूसरे में करना भूल जाते हैं।
उदाहरण 3
उन उदाहरणों से, आपको यह आभास हो सकता है कि संख्या को हर मामले में स्थिरांक द्वारा प्रतिस्थापित किया जाना चाहिए । यह सच नहीं है। कुछ स्थितियों में, निरंतर होने से कोड में सुधार नहीं होता है।
निम्नलिखित कोड का टुकड़ा लें:
class Point
{
...
public void Reset()
{
x, y = (0, 0);
}
}
यदि आप एक चर द्वारा शून्य को बदलने की कोशिश करते हैं, तो कठिनाई एक सार्थक नाम खोजने के लिए होगी। आप इसे कैसे नाम देंगे? ZeroPosition
? Base
? Default
? यहां एक स्थाई का परिचय किसी भी तरह से कोड को नहीं बढ़ाएगा। यह इसे थोड़ा लंबा बनाता है, और बस।
हालांकि ऐसे मामले दुर्लभ हैं। इसलिए जब भी आप कोड में कोई संख्या ढूंढते हैं, तो यह प्रयास करने का प्रयास करें कि कैसे कोड को फिर से प्राप्त किया जा सकता है। अपने आप से पूछें कि क्या संख्या के लिए एक व्यावसायिक अर्थ है। यदि हाँ, तो एक स्थिरांक अनिवार्य है। यदि नहीं, तो आप संख्या का नाम कैसे देंगे? यदि आप एक सार्थक नाम पाते हैं, तो यह बहुत अच्छा है। यदि नहीं, तो संभावना है कि आपको एक ऐसा मामला मिल गया है जहां निरंतर अनावश्यक है।
persons
से आता है और क्या वर्णन करता है? आपके कोड में कोई टिप्पणी नहीं है जो भी यह अनुमान लगाने में कठिन है कि यह क्या कर रहा है।