Re: Fragen zum Konstruktordesign.
Mauricio Fernández <[email protected]> Fri, 28 Mar 2003 11:02:11 +0100
| Newsgroups | gmane.comp.lang.ruby.german |
|---|---|
| Message-ID | <[email protected]> |
On Fri, Mar 28, 2003 at 10:30:21AM +0100, [email protected] wrote: > Hallo Leute. > > Kann mir jemand ein paar Fragen zum Klassendesign bzgl. des Konstruktors > beantworten. > > Ich bin gerade dabei ein DB-Frontend zu schreiben. Es soll erstmal eine > einfache Abbildung von Tabellen auf Objekte sein. Weiterhin moechte ich > gerne vor dem Benutzer die Tabellenschluessel verbergen. > > Daher habe ich 'initialize' mit nur mit Daten-Argumenten gebaut. Die Tabellen > beinhaltet aber noch einen Primary Key und einen Foreign Key. > > Soweit so gut. Nun kann ich neue Objekte erzeugen und auch speichern. > > Jetzt zum Problem. Ich moechte gerne eine Klassenmethode haben, mit der > ich ein Ojekt erzeuge. Das soll allerdings nicht 'new' sein. (Es ist ja > auch nicht 'neu' :-). 'load' waere ne gute Idee :-). Ich kann aber leider > von Klassenmethoden nicht auf private Attribute zurückgreifen. 'new' kann > ich auch nicht nehmen, da es nur die Daten als Parameter aufnimmt und > nicht die beiden Schluessel. > > Wie also designe ich diese Klasse? > In Java oder cpp schreibe ich zwei Konstruktoren, wie aber macht man das in Ruby? batsman@tux-chan:/tmp$ expand -t 2 x.rb class Foo def initialize(*data) #... end def init(schluessel) @schluessel = schluessel end private :init class << self def load(irgendetwas) obj = Foo.new #... obj.send(:init, irgendetwas) obj end end end class Foo2 LOAD = :LOAD DEFAULT = :DEFAULT def initialize(*args) if args[-1] == LOAD args.pop # etwas mit args machen @etwas = args[0] else args.pop if args[-1] == DEFAULT # etwas anderes end end def Foo2.load(param) Foo2.new(param, LOAD) end end foo = Foo.new foo2 = Foo.load("schluessel") p foo, foo2 foo3 = Foo2.load("bar") foo4 = Foo2.new("baz") p foo3, foo4 batsman@tux-chan:/tmp$ ruby x.rb #<Foo:0x401a2988> #<Foo:0x401a28d4 @schluessel="schluessel"> #<Foo2:0x401a2848 @etwas="bar"> #<Foo2:0x401a2834> -- _ _ | |__ __ _| |_ ___ _ __ ___ __ _ _ __ | '_ \ / _` | __/ __| '_ ` _ \ / _` | '_ \ | |_) | (_| | |_\__ \ | | | | | (_| | | | | |_.__/ \__,_|\__|___/_| |_| |_|\__,_|_| |_| Running Debian GNU/Linux Sid (unstable) batsman dot geo at yahoo dot com Actually, typing random strings in the Finder does the equivalent of filename completion. -- Discussion on file completion vs. the Mac Finder