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