PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perfekte Programmiersprache??


Minos
2005-01-07, 13:39:58
Also, da es hier ne Menge Leute gibt die mehr Programmiererfahrung haben als ich würde es mich mal interessieren:

-welche Merkmale hat für euch die perfekte Programmiersprache (Syntax, Funktionsumfang,Hochsprache, Funktional oder Objektorientiert, Plattformunabhängigkeit, etc. ),
-welche Programmiersprache kommt dem für euch am nächsten und
-kann es eine Sprache "für alles" geben oder wird braucht man immer für verschiedene Zwecke verschiedene Sprachen?

MadMan2k
2005-01-07, 13:57:38
-kann es eine Sprache "für alles" geben oder wird braucht man immer für verschiedene Zwecke verschiedene Sprachen?
nein - "the right tool for the right job", was die ersten beiden Fragen obselet machen dürfte.

Persönlich würde ich aber gerne öfter XML Implementierungen sehen :)

pajofego
2005-01-07, 13:58:33
Diese hier (http://www.digitalmars.com/d/comparison.html) kann verdammt viel! :biggrin:

Pinoccio
2005-01-07, 14:04:44
Diese hier (http://www.digitalmars.com/d/comparison.html) kann verdammt viel! :biggrin:
Naja, ob zB "Operator Overloading (http://www.digitalmars.com/d/operatoroverloading.html)" zu einer perfekten Programmiersprache gehört? Für mich eher nicht.

mfg Sebastian

HellHorse
2005-01-07, 14:15:36
Diese hier (http://www.digitalmars.com/d/comparison.html) kann verdammt viel! :biggrin:
Man sollte es mal auf den aktuellen Stand bez. Java bringen. Ansonsten ist es doch eher drauf ausgeleget anhand von Featurechecklisten die Vorteile von D ggü den anderen hervorzuheben.
Und so krass unterschiedlich sind dann C++, C#, Java und D auch nicht.

Minos
2005-01-07, 14:23:52
@MadMan2k:

kann man diese "jobs" in eine überschaubare anzahl aufteilen und diesen bereichen ein bisschen bestimmte optimale eigenschaften der programmiersprache zuordnen?

mir würde zum beispiel sql als ziemlich praktische sache für datenbank-abfragen einfallen...

HellHorse
2005-01-07, 14:28:08
Naja, ob zB "Operator Overloading (http://www.digitalmars.com/d/operatoroverloading.html)" zu einer perfekten Programmiersprache gehört? Für mich eher nicht.

mfg Sebastian
Für mich schon, aber bitte so wie es in Smalltalk gelöst ist.
Eigentlich ist für mich Smalltalk schon verdammt nahe am Ideal. Wenn es doch bloss verbreiteter wäre. Aber es kann natürlich auch sein, dass irgendwann irgendjemand mit etwas viel besseren kommt woran im Moment noch niemand denkt.

Eine Programmiersprache für alles kann es nicht geben.

Pinoccio
2005-01-07, 14:41:10
Für mich schon, aber bitte so wie es in Smalltalk gelöst ist.
Hm, habe keine Ahnung von Smalltalk, aber nachdem was Wikipedia schreibt, sieht es für mich eher so aus, als wenn es gar keine Operatoren im eigentlichen Sinne gibt, da alles Objekte sind.

mfg Sebastian

Ganon
2005-01-07, 15:28:19
Objective-C ist wunderschön. :) Stammt von Smalltalk ab.

MadMan2k
2005-01-07, 16:16:34
@MadMan2k:

kann man diese "jobs" in eine überschaubare anzahl aufteilen und diesen bereichen ein bisschen bestimmte optimale eigenschaften der programmiersprache zuordnen?

mir würde zum beispiel sql als ziemlich praktische sache für datenbank-abfragen einfallen...
ja, für große größere Datenmengen, die im komplexen Zusammenhang stehen ist SQL super.
Was ist aber, wenn du nur einen Text speichern willst?
Dann ist eine einfache Textdatei besser geeigntet - diese kannst du dann z.B. mit C++ lesen und schreiben, wenns auf Performance ankommt, oder dazu Java verwenden, wenns systemübergreifend funktionieren soll, oder... ;)

Xmas
2005-01-07, 16:17:23
Smalltalk hat IMO eine furchtbare Syntax. Ist ja schön und gut, alles auf eine handvoll Grundkonstrukte reduzieren zu wollen, aber nicht wenn dabei die Lesbarkeit so darunter leidet.

Und Operator Overloading gehört für mich ganz bestimmt dazu. Warum auch nicht?

MadMan2k
2005-01-07, 16:26:51
Und Operator Overloading gehört für mich ganz bestimmt dazu. Warum auch nicht?
wenn der Compiler deswegen länger braucht um den Text zu parsen und ich es nicht in meinem Projekt verwenden musste, dann ist es verschwendete Zeit. :)

Xmas
2005-01-07, 16:43:56
wenn der Compiler deswegen länger braucht um den Text zu parsen und ich es nicht in meinem Projekt verwenden musste, dann ist es verschwendete Zeit. :)
:confused:
Warum sollte der Compiler länger brauchen?

