मैं इस कोड में भाग गया:

class Foo < Bar
  SM_CONSTANT = { 'a' => 'A', 'b' => 'B' }.freeze
  private_constant :SM_CONSTANT

  private

  def some_constant
    SM_CONSTANT
  end

मैं निजी विधि में निजी स्थिरांक को समाहित करने के उद्देश्य का पता नहीं लगा सकता। ऐसा क्यों करूंगी मैं?

2
DumbQuestions 26 फरवरी 2019, 18:55

1 उत्तर

सबसे बढ़िया उत्तर

private_constant का कारण अन्य कोड को सीधे स्थिरांक तक पहुंचने से रोकना है।

some_constant आज स्थिरांक लौटा सकता है, लेकिन वह ऐसा करने के लिए बाध्य नहीं है। यदि प्रोग्रामिंग-दर-अनुबंध तो उस रूप में हैश वापस करने के लिए बाध्य है, जिसकी उत्पत्ति अप्रासंगिक है।

उदाहरण के लिए, आपके पास आज वह कोड है, लेकिन कल के बारे में यह क्या होगा:

class Foo < Bar
  SM_CONSTANT = {
    a: { name: 'A', priority: 2 },
    b: { name: 'B', priority: -1 }
  }.freeze
  private_constant :SM_CONSTANT

private
  def some_constant
    SM_CONSTANT.map { |k,o| [ k.to_s, o[:name] ] }.to_h
  end
end

जहां आंतरिक पूरी तरह से बदल गए हैं लेकिन बाहरी कोड में कुछ भी नहीं है, वही कॉल समान परिणाम उत्पन्न करते हैं। इसलिए इनकैप्सुलेशन महत्वपूर्ण है। यह आपको अन्य चीजों को तोड़ने के बारे में खुद के बारे में चिंता किए बिना किसी विशेष संदर्भ में कोड को पुनरावृत्त और पुन: कार्य करने की स्वतंत्रता देता है।

यदि कोड को सीधे SM_CONSTANT एक्सेस किया जाता है तो इस नई संरचना को स्वीकार करने के लिए इसे फिर से लिखना होगा।

2
tadman 26 फरवरी 2019, 16:18