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