Wishnu
2005-01-07, 16:47:01
Beim Thema C muss ich immer an das hier denken: Erfinder von Unix und C geben zu: Alles Quatsch (http://hbar.physik.uni-oldenburg.de/jens/text/msg00001.html) :D

EgonOlsen
2005-01-07, 16:59:35
Diese? (http://www.muppetlabs.com/~breadbox/bf/) :biggrin:

Minos
2005-01-07, 17:19:57
@wishnu: das ist nicht wahr oder? ;D

MadMan2k
2005-01-07, 17:56:00
:confused:
Warum sollte der Compiler länger brauchen?
schon allein deswegen, weil mehr Code da steht :D

nein, sollte nur ein Beispiel sein, dass man nicht unbedingt alles reinpacken sollte, was rein geht.

zeckensack
2005-01-07, 18:03:21
Overloading muss sein.
Funktionszeiger finde ich auch sehr wichtig. Die kann man natürlich oft durch andere Sprachfeatures (Interfaces, Funktionsobjekte ...) ersetzen, sodass direkter Support von Funktionszeigern nicht immer zwingend notwendig ist.

HellHorse
2005-01-07, 18:43:07
Hm, habe keine Ahnung von Smalltalk, aber nachdem was Wikipedia schreibt, sieht es für mich eher so aus, als wenn es gar keine Operatoren im eigentlichen Sinne gibt, da alles Objekte sind.
... und alles Nachriten sind.
Operatoren sind gewöhnliche binäre Nachrichten. Kein keyword, keine Magie wie spezieller lookup oder Operatorpräzedenz (kannst du eine Tabelle mit allen Operatorpräzedenzen in C++ erstellen, ohne nachzuschlagen).
Smalltalk hat IMO eine furchtbare Syntax. Ist ja schön und gut, alles auf eine handvoll Grundkonstrukte reduzieren zu wollen, aber nicht wenn dabei die Lesbarkeit so darunter leidet.
Ok, jetzt ernsthaft, was ist lesbarer

aDictionary at: aKey put: aValue

oder

aDictionary.atPut(aKey, aValue)

oder

aDictionary[aKey] = aValue

Natürlich kann man mit Smalltalk wie in jeder Sprache (sogar Deutsch) unlesbaren Code schreiben.

Minos
2005-01-07, 18:53:46
das ist genau das worauf ich mit meiner frage hinauswollte :)
kann mir jemand erklären warum c und ähnliche sprachen so erfolgreich sind?

turbokitty2k
2005-01-07, 18:54:06
Also ich würde jedem Phyton empfehlen.

Phyton hat eine unschlagbare Syntax, und ist Objektorientiert. Meiner Meinung nach eine der besten Sprachen.

Ganon
2005-01-07, 19:54:50
Ok, jetzt ernsthaft, was ist lesbarer
...
Natürlich kann man mit Smalltalk wie in jeder Sprache (sogar Deutsch) unlesbaren Code schreiben.

Jups. Das merkt man nachher auch bei mehreren Übergabewerten.

Habe ich z.B.

[image setSizeX:1024 setSizeY:768 setColorBits:32 posX:1 posY:3 posZ:6]

ist doch auch bei weitem besser nutzbar im Quellcode. Wie oft hängt man bei C(++)-Funktionen im Header oder in der Doku um zu wissen was wo hinkommt, wenn man eine neue Library benutzt.

Klar das man die Übergabewerte nicht mit wert1: wert2: usw. bezeichnen sollte. ;)

Trap
2005-01-07, 19:57:08
Ja Python gefällt mir auch, wird aber nicht Phyton geschrieben :D

Perfekte Programmiersprache: Lisp ist IMO recht nah dran.

Operator overloading ist ein Muss, sonst kann man Mathe nicht lesbar implementieren und das muss eine perfekte Sprache natürlich auch können.

Coda
2005-01-07, 19:58:10
kann mir jemand erklären warum c und ähnliche sprachen so erfolgreich sind?
Weil sie zuerst da waren und man damals noch hardwarenahe Programmierung lieber hatte.
So erkläre ich mir das zumindest. C ist heute eigentlich für ziemlich alle Probleme die ungünstigste Lösung. (C++ ist etwas anderes!)

Perfekte Programmiersprache: Lisp ist IMO recht nah dran.
Wollte ich mir auch schon immer mal anschauen, aber leider gibt es anscheinend keine richtig guten IDEs dafür :/
Wir müssen grad Scheme machen an der Uni, das ist ja ein Lisp Dialekt, wenn auch ziemlich kastriert.

Trap
2005-01-07, 20:17:11
IDE für Lisp ist sehr oft Emacs. Ich muss aber zugeben, dass ich Lisp selbst auch noch nicht ernsthaft genutzt hab. Ich lös das meiste mit C++ weil ich da fast ohne über C++ nachzudenken die Probleme lösen kann. Java nehm ich nur wenn ich es muss (Uni).

Scheme hat ein etwas anderes Macrosystem und eine deutlich kleinere Standardbibliothek. Die Sprache selbst unterscheidet sich nicht groß.

Grund für C: Die APIs von sehr vielen Bibliotheken und allen verbreiteten Betriebssystem sind in C definiert. Das macht C immernoch attraktiv.

Pinoccio
2005-01-07, 20:26:33
Operator overloading ist ein Muss, sonst kann man Mathe nicht lesbar implementieren und das muss eine perfekte Sprache natürlich auch können.
Gegen Operator Overloading:
List liste=new List();
Object a=new Object();
liste=liste+a;
Wo wurde das Object eingefügt? Vorne? Hinten? Irgendwo?
Und Mathe kann man auch ohne Op.ov. ordentlich lesbar implementieren. Speziell bei Strukturen, die mehr können als Ringe. Und zB für Normen oder Skalarprodukte kann man ja (in den mir bekannten Programmiersprachen) auch nicht schreiben
n=|a|; oder m=||a|| oder s=<a,b> sondern verständlicher n=norm(2,a) (euklidische Norm), oder m=norm(Norm.INFINITY, a) (Unendlichkeitsnorm) oder s=skalarProduct(a,b) etc pp
Aber jeder wie er will.

