मुझे लगता है कि स्पष्टता के बारे में आंतरिक तरीकों का उपयोग करने का एक और लाभ है। इसके बारे में सोचें: विधियों की सूची वाला एक वर्ग विधियों की एक फ्लैट, गैर-संरचित सूची है। यदि आप चिंताओं को अलग करने और सामान को समान स्तर पर रखने के बारे में परवाह करते हैं और कोड का टुकड़ा केवल एक ही स्थान पर उपयोग किया जाता है, तो आंतरिक तरीकों से मदद मिलती है जबकि दृढ़ता से संकेत मिलता है कि उनका उपयोग केवल संलग्न विधि में किया जाता है।
मान लें कि एक वर्ग में इस विधि है:
class Scoring
# other code
def score(dice)
same, rest = split_dice(dice)
set_score = if same.empty?
0
else
die = same.keys.first
case die
when 1
1000
else
100 * die
end
end
set_score + rest.map { |die, count| count * single_die_score(die) }.sum
end
# other code
end
अब, यह एक तरह से सरल डेटा संरचना परिवर्तन और अधिक उच्च स्तर कोड है, एक सेट बनाने पासों का स्कोर जोड़ने और वे जो से संबंधित नहीं है सेट। लेकिन यह स्पष्ट नहीं है कि क्या हो रहा है। चलो इसे और अधिक वर्णनात्मक बनाते हैं। एक साधारण रिफैक्टरिंग इस प्रकार है: get_set_score() और get_rest_score (के
class Scoring
# other methods...
def score(dice)
same, rest = split_dice(dice)
set_score = same.empty? ? 0 : get_set_score(same)
set_score + get_rest_score(rest)
end
def get_set_score(dice)
die = dice.keys.first
case die
when 1
1000
else
100 * die
end
end
def get_rest_score(dice)
dice.map { |die, count| count * single_die_score(die) }.sum
end
# other code...
end
आइडिया) एक वर्णनात्मक (हालांकि नहीं बहुत अच्छा में इस उदाहरण ही गाढ़ा) उन टुकड़े करना क्या का उपयोग करके दस्तावेज़ के लिए है।लेकिन अगर आपके पास इस तरह की कई विधियां हैं, तो स्कोर में कोड() का पालन करना इतना आसान नहीं है, और यदि आप किसी भी तरीके से दोबारा प्रतिक्रिया देते हैं तो आपको यह जांचना होगा कि अन्य विधियों का उपयोग किस प्रकार किया जाता है (भले ही वे निजी हैं - अन्य उसी वर्ग के तरीके उनका उपयोग कर सकते हैं)। में यहाँ
class Scoring
# other code
def score(dice)
def get_set_score(dice)
die = dice.keys.first
case die
when 1
1000
else
100 * die
end
end
def get_rest_score(dice)
dice.map { |die, count| count * single_die_score(die) }.sum
end
same, rest = split_dice(dice)
set_score = same.empty? ? 0 : get_set_score(same)
set_score + get_rest_score(rest)
end
# other code
end
, यह और भी स्पष्ट है कि get_rest_score() और get_set_score() पद्धतियों में लपेटा जाता है स्कोर (के तर्क रखने के लिए होना चाहिए) ही:
इसके बजाय, मैं इस को पसंद करते हैं शुरू कर एक ही अमूर्त स्तर, हैश आदि
नोट के साथ कोई दखल है कि तकनीकी रूप से आप कॉल स्कोरिंग # get_set_score और स्कोरिंग # get_rest_score, लेकिन इस मामले में यह बुरा शैली IMO होगा सकता है, क्योंकि अर्थ की दृष्टि से वे के लिए सिर्फ निजी तरीके हैं एकल विधि स्कोर()
तो, इस संरचना के साथ आप स्कोरिंग # स्कोर के बाहर परिभाषित किसी भी अन्य विधि को देखे बिना स्कोर() के पूरे कार्यान्वयन को हमेशा पढ़ने में सक्षम हैं। हालांकि मुझे अक्सर इस तरह के रूबी कोड नहीं दिखते हैं, मुझे लगता है कि मैं इस संरचित शैली में आंतरिक तरीकों से अधिक रूपांतरित करने जा रहा हूं।
नोट: एक और विकल्प जो साफ दिखता नहीं है लेकिन नाम संघर्षों के मुद्दे से बचाता है, केवल लम्बास का उपयोग करना है, जो रूबी में घूमने से आसपास है। उदाहरण का उपयोग करना, यह
get_rest_score = -> (dice) do
dice.map { |die, count| count * single_die_score(die) }.sum
end
...
set_score + get_rest_score.call(rest)
यह नहीं के रूप में सुंदर है में बदल जाते हैं होगा - कोई कोड को देखकर आश्चर्य हो सकता है क्यों इन सभी lambdas, जबकि भीतरी तरीकों का उपयोग कर सुंदर आत्म दस्तावेज़ीकृत है। मैं अभी भी सिर्फ lambdas की तरफ झुकना चाहता हूं, क्योंकि उनके पास मौजूदा विवादों के संभावित संभावित नामों को लीक करने का मुद्दा नहीं है।
रूबी डेवलपर्स के छोटे समुदाय में मुझे लगता है। – zengr
क्या आप जानते हैं कि एक बार जब आप 'outer_method' कहते हैं, तो कोई भी' inner_method' कह सकता है? –