यहां समस्या का एक आदर्श उदाहरण है: Classifier gem breaks Rails।मैं रुबी में रक्षात्मक रूप से प्रोग्राम कैसे कर सकता हूं?
** मूल प्रश्न: **
एक बात है कि मुझे एक सुरक्षा पेशेवर के रूप में चिंताओं कि रूबी जावा के पैकेज-गोपनीयता की एक समानांतर नहीं है। यही कारण है, यह वैध रूबी नहीं है:
public module Foo
public module Bar
# factory method for new Bar implementations
def self.new(...)
SimpleBarImplementation.new(...)
end
def baz
raise NotImplementedError.new('Implementing Classes MUST redefine #baz')
end
end
private class SimpleBarImplementation
include Bar
def baz
...
end
end
end
यह वास्तव में फू :: BarImpl की बंदर-पैचिंग को रोकने के लिए सक्षम होने के लिए अच्छा होगा। इस तरह, पुस्तकालय पर भरोसा रखने वाले लोग जानते हैं कि किसी ने इसके साथ गड़बड़ नहीं की है। कल्पना कीजिए कि किसी ने आप पर एमडी 5 या SHA1 के कार्यान्वयन को बदल दिया है! मैं इन कक्षाओं पर freeze
पर कॉल कर सकता हूं, लेकिन मुझे इसे क्लास-दर-श्रेणी आधार पर करना है, और यदि मैं लोड ऑर्डर के बारे में सावधान नहीं हूं, तो मैं अपने आवेदन को सुरक्षित करने से पहले अन्य स्क्रिप्ट उन्हें संशोधित कर सकता हूं।
जावा रक्षात्मक प्रोग्रामिंग के लिए कई अन्य टूल प्रदान करता है, जिनमें से कई रूबी में संभव नहीं हैं। (जोश ब्लोच की एक अच्छी सूची के लिए पुस्तक देखें।) क्या यह वास्तव में एक चिंता है? क्या मुझे सिर्फ शिकायत करना बंद करना चाहिए और हल्के वजन के लिए रूबी का उपयोग करना चाहिए और "उद्यम-तैयार" समाधानों की आशा नहीं करना चाहिए?
(और नहीं, कोर कक्षाएं रूबी में डिफ़ॉल्ट रूप से जमे हुए नहीं कर रहे हैं नीचे देखें :)
require 'md5'
# => true
MD5.frozen?
# => false
यह काफी समान नहीं है, लेकिन यह बहुत अच्छी तरह से काम करता है। तो बस उन्हें परिभाषित करने के बाद कक्षाओं को ठंडा कर देता है। आपको अभी भी नेमस्पेस अव्यवस्था मिलती है, हालांकि ... –