mfg Sebastian

grakaman
2005-01-07, 20:38:50
Jups. Das merkt man nachher auch bei mehreren Übergabewerten.

Habe ich z.B.

[image setSizeX:1024 setSizeY:768 setColorBits:32 posX:1 posY:3 posZ:6]

ist doch auch bei weitem besser nutzbar im Quellcode. Wie oft hängt man bei C(++)-Funktionen im Header oder in der Doku um zu wissen was wo hinkommt, wenn man eine neue Library benutzt.

Klar das man die Übergabewerte nicht mit wert1: wert2: usw. bezeichnen sollte. ;)

Sowas ist bei einer entsprechenden IDE kein Thema.

Ganon
2005-01-07, 20:48:34
Sowas ist bei einer entsprechenden IDE kein Thema.

Tja. Wenn man eine gute IDE hat..., aber auch nicht in allen Fällen. Wenn du was anpassen willst, möchte ich nicht unbedingt immer wieder die Code-Assis aufrufen...

grakaman
2005-01-07, 20:53:59
Tja. Wenn man eine gute IDE hat..., aber auch nicht in allen Fällen. Wenn du was anpassen willst, möchte ich nicht unbedingt immer wieder die Code-Assis aufrufen...

Wenn ich eine Methode aufrufe, dann erscheint in einem Popup welche Argumente die Methode erwartet inkl. Datentypen und jedes Argument, dass ich eingebe, wird dann fett hervorgerufen. Ich sehe auch, ob es Überladungen gibt und kann dort hin springen. Also damit habe ich bisher wirklich noch nie Probleme gehabt.

Trap
2005-01-07, 21:40:29
Gegen Operator Overloading:
List liste=new List();
Object a=new Object();
liste=liste+a;
Wo wurde das Object eingefügt? Vorne? Hinten? Irgendwo?

Das ist nur ein Argument gegen falsche/mehrdeutige Bennennungen. Ein Operator ist einfach eine 2-stellige Operation die von der Syntax bevorzugt behandelt wird.
Ich sehe keinen Grund diese Funktionen anders zu behandeln als jede andere.

liste.add(a) <=> liste+a

Trap
2005-01-07, 21:54:52
Benannte Parameter sind nötig wenn man Operationen mit sehr vielen Variablen hat, aber viele davon sinnvolle default-Werte haben. Also bei beschreibendem Programmierstil.

Stellt euch einfach mal HTML vor bei dem man die Attribute jedes Tags in einer Reihenfolge aufzählen muss nur um bei der 13. möglichen Option den Defaultwert zu überschreiben.

Pinoccio
2005-01-07, 21:57:11
Das ist nur ein Argument gegen falsche/mehrdeutige Bennennungen.In der Tat. Aber Operator overloading stellt mit einem Zeichen eine komplexen Sachverhalt dar. Das mag bei (int) + (int) gehen, aber bei (Object) + (Object) wird es schwierig. Wie würdest du denn den Zusammenhang Liste + Object benennen? In Java gibt es da mindestens 3 Funktionen, die alle was anderes machen, die man aber mit "+" umschreiben könnte. Welche man dann nimmt, hängt dann vom persönlichen Geschmack ab. Das erschwert dann aber die Wiederverwendbarkeit. http://java.sun.com/j2se/1.5.0/docs/api/index.html?java/util/List.html
Ein Operator ist einfach eine 2-stellige Operation die von der Syntax bevorzugt behandelt wird.
Ich sehe keinen Grund diese Funktionen anders zu behandeln als jede andere.
liste.add(a) <=> liste+aInwiefern bevorzugt behandelt?

mfg Sebastian

Trap
2005-01-07, 22:12:58
In der Tat. Aber Operator overloading stellt mit einem Zeichen eine komplexen Sachverhalt dar. Das mag bei (int) + (int) gehen, aber bei (Object) + (Object) wird es schwierig. Wie würdest du denn den Zusammenhang Liste + Object benennen? In Java gibt es da mindestens 3 Funktionen, die alle was anderes machen, die man aber mit "+" umschreiben könnte. Welche man dann nimmt, hängt dann vom persönlichen Geschmack ab. Das erschwert dann aber die Wiederverwendbarkeit.
Aha. Dein Argument ist also "Welche man dann nimmt, hängt dann vom persönlichen Geschmack ab. Das erschwert dann aber die Wiederverwendbarkeit. "? Gilt das nicht genauso für Namen die aus Text bestehen?

Inwiefern bevorzugt behandelt? Bevorzugt in der Bedeutung "gesondert, speziell, extra".

zeckensack
2005-01-07, 22:45:44
In der Tat. Aber Operator overloading stellt mit einem Zeichen eine komplexen Sachverhalt dar. Das mag bei (int) + (int) gehen, aber bei (Object) + (Object) wird es schwierig. Wie würdest du denn den Zusammenhang Liste + Object benennen? In Java gibt es da mindestens 3 Funktionen, die alle was anderes machen, die man aber mit "+" umschreiben könnte. Welche man dann nimmt, hängt dann vom persönlichen Geschmack ab. Das erschwert dann aber die Wiederverwendbarkeit.Mal 'ne Adaption deines Beispiels:
List liste;
Object a;
liste.do_something(o);Ist das jetzt leichter verständlich, oder eher doch nicht? Ich jedenfalls glaube kaum dass "do_something" mehr Aussagekraft hat als "+" ... eher noch weniger. Es liegt an dir, eine Form zu wählen, die zu verstehen ist.
Wenn du nun der Meinung bist, dass Addition nicht unbedingt eindeutig ist, wenn es um Listen geht, dann kann ich dir durchaus zustimmen. Dann benutze halt nicht "+", sondern irgendwas sinnvolles, wie zB append() oä.

