/ / क्या तरीकों को रूबी में उदाहरण चर को संशोधित करना चाहिए? - माणिक

क्या रूबी में इंस्टेंस चर को संशोधित करना चाहिए? - माणिक

मैं रूबी में एक कंपाइलर लिख रहा हूं, और मेरे पास कई कक्षाएं हैं जहां इंस्टेंस विधियाँ उदाहरण के चर को संशोधित करेंगी। उदाहरण के लिए, मेरा लेक्सर (वह भाग जो कोड में टोकन पाता है), इस तरह से काम करता है:

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 एक कार्यात्मक उपयोगिता वर्ग है या यदि इसके उदाहरणों को स्टेटफुल होना चाहिए।