Re: Fragen zum Konstruktordesign.

Mauricio Fernández <[email protected]> Sun, 6 Apr 2003 13:00:12 +0200
Newsgroups gmane.comp.lang.ruby.german
Message-ID <[email protected]>
On Sun, Apr 06, 2003 at 10:50:33AM +0200, [email protected] wrote:
> > Private Methoden können mit obj.send(:meth,*params) aufgerufen werden.
> Ich blicke das so langsam. __send__ und send sind Methoden von Object. Da alle 
> neuen Klassen immer Object als Elternklasse haben, hat auch meine Klasse 
> diese beiden Methoden. Ich rufe mit send also keine private Methode auf. send 
> ruft dann aus dem Obeject die private Methode auf. Bis hierhin alles klar.
> ABER:
> 
> Warum gibt es dann ueberhaupt private methoden, wenn ich sie doch mit send 
> umgehen kann?

Es gibt viele Dinge in Ruby, die von matz absichtlich "schwer" gemacht
wurden, aber fast nichts, das man überhaupt nicht tun kann.
Wie gewönhlich geht es hier um "Stil". Ruby verbietet dem Programmierer
nicht, private Methoden aufzurufen. Stattdessen "ratet" es ihm, das nicht
zu machen. Anders wäre dumm, weil es unmöglich ist, das Verbot strikt zu
halten, denn es gibt so viele Möglichkeiten...

batsman@kodos:/tmp$ expand -t2 a.rb
class A
  def foo
    puts "bin privat, kann aber aufgerufen werden"
  end
  private :foo
end

a = A.new
b = a.dup
# jetzt versuchen wir, A#foo zu benutzen
# gibt ja viele Möglichkeiten..

a.instance_eval { foo }

class << a
  def callfoo(*args)
    foo *args
  end
end

a.callfoo

class A
  def callfoo(*args)
    foo *args
  end
end

b.callfoo
batsman@kodos:/tmp$ ruby a.rb
bin privat, kann aber aufgerufen werden
bin privat, kann aber aufgerufen werden
bin privat, kann aber aufgerufen werden
 
Wollten wir das wirklich verbieten, wäre es nötig,
 * alle Klassen zu schliessen. Besonders Class, Module und Object...
 * mehrere Methoden zu löschen: Object.instance_eval,
   Module#module_eval (#class_eval), ...
 * keine singleton Methode zu haben :( 

Object#send ist hässlich genug, dem Programmierer davon abzuraten, es zu benutzen, 
wenn es nicht *wirklich* notwendig ist. Und dann wird es ganz absichtlich
gemacht: niemand wird private Methoden züfällig aufrufen.

Ein anderes Beilspiel solches Stiles wäre ObjectSpace.define_finalizer:
es wird klar, matz ist der Meinung, dass man "finalizers" normalerweise
nicht braucht :)


-- 
 _           _                             
| |__   __ _| |_ ___ _ __ ___   __ _ _ __  
| '_ \ / _` | __/ __| '_ ` _ \ / _` | '_ \ 
| |_) | (_| | |_\__ \ | | | | | (_| | | | |
|_.__/ \__,_|\__|___/_| |_| |_|\__,_|_| |_|
	Running Debian GNU/Linux Sid (unstable)
batsman dot geo at yahoo dot com

* JHM wonders what Joey did to earn "I'd just like to say, for the record,
  that Joey rules."
	-- Seen on #Debian