Für andere Zwecke sind arithmetische Operatoren genau richtig. Man denke nur mal an Vektoren und Matrizen. Da bin ich dann froh, dass ich die Operatoren überladen kann, anstatt mich mit anderem Kruscht herumzuärgern.

grakaman
2005-01-07, 22:51:49
Stellt euch einfach mal HTML vor bei dem man die Attribute jedes Tags in einer Reihenfolge aufzählen muss nur um bei der 13. möglichen Option den Defaultwert zu überschreiben.

Dann liegt das einfach an falscher Implementierung, dazu gibt es Überladungen, wenn nicht jeder Parameter benötigt wird. In einer Methode alle unzähligen Parameter auf NULL Werte überprüfen und ggf. Defaultwerte zuzuweise halte ich imo für schlechten Stil.

Pinoccio
2005-01-07, 22:53:46
Aha. Dein Argument ist also "Welche man dann nimmt, hängt dann vom persönlichen Geschmack ab. Das erschwert dann aber die Wiederverwendbarkeit. "? Gilt das nicht genauso für Namen die aus Text bestehen?
Nicht so sehr. Beispiel Liste (warum auch immer):
- Funktionen sind (1) einfügen an erster Stelle, (2) einfügen an beliebiger Stelle und (3) einfügen an letzter Stelle.
Brauche ich (3) am häufigsten, so ist "+"=amEndeEinfügen(Object). Brauche ich beim nächsten mal aber (1), so ärgert mich das.
Ich habe prinzipiell nichts gegen Operator Overloading. Aber ich habe ohne coden gelernt und halte daran fest.

Bevorzugt in der Bedeutung "gesondert, speziell, extra".
Verstehe ich immer noch nicht ganz.
Angenommen ich habe Oo und add="+", wo liegt dann für den Compiler der unterschied zwischen l.add(object) und l=l+object?

mfg Sebastian

Pinoccio
2005-01-07, 23:02:10
Mal 'ne Adaption deines Beispiels:
List liste;
Object a;
liste.do_something(a);Ist das jetzt leichter verständlich, oder eher doch nicht? Ich jedenfalls glaube kaum dass "do_something" mehr Aussagekraft hat als "+" ... eher noch weniger. Es liegt an dir, eine Form zu wählen, die zu verstehen ist.
Wenn du nun der Meinung bist, dass Addition nicht unbedingt eindeutig ist, wenn es um Listen geht, dann kann ich dir durchaus zustimmen. Dann benutze halt nicht "+", sondern irgendwas sinnvolles, wie zB append() oä.

Für andere Zwecke sind arithmetische Operatoren genau richtig. Man denke nur mal an Vektoren und Matrizen. Da bin ich dann froh, dass ich die Operatoren überladen kann, anstatt mich mit anderem Kruscht herumzuärgern.
Das do_something(Object) nicht sinnvoll ist, ist natürlich klar. (abgesehen, das do_something in der von mir präferierten Sprache keine gute Bezcihnung ist ;-)

Wenn es um Vektoren und Matritzen geht, steht für mich als unwissenden die Frage, ob ich einen Operator so wie eine Funktion mit unterschiedlichen Parametern aufrufen kann.
vector1=scalar*vector2 oder vector1=vector2.scalarMultiplikation(scalar)
vector1=vector2*vector3 oder vector1=vector2.crossProdukt(vektor3)
vector1=vector2*vector3 oder vector1=vector2.scalarMuliplikation(vector3)

mfg Sebastian

/edit: für Minos: Addition für Matritzen ja, aber nicht Multiplikation für Vektoren

Minos
2005-01-07, 23:24:50
bei matrizen ist die addition aber doch relativ klar, wenn man ordentlich kommentiert sollte das ganze auch gut verständlich sein.

imho ein feature das man benutzen kann aber nicht dringend braucht, spricht aber nichts dagegen wenn es dabei ist...

zeckensack
2005-01-08, 00:19:33
Wenn es um Vektoren und Matritzen geht, steht für mich als unwissenden die Frage, ob ich einen Operator so wie eine Funktion mit unterschiedlichen Parametern aufrufen kann.
vector1=scalar*vector2 oder vector1=vector2.scalarMultiplikation(scalar)
vector1=vector2*vector3 oder vector1=vector2.crossProdukt(vektor3)
vector1=vector2*vector3 oder vector1=vector2.scalarMuliplikation(vector3)

mfg SebastianDas musst du dir schon aussuchen. Ich mag diese Variante:

class
Vec4
{
<...>
public:
float operator* (const Vec4& rhs)const; //ja, geht ...
Vec4 operator* (float s)const; //... beides!
Vec4 cross(const Vec4& rhs)const; //"*" ist schon belegt, also anders
};

//Boni
inline Vec4
cross(const Vec4& a,const Vec4& b)
{
return(a.cross(b));
}

inline Vec4
scalar_mul(const Vec4& a,const Vec4& b)
{
return(a*b);
}

