[linux-l] Java Code erklaehrt

Ivan Villanueva iv at artificialidea.com
Do Sep 22 17:36:36 CEST 2005


On Thu, Sep 22, 2005 at 12:43:02AM +0200, Oliver Bandel wrote:
> > interface Func { int operation(int i1, int i2) ; }
> > class Sum implements Func { int operation(int i1, int i2) { return i1 + i2 ; }
> > class Pro implements Func { int operation(int i1, int i2) { return i1 * i2 ; }
> 
> Und wie benutzt man das nun?

Func aFunction = new Sum() ;
aFuntion.operation(1,2) ;

aFunction = new Pro() ;     // result is 3
aFunction.operation(1,2) ;  // result is 2

Eine "Func" kann jetzt als Parameter von einer Funktion benutzt werden, oder
auch als Wiedergabe. Ein Sum is ein Func, ein Pro ist auch ein Func.
 
 
 
> > Object example(Func f, int a, int b) {
> >     if ((f instanceof Sum) && (a ==b)) return new Pro() ;
> >     return f.operation(a,b) ;
> > }


> Das gibt wirklich die Funktion zurück?
> Was soll das mit dem "return new Pro()"?

Ein Objekt, und eine Pro (erzeugt mit "new Pro()") ist ein Objekt. Aber auch
eine Zahl ist ein Objekt. In Java sind alle Objekte.

> Warum fragst Du auf a==b ab?
Mach kein Sinn. Bloedes Beispiel von mir.
Die Funktion "example" gibt entweder ein neues Objekt zurueck (wenn f vom
Typ Sum ist, und a = b), oder es gibt ein neues Objekt vom Typ Integer.

> Wieso ein Produkt dann zurückgeben?
> Verstehe den Code nicht.
Wie gesagt, es ist bloed. Ich wollte nur klahr stellen, dass alles geht.
 
> > > Also Funktionen eine Funktion als Übergabeparameter geben?
> > Auch. Z.B. eine Collection<Func>
> Was ist das?

Eine Gruppe von Funcs. Es koennen z.B. 4 Sums und 3 Procs sein.
 
> > Genau. Es gibt Einschränkungen die C++ nicht hat, aber dafür ist einfacher und,
> > was mir sehr wichtig ist, es ist schnell, Programme von anderen zu verstehen.
> 
> Spricht eher für Haskell oder OCaml, oder? ;-)

Ja, wenn es nicht aus 20000 Zeilen besteht.
 
> > Code-reuse ist auch eine Stärke von Java. Es gibt domains; packages; classes;
> > und public, friendly und private methods and fields.
> 
> Aha. Das geht über Klassen hinaus, wie das zusammen gefasst wird?

Alles von mir ist in com.artificialidea (domain).
Wenn ich ein paar Klassen ueber Logic schreiben will, tue ich sie in package
com.artificialidea.logic
Z.B. die Klasse com.artificialidea.logic.PLSentence
kann verschiedene Methoden oder Variable haben. Sie koennen zugaenglich fuer
alle sein, nur fuer andere Klasse in logic, etc.
 
 
> > (Entschuldigung, ich kenne die Wörter auf Deutsch nicht.)
> 
> kein Problem. Vielleicht sogar besser in der Original-Sprache. ;-)
:-)
 
> > > Funktoren:
> > > Man hat ein Modul mit allgemeiner Implementierung (z.B.
> > > Balanced Tree). Man will dies auf einen speziellen Datentyp
> > > hin spezialisieren.
> > > Dann definiert man die speziellen Funktionen in einem eigenen
> > > Modul, setzt den Funktor auf die beiden Module an und hat als
> > > Ergebnis ein neues Modul!
> > > 
> > > Sozusagen ein Modul als Parameter eines anderen zur Erstellung eines
> > > weiteren.
> > > 
> > > Extrem geniales Feature! :)
> > 
> > Weiß nicht genau was gemeint ist. :-(
> 
> 
> Man hat z.B. ein Modul Set in der OCaml-Standardlib.
> Das bietet Sets an, implementiert als "balanced binary trees".
> Das Modul bietet eine "Funktion" Make, die ein Funktor ist.
> 
> Der Funktor bekommt als Argument ein eigens ersteltes Modul,
> dessen Interface einen Typ "t" und eine Funktion "compare"
> enthalten muß. Die Funktion compare muß den Typ
> t -> t -> int
> haben.

Aha. In Java implementiertst Du eine Function:
public int compare(Objekt o)
die wird automatisch von viele andere Klassen benutzt, wenn sie Objekte deiner
Klasse sortieren wollen.

[code Beispiel]
> Keine Objekte sind notwendig, um die Set-Funktionalität
> zu bieten und zu kapseln.

Ich habe mich aber daran gewoehnt, in Objekten zu denken. Das macht das
Programmieren langsammer, aber einfacher. Das ist in eine der Staerke von Java:
man behaelt den Ueberblick, wenn alle Objekte mit lange Namen sind.

> Das kann man alles schon zur Laufzeit festlegen, da spart Overhead.
> Und IMHO ist es auch viel angenehmer so. :)

Ich bin beeindruckt.


> > > lex/yacc? javacc?
> > > 
> > > Wo ist da der Zusammenhang?
> > Ich dachte lex/yacc ist so eine Art parser generator. Sorry.
> 
> Ja, stimmt ja auch.
> Und ich dachte, javacc ist der eigentliche Java-Compiler.

:-)
 
 
Gruß,
Iván



Mehr Informationen über die Mailingliste linux-l