Tomasz Wegrzanowski wrote:
> [snip]
> So I think it would be good idea to have method visibility controls
> removed because:
> * They do not fit Smalltalk-style OO, so removing them would make
> everything simpler
> * We get very limited benefit from them due to lack of C++/Java-style
> features like per-class namespaces for private methods (or even
> instance variables), and ability to call private methods of other
> objects of the same type
> * They make metaprogramming, unit testing etc. more difficult
> * They provide very limited control over visibility
> * Very simple Ruby metaprogramming gives us much more powerful private
> variables anyway.
> * I think it's unlikely for current visibility control system to lead
> to any cool things. As far as I can tell it was never used for
> implementing any magic. There is no obvious way to add any features
> (even to get them to the level of that metaprogramming snippet)
> without greatly complicating the language.
> * Ruby 2 is exactly the right time for doing such changes
At times I have had such thoughts too. After all Ruby is largely a
Document and Test oritented language b/c of it's high degree of
dynamicisim. There is at least one feature of the private/protected vs.
public system that is valuable though: you can catch public calls via
method_missing even when there are private/protected methods defined.
Eg.
class X
def method_missing( name ); name; end
private
def bird; "hoot!"; end
end
x = X.new
x.bird #=> "bird"
x.send(:bird) #=> "hoot!"
I only recently came to understand this myself and it made a big
difference in how I handled certain usecases of method_missing. Unless
you see a better way to hadle this, then I think the private/protected
vs. public distiguish it useful.
As a side note, I sure would like to see class/module local methods
(not part of inheritance chain) if possible.
T.