inline Vec4
mul(const Vec4& a,float b)
{
return(a*b);
}

inline Vec4
mul(float a,const Vec4& b)
{
return(b*a);
}
So deklariert (und implementiert) ist * das Skalarprodukt, und cross das Kreuzprodukt. Wenn du's gerne anders hättest, oder gleich ganz ohne Operatoren, steht es dir frei die Sprachfeatures entsprechend (bzw garnicht) zu nutzen. Du könntest in dem Fall auch auf die Bonus-Funktionen zurückgreifen, wenn du mal Angst hast durcheinander zu kommen.
scalar_mul(Vec4,float) und mul(Vec4,Vec4) wird dir der Compiler nicht erlauben.

Nächste Übung:
float operator* (const Vec4& rhs)const;
Vec4 operator* (float s)const;
const Vec4& operator *=(const Vec4& rhs);
const Vec4& operator *=(float s);Wie löst du das möglichst elegant ohne überladene Operatoren?

Xmas
2005-01-08, 00:35:41
schon allein deswegen, weil mehr Code da steht :D
Mit Operator Overloading steht in der Regel weniger Code da, auch wenn es sich nur um einen Unterschied von ein paar Zeichen handelt. Schließlich ist "add" länger als "+". Für den Compiler ist der Unterscheid aber praktisch nicht vorhanden.

nein, sollte nur ein Beispiel sein, dass man nicht unbedingt alles reinpacken sollte, was rein geht.
Da hast du recht. Aber Operator Overloading gehört IMO zum sinnvollen Syntactic Sugar. Und nichts weiteres ist es ja, da man praktisch dieselben Ergebnisse mit etwas umständlicherer Syntax auch erreicht.

Pinoccio
2005-01-08, 00:56:17
Nächste Übung:
float operator* (const Vec4& rhs)const;
Vec4 operator* (float s)const;
const Vec4& operator *=(const Vec4& rhs);
const Vec4& operator *=(float s);Wie löst du das möglichst elegant ohne überladene Operatoren?
Der (nichtzitierte Teil) leuchtet ein. Ich werde, wie schon gesagt, wohl auch in Zukunft ohne Operator Overloading weitermachen.
Was die Übung betrifft, so fehlt mir die intime Kentnis der C(?)-/C++(?)-/Whatever-Syntax.
Da ich, wie schon erwähnt, nur JAVA behersche, würde ich entweder eine Klasse Vektor4 (oder, als Mathestudent, eher VektorN und dann spezialisieren ;-) ) selber schreiben, oder auf eine schon vorhanden zurückgreifen. (zb eine von denen: http://math.nist.gov/javanumerics/#libraries ).

mfg Sebastian


/btw: ist man jetzt ein Freak/Nerd/Geek, weil man Freitag Nacht über sowas diskutiert?

zeckensack
2005-01-08, 01:17:13
Was die Übung betrifft, so fehlt mir die intime Kentnis der C(?)-/C++(?)-/Whatever-Syntax.Zeile eins und zwei deklarieren die "normale" Multiplikation, sodass Code der Form a=b*c kompiliert werden kann.
Zeile drei und vier erlauben a*=b. Damit speichert man das Ergebnis direkt in a, ohne ein zusätzliches Objekt anzulegen.
Diese Form von Operatoren gibt's in Java auch.

Zusätzlich wird in C++ nach Konvention noch eine Referenz auf das Ergebnis zurückgegeben, um verkettete Zuweisungen wie a=b=c*=d; zu erlauben. AFAIK ist auch das in Java verfügbar.
Da ich, wie schon erwähnt, nur JAVA behersche, würde ich entweder eine Klasse Vektor4 (oder, als Mathestudent, eher VektorN und dann spezialisieren ;-) ) selber schreiben, oder auf eine schon vorhanden zurückgreifen. (zb eine von denen: http://math.nist.gov/javanumerics/#libraries ).Worauf ich eigentlich hinauswollte, ist die Frage wie du diese Funktionen, die das Ergebnis direkt dem referenzierten Objekt zuweisen, sinnvollerweise nennen würdest.
a.add(b) <=> add(a,b) <=> a.add_to_self(b) ...?

Ist IMO auch ziemlich hässlich :)

/btw: ist man jetzt ein Freak/Nerd/Geek, weil man Freitag Nacht über sowas diskutiert?Klar.

Xmas
2005-01-08, 01:17:30
... und alles Nachriten sind.
Operatoren sind gewöhnliche binäre Nachrichten. Kein keyword, keine Magie wie spezieller look oder Operatorpräzedenz (kannst du eine Tabelle mit allen Operatorpräzedenzen in C++ erstellen, ohne nachzuschlagen).
Auch wenn es nicht an mich ging: Nicht vollständig - aber dort wo ich mir unsicher bin, nehme ich Klammern, womit der Code immer noch gut lesbar ist.

Ok, jetzt ernsthaft, was ist lesbarer

aDictionary at: aKey put: aValue

oder

aDictionary.atPut(aKey, aValue)

oder

aDictionary[aKey] = aValue

Natürlich kann man mit Smalltalk wie in jeder Sprache (sogar Deutsch) unlesbaren Code schreiben.
Ich bin hier natürlich durch Gewöhnung voreingenommen, und tendiere zur dritten Variante, aber wenn ich versuche objektiv zu sein, beschreibt keine Variante intuitiv den Sachverhalt. In natürlicher Sprache ausgedrückt sieht es anders aus. Bei Smalltalk stören hier vor allem die Doppelpunkte, weil zwischen at und aKey weniger Trennugn ist als zwischen aKey und put.

