मैं रूबी में एक कंपाइलर लिख रहा हूं, और मेरे पास कई कक्षाएं हैं जहां इंस्टेंस विधियाँ उदाहरण के चर को संशोधित करेंगी। उदाहरण के लिए, मेरा लेक्सर (वह भाग जो कोड में टोकन पाता है), इस तरह से काम करता है:
class Lexer
attr_accessor :tokens
def initialize(input)
@input = input
@tokens = nil
end
def lex!
# lex through the input...
# @tokens << { lexeme: "if", kind: :if_statement }
@tokens
end
end
lexer = Lexer.new("if this then that")
lexer.lex! # => [ { lexeme: "if", kind: :if_statement }, ... ]
lexer.tokens # => [ { lexeme: "if", kind: :if_statement }, ... ]
क्या यह एक मान्य प्रथा है? या, मैं एक दृष्टिकोण का उपयोग करना चाहिए जहां तरीके (जैसे) #lex
) इनपुट में लेते हैं और उदाहरण चर को संशोधित किए बिना परिणाम लौटाते हैं?
class Lexer
def initialize
end
def lex(input)
# lex through the input...
# tokens << { lexeme: "if", kind: :if_statement }
tokens
end
end
lexer = Lexer.new
lexer.lex("if this then that") # => [ { lexeme: "if", kind: :if_statement }, ... ]
उत्तर:
उत्तर № 1 के लिए 1या तो आपके डिजाइन लक्ष्यों के आधार पर मान्य है और कैसे लेक्सर का उपयोग किया जाएगा।
क्या आप वास्तव में जरुरत एक उदाहरण चर जिसमें टोकन हैं? जैसे, क्या लेक्सर को उन्हें किसी और चीज़ के लिए इस्तेमाल करने की ज़रूरत है?
यदि नहीं, तो मैं "उदाहरण चर का उपयोग नहीं करने की ओर झुकाव करता हूं, और आपके पास इस कारण से कम है (" उदाहरण के लिए इस चर को अन्य सिस्टम इंटरैक्शन द्वारा बदल दिया जाएगा ", उदाहरण के लिए)।
उत्तर № 2 के लिए 1
यह किसी उदाहरण को बदलने के लिए वैध हैआपके उदाहरण के तरीकों में से एक में चर (इसलिए कि वे पहले स्थान पर क्यों मौजूद हैं)। डेटा के कुछ टुकड़े को एक उदाहरण चर में रखा जाना चाहिए या नहीं, हालांकि, इस बात पर निर्भर करता है कि आपके उदाहरण का उपयोग कैसे किया जाना है।
आप उदाहरण के चर के रूप में सोच सकते हैं राज्य आपके उदाहरण के लिए, और आपके उदाहरण के रूप में ए राज्य प्रबंधक आपके उदाहरण चर के लिए। अगर आपके पास एक है Counter
कक्षा, उदाहरण के लिए, के साथ increment
तथा decrement
विधियां, आपके काउंटर का वर्तमान मूल्य स्पष्ट रूप से राज्य का एक टुकड़ा होगा, और ये विधियां इसे बदल देगी।
अंगूठे का एक अच्छा नियम है: आगे और पीछे डेटा पास करने जा रहे हैं? यदि आप हैं, तो यह शायद एक उदाहरण चर होना चाहिए। यदि आप नहीं हैं, तो यह वास्तव में आपके उदाहरण का हिस्सा नहीं है, और इसे इसके बाहर रखा जाना चाहिए। आपके मामले में :
lexer = Lexer.new
tokens = lexer.lex("my statement")
lexer.do_something_else tokens # if you do that, then lexer should be aware of the tokens and keep it in an instance variable, if not: why bother ?
निष्कर्ष के रूप में, यह सब निर्भर करता है कि क्या Lexer
एक कार्यात्मक उपयोगिता वर्ग है या यदि इसके उदाहरणों को स्टेटफुल होना चाहिए।