Gegenbeispiel: Arithmetische Ausdrücke. Da gibt es auch eine "Standard-Präzedenz".

Pinoccio
2005-01-08, 01:27:24
Worauf ich eigentlich hinauswollte, ist die Frage wie du diese Funktionen, die das Ergebnis direkt dem referenzierten Objekt zuweisen, sinnvollerweise nennen würdest.
a.add(b) <=> add(a,b) <=> a.add_to_self(b) ...?
Ist IMO auch ziemlich hässlich :)Danke für die Erklärung.
In Java ist es IMHO etwas uneinheitlich gelöst. Ich würde add(a,b) bevorzugen, da wird dann der binäre Charakter der Funktion am besten deutlich. Sozusagen die Präfix-Notation, obwohl dei Infix-Variante a.add(b) eher der Umgangs-Mathematik entspricht.
Klar.Na dann sind wir uns ja einig.
Gute Nacht!

mfg Sebastian

Pinoccio
2005-01-08, 01:34:34
Ok, jetzt ernsthaft, was ist lesbareraDictionary at: aKey put: aValueoderaDictionary.atPut(aKey, aValue)oderaDictionary[aKey] = aValueDie JAVA-Variante (http://java.sun.com/j2se/1.5.0/docs/api/index.html?java/util/Dictionary.html): aDictionary.put(aKey, aValue) ;-)

mfg Sebastian

Xmas
2005-01-08, 02:05:41
Dann liegt das einfach an falscher Implementierung, dazu gibt es Überladungen, wenn nicht jeder Parameter benötigt wird. In einer Methode alle unzähligen Parameter auf NULL Werte überprüfen und ggf. Defaultwerte zuzuweise halte ich imo für schlechten Stil.
Das musst du ja gar nicht selbst tun. Schau dir mal die Implementierung in Python an.
Benannte Parameter gehören jedenfalls für mich auch zur "perfekten Programmiersprache", woran Python für mich am nächsten kommt.

Gnafoo
2005-01-08, 02:31:27
Mir gefällt irgendwie ruby sehr.
Probiere damit seit einigen Tagen rum und man kommt imho sehr schnell zu brauchbaren Ergebnissen.

cya DerTod

grakaman
2005-01-08, 09:35:53
Das musst du ja gar nicht selbst tun. Schau dir mal die Implementierung in Python an.
Benannte Parameter gehören jedenfalls für mich auch zur "perfekten Programmiersprache", woran Python für mich am nächsten kommt.

Das sehe ich anders. Aber ich persönlich habe auch festgeltellt, dass hier die Anforderungen zwischen Leuten mit einer rudimentären oder gar keiner IDE und Leuten mit einer spezifischen IDE vollkommen anders sind. Das zieht sich auch durch bestimmte architektonische Merkmale. Wo z.B. eine Gruppe eben alles manuell coded, aus den unterschiedlichten Gründen, verwendet man z.B. für den Datenzugriff gerne bestimmte Helferklassen (z.B. SProc Name + Array an Parametern, dass an eine Methode übergeben wird), die das Problem auf eine gewisse Weise kapselt. Andere hingegen verwenden z.B. Codeassistenten oder generische OR Lösungen. Letzteres ist zwar technisch interessant und mit einer IDE auch in null-komma-nix implementiert, was man ja eigentlich mit dem Lösungsansatz auch möchte. Aber eben nur mit einer IDE oder entsprechenden Assistenten, denn wenn man alles manuell coden müsste, wäre die Implementierung von komplexen Entitäten, die ja wiederum Collections sein können, Collections enthalten können etc. etc. ebenfalls sehr aufwendig und würde vom Aufwand z.B. eine Generierung durch Codeassistenten nicht outperformen. Es führen also imo viele Wege nach Rom, die aus verschiedenen Sichtweisen entstanden sind. So sehe ich das jedenfalls auch für die Sprachen.

Xmas
2005-01-08, 11:16:01
Das sehe ich anders. Aber ich persönlich habe auch festgeltellt, dass hier die Anforderungen zwischen Leuten mit einer rudimentären oder gar keiner IDE und Leuten mit einer spezifischen IDE vollkommen anders sind.
Klar macht das einen Unterschied in der Art wie man Code schreibt. Aber ich denke dass benannte Parameter auch mit einer hilfreichen IDE die Lesbarkeit erhöhen (sofern dadurch die Zeilen nicht ausufernd lang werden und die Namen gut gewählt sind), und auch den Implementierungsaufwand in manchen Fällen reduzieren können, wo man sonst unzählige Überladungen bräuchte (oder wegen möglicher gleicher Signatur gar nicht wie gewollt überladen kann).

Es führen also imo viele Wege nach Rom, die aus verschiedenen Sichtweisen entstanden sind. So sehe ich das jedenfalls auch für die Sprachen.
Das sehe ich auch so, deswegen sehe ich die Option, benannte Parameter zu benutzen, als sehr hilfreich an.

HellHorse
2005-01-08, 14:21:50
Auch wenn es nicht an mich ging: Nicht vollständig - aber dort wo ich mir unsicher bin, nehme ich Klammern, womit der Code immer noch gut lesbar ist.
Und jemand, der deinen Code liest, ist vielleicht woanders unsicher. Smalltalk eliminiert diese Unsicherheit auf einfache Weise.

Ich bin hier natürlich durch Gewöhnung voreingenommen, und tendiere zur dritten Variante,

Die JAVA-Variante: aDictionary.put(aKey, aValue) ;-)
Poll :ugly:

aber wenn ich versuche objektiv zu sein, beschreibt keine Variante intuitiv den Sachverhalt. In natürlicher Sprache ausgedrückt sieht es anders aus.
Ok, anderer Vorschlag:
aDictionary add: aKey -> aValue
Fügt einem Dictionary ein key-value-mapping hinzu.

@Der Tod
Ja ruby ist nett, besonders die inneren Iteratoren von Smalltalk gefallen ;)

ScottManDeath
2005-01-08, 14:48:40
Bezüglich benannter Parameter:

Ich bin der Meinung dass diese sinnvoll sind, allerdings nur wenn man Methoden/Funktionsaufrufe mit vielen Parametern hat. Jedoch hat man meistens im Design was falsch gemacht wenn man mehr als 5 bis 6 Parameter benötigt. Dann sollte man sich überlegen ob man da nicht einiges besser verteilen und geschickter Refaktorieren sollte.

Default werde bei Operationen sind praktisch, allerdings kann man wie so oft viele Dinge über den praktischen Rahmen hinaus missbrauchen. Wie z.B. durch das schon erwähnte Prüfen ob Parameter 0 sind. In C# z.B. gibt es sie nicht (lag wohl daran dass man dafür keine Metadaten nutzen wollte), dann muss man in den sauren Apfel beißen und eben einige Überladungen machen. Dies ist auch eine Möglichkeit Programmierer anzuhalten um unnützen und redundanten Code zu vermeiden. ;)

Bezüglich Operator Overloading:

Ist etwas was ich zur Zeit bei C# vermisse, allerdings kommt es in C# 2.0. Kann auch missbraucht werden, wie z.B. die << und >> iostream operatoren in der C++ Standardbibliothek. Ich finde es z.B. bei Java irgendwie "C like" dass ich für einen Stringvergleich eine Methode compareTo(....) aufrufen muss und ich nicht das intuitivere == verwenden kann.

In C++ ist die Überladung des Zuweisungs Operators = eine praktische Möglichkeit um tiefe Kopien von Objekten syntaktisch so zu ermöglichen wie man sie von BuiltIn Typen wie int und float her gewöhnt ist.

IMHO sollte der Sinn in jeder Softwarentwicklung darin liegen ohne viel Kosten Programme zu erstellen die Probleme lösen. Jegliche Zeit und Kostenersparnis ist dabei zu nutzen, also das oftzitierte "right tool for the right job". Deswegen bin ich ein starker Verfechter von IDEs und anderen CASE Tools die mich beim Programmieren unterstützten. Man hat ja nicht umsonst höhere Abstraktionen wie z.B. UML entwickelt um im Endeffekt das mühsame und fehlerbehaftete Zeilentippen zu verringern (durch Code Generation). Außerdem ist z.B. ein GUI Editor auch ein CASE Tool, es wird wohl kaum jemand freiwillig eine GUI von Hand coden wollen ( Gott sei Dank muss ich mich nicht mehr mit der MFC rumärgern :) )


Ach ja, die ideale Programmiersprache macht aus meinen wirren Vorstellungen über die Funktionsweise und das GUI innerhalb von ein paar Minuten das Programm ;)

Trap
2005-01-08, 15:05:22
Dann liegt das einfach an falscher Implementierung, dazu gibt es Überladungen, wenn nicht jeder Parameter benötigt wird. In einer Methode alle unzähligen Parameter auf NULL Werte überprüfen und ggf. Defaultwerte zuzuweise halte ich imo für schlechten Stil.
Überladung als Ersatz für benannte Parameter funktioniert nicht. Wenn eine Funktion 13 Strings erwartet und für 10 davon defaultstrings eingesetzt sind wie willst du das in Überladungen verwandeln?


Ich bin der Meinung dass diese sinnvoll sind, allerdings nur wenn man Methoden/Funktionsaufrufe mit vielen Parametern hat. Jedoch hat man meistens im Design was falsch gemacht wenn man mehr als 5 bis 6 Parameter benötigt. Dann sollte man sich überlegen ob man da nicht einiges besser verteilen und geschickter Refaktorieren sollte.

Bei beschreibendem Programmierstil ergibt sich sowas automatisch (siehe HTML). Man kann natürlich Argumentieren, dass man so nicht Programmieren sollte. Meine Antwort: Warum nicht?
Fehlende Keywordparameter in der Programmiersprache sind ein überzeugender Grund. Ein anderer fällt mir nicht ein.

zu Code Generation: Das ist mit Lisp-Macros besser möglich als mit jedem externen Tool.

Pinoccio
2005-01-08, 16:03:12
[Operator Overloading ...] Ich finde es z.B. bei Java irgendwie "C like" dass ich für einen Stringvergleich eine Methode compareTo(....) aufrufen muss und ich nicht das intuitivere == verwenden kann.
In C++ ist die Überladung des Zuweisungs Operators = eine praktische Möglichkeit um tiefe Kopien von Objekten syntaktisch so zu ermöglichen wie man sie von BuiltIn Typen wie int und float her gewöhnt ist.Iritierend finde ich (zumindest für den Anfänger) das in JAVAString s1="Hallo"; String s2="Hallo"; zu s1==s2 gleich wahr führen kann.
Und den Zuweisungsoperator = zu überladen ist insofern schwierig, als das er ja schon eine Funktion hat. Wenn ich nun also clone(Object) als "=" definiere, was passiert mit der eigentlichen Funktionalität von "=". Und wo ich schon dabei bin, es gibt auch Situationen, wo ein "==" bei Objekten sinnvoll sein kann, wenn es nämlich darum geht, zu prüfen, ob zwei Referenzen das selbe Objekt referenzieren. Und da es keine Zeiger gibt in JAVA ...
Wobei ich ja leider zugeben muss, daß in JAVA zumindest für Strings der Operator "+" ja überladen ist. Macht man speicher- oder zeitkritische Sachen, sollte man davon allerdings tunlichst die Fingerlassen.

mfg Sebastian

grakaman
2005-01-09, 19:25:12
Überladung als Ersatz für benannte Parameter funktioniert nicht. Wenn eine Funktion 13 Strings erwartet und für 10 davon defaultstrings eingesetzt sind wie willst du das in Überladungen verwandeln?


Wenn ich so viele Default Werte hätte bzw. es sich um optionale Werte handelt, würde ich diese überhaupt nicht der Methode übergeben, sondern als Eigenschaften in dem Objekt implementieren.

Xmas
2005-01-09, 21:19:38
Das hielte ich für schlechten Stil, wenn die Parameter mit dem Objekt nichts zu tun haben und nur zu dieser einen Methode gehören.

Demirug
2005-01-09, 21:33:47
Das hielte ich für schlechten Stil, wenn die Parameter mit dem Objekt nichts zu tun haben und nur zu dieser einen Methode gehören.

Richtig, nur sollte man sich IMHO bei einer Methode mit 13 Parametern schon die Frage stellen ob da nicht schon was falsch läuft.

Entweder macht eine solche Methode (mit Untermethode) etwas sehr ausfwendiges so das es sinnvoll ist für diesen Vorgang eine eigene Klasse abzustellen oder die Parameter haben eine Beziehung zueinader die es rechtfertigt sie in eigenen Klassen/Strukturen zusammen zu fassen.

Bei mir würde jedenfalls eine Methode mit 13 Parameter nicht durch ein Codereview kommen. Mir wird da schon bei 6 oder 7 anders zumute.

Senior Sanchez
2005-01-09, 21:43:07
Richtig, nur sollte man sich IMHO bei einer Methode mit 13 Parametern schon die Frage stellen ob da nicht schon was falsch läuft.

Entweder macht eine solche Methode (mit Untermethode) etwas sehr ausfwendiges so das es sinnvoll ist für diesen Vorgang eine eigene Klasse abzustellen oder die Parameter haben eine Beziehung zueinader die es rechtfertigt sie in eigenen Klassen/Strukturen zusammen zu fassen.

Bei mir würde jedenfalls eine Methode mit 13 Parameter nicht durch ein Codereview kommen. Mir wird da schon bei 6 oder 7 anders zumute.


bei mir nicht anders und wenn dann noch nen haufen zyklische referenzen dazu kommen, wirds echt haarig.


mfg senior sanchez

Pinoccio
2005-01-09, 21:47:56
Richtig, nur sollte man sich IMHO bei einer Methode mit 13 Parametern schon die Frage stellen ob da nicht schon was falsch läuft.

drawIrregular17gon(int x1, int y1, int x2,int y2 ... , int x17, int y17)
;-)

mfg Sebastian

Demirug
2005-01-09, 22:02:20
drawIrregular17gon(int x1, int y1, int x2,int y2 ... , int x17, int y17)
;-)

mfg Sebastian

Würde ich als Array von Punktstrukturen übergeben.

Pinoccio
2005-01-09, 22:40:20
Würde ich als Array von Punktstrukturen übergeben.
drawIrregular17gon(new int[]{1,2,3,4,5,.....,33,34});
In JAVA geht das, ein Array voller Integer! ;-)
Also im Prinzip hast du ja recht. (ist ja auch dein Job)

mfg Sebastian

ScottManDeath
2005-01-10, 02:02:10
In dem Buch "Refactoring" von Martin Fowler stehen die ganzen 'smells of bad code ' ;) drinne und wie man sie beheben kann. Unter anderem auch wie das von Demirug schon angedeutete Ersetzen von zu vielen Parametern durch extra Parameter Objekte....

Vielleicht auch in Zusammenhang mit "Design Patterns" von Erich Gamma und
"Code Complete 2" von Stephe McDonnell.

Kann ich nur empfehlen! Hängt aber auch davon ab wieviel Zeit und Geld man in seine 'Ausbildung' stecken möchte/kann.

Trap
2005-01-10, 19:15:57
Design Patterns hab ich gelesen und im Schrank stehen. Refactoring hab ich mal 2 Stunden in der Uni-Bibliothek gelesen und ich hab auch schon ab und zu die entsprechende Funktion von Eclipse benutzt. Ich argumentier nicht aus Unwissenheit. Höchstens aus mangelnder Praxiserfahrung.

Mal ein Link zur "Gegenseite": http://c2.com/cgi/wiki?AreDesignPatternsMissingLanguageFeatures

Grade bei der Objekterzeugung fehlen Keyword-Parameter am meisten. Ich finde es hässlich erst ein Objekt erstellen zu müssen, dann 3-4 Werte drin zu ändern und es erst dann gebrauchsfertig zu haben. Man muss sich einen Namen einfallen lassen (auch wenn man das Objekt nur als Parameter braucht), für jeden Parameter den man ändern will muss man den Namen wiederholen und man kann die Objekte nicht am Aufrufsort erzeugen.