# Bin ich zu Blöd dafür



## tayyfan (20. Juni 2004)

Hallo an alle,

Ist es wirklich schwer c++ zu lernen,
ich habe das buch c++ in 21 tagen, aber ich glaube langsam das ich
das nicht in 21 tagen lernen kann,.
mein erstes programmm (Hello Wolrd) habe ich geschafft, und
was auch die main()  funktion cout u.s.w bewirkt habe ich auch gemeistert
bin schon bei den versch. variablentypen tag 3red 
meine fragen an euch ist es wirklich in 21 tage wie das buch verspricht c++ zu erlernen(ich weiss das es nich möglich ist aber zumindest die grundlagen)?
muss ich all das im kopf haben oder reicht es das ich  weiss was die einzelne befehle bewirkt
und gibt es ein buch wo ich  die funktionen nachschlagen kann

danke für die netten antworten


----------



## SMiller (20. Juni 2004)

Es ist deswegen "schwer" zu erlernen, weil die Sprache eine sehr komplexe Logik hat, es werden sehr viele Möglichkeiten geboten die man auch falsch einsetzen kann. Man muss wirklich C++ denken, um die Sprache zu verstehen. Das Buch was du liest taugt nix! Eine Empfehlung wäre "C++ lernen und profissionell anwenden" was für Anfänger sehr fein ist. Danach kannst du aber trotzdem kein C++, denn es enthällt verdammt viele Unterbereiche. In einem Anfängerbuch würde es dir den Kopf verwirren. Daher sollte man danach intensiver C++-Design und Techniken durchgehen, das Buch von dem Entwickler der Sprache "Die C++-Programmiersprache" ist praktisch die Bibel für C++-Freaks.
Daher sage ich es dir bereits jetzt: es wird einige Jahre in Anspruch nehmen, bis du reines C++ verstehst. (abgesehen von WinAPI oder sonstigen betriebssystemabhängigen Sachen)


----------



## tayyfan (20. Juni 2004)

Die C++-Programmiersprache ist das auch ein buch um all die funktionen nachzuschlagen was welches code was bewirkt
also vorerst werde ich trotz allem das buch mal durchlessen 
welches buch sollte ich mir besorgen
C++ lernen und profissionell anwenden das als erstes 
und dann
C++-Programmiersprache 
wieviel zeit sollte ich mich mit  büchern auseinander setzten, 
um  die sprache c++  zu verstehen am tag 1 stunde oder so
also da muss ich noch einiges lernen bin erst am anfang..
danke dir für deine schnelle antwort


----------



## Dudadida (20. Juni 2004)

Um Gottes Willen! Sorry SMiller, aber was hast du denn da für Buchkosten . Ich hab noch nie im Leben ein C oder C++ Buch gesehen und kann's trotzdem. Prinzipiell findest du im Internet mehr als du brauchst und mit ein bisschen gesundem Menschenverstand kommt man auch selbst auf das meiste, selbst wenn's länger dauert. Dein 21-Tage Buch würde ich nicht für diesen Zeitraum verwenden. Wahrscheinlich ist es relativ oberflächlich, deswegen in 21 Tagen möglich durchzuarbeiten, bis du es kannst, wirst du länger brauchen. Deswegen nutze die Beispiele die dir das Buch bereits bietet und forsche nach und versuche  sie nachzuvollziehen, aber spar dein Geld und kauf nicht noch mehr Bücher, die die Welt nicht braucht.
Ach so tayfan, wenn du dir pauschal ne Zeit setzt in der du das machen möchtest, klingt das für mich sehr gezwungen, wenn etwas gezwungen ist, macht man es nicht gern, wenn man was nicht gern macht, lernt man es viel schlechter. Interesse muss da sein und am besten auch etwas Spaß daran (hab ich auch so ziemlich verloren, weshalb ich auch lieber Medizin studiere und nur noch fachübergreifend zum Programmieren greife). Ich weiß zwar nicht was du machst, aber wenn du das beruflich machst, bzw. studierst, dann solltest du dir überlegen, ob du das richtige machst.


----------



## SMiller (20. Juni 2004)

@Dudadida hmm, wie soll ich es dir sagen... hast du paar C++-Klassen oder Funktionen, die du selbst entwickelt hast? Man kann oft an dem Code-Design sehen, wie intensiv man sich mit C++ auseinander setzt, im Internet findet man etwas Vergleichbares wie "Die C++-Programmiersprache" nicht, da es einfach ein Buch und kein Tutorial oder Referenz ist, die im Net meistens veraltet sind (include <iostream.h>).
Eine Frage an dich: warum belegt ein virtueller Methoden-Zeiger mehr Speicher als ein Methoden-Zeiger? 

@tayyfan Um Gottes Willen! C++ ist kein VBasic oder was weiß ich was, "Funktionen nachschlagen" ist daher eine Beleidigung (ich meine nicht, dass man die STD-Bibliothek nicht kennen sollte). Eine Referenz brauchst du erstmal nicht, was wichtig ist sind die Möglichkeiten der Sprache, alles (cout, sin) gehört zu der Standardbibliothek von C++, beschäftige dich erstmal theoretisch mit den Sachen, was bringt es denn wenn man mit cout Text ausgibt und nicht weiß was es überhaupt ist/wie es geschrieben wurde (höchstens bei dem Überladen des <<-Operators hat man Probleme)? Das Buch für Anfänger was ich vorgeschlagen habe (C++lernen...) ist zwar teuer, aber wirklich gut!


----------



## Kachelator (20. Juni 2004)

SMiller, ich gebe dir recht. Bücher gehören auch meiner Meinung nach dazu. Für das Grundlagenverständnis ist ein von Kapitel zu Kapitel aufbauendes Buch wesentlich besser geeignet als das im Web  "erzwungene" Querbeet-Lesen. Hypertext hat sicher gewaltige Vorteile, aber manchmal lenken Links ab. Abgesehen davon hat ein Buch noch einen unschlagbaren Vorteil: Man kann darin Notizen machen!

<ot>
Aber eins wüsste ich gerne: 





> Eine Frage an dich: warum belegt ein virtueller Methoden-Zeiger mehr Speicher als ein Methoden-Zeiger?


  Das ist mir neu. Kannst du das mal erklären? Oder wo kann ich darüber mehr erfahren?
</ot>


----------



## tayyfan (20. Juni 2004)

danke erstmals für die antworten,
ist nicht so das ich irgendwie unter druck stehe,
das zu lernen.- 
ich mach das auch nicht beruflich,
nur so aus hobby weil micht das faszieniert und spass macht
bin halt etwas ungeduldig 
ab jetzt werde ich die sache mit geduld angehen, 
und es wird sich dann zeigen was daraus wird.
ihr habt mir geholfen danke......


----------



## Dudadida (20. Juni 2004)

Was soll denn der Quatsch, SMiller? Sieh dich im Forum um, wenn du Codebsp. von mir haben willst. Sind wir jetzt im Kindergarten und geben mit unserem Wissen an? Immerhin programmiere ich seit 8 Jahren, damit werde ich mir doch zumindest ein gewisses Maß an Kompetenz zuschreiben können. Deine Frage kann ich nicht beantworten, was aber keine Rolle spielt, weil mich die Antwort auch nicht interessiert. Im Gegenzug wirst du mir aber vermutlich auch nichts zur EKG Diagnostik sagen können (die natürlich nicht hier hergehört, womit sich die Sache mit dem "ich weiß mehr" aber wieder etwas relativiert, nicht).

Was die Sache mit den Homepages und Büchern angeht. Es gibt Seiten, bspw. die von Nehe zu OpenGL, die sind aktueller und besser als jedes Buch, das man zum Thema finden kann. Außerdem ist das Internet eine derart riesige Datenbank, dass man prinzipiell alles findet, wenn man nur genug sucht, mal davon abgesehen, dass das Internet auch alle Bereiche abdeckt und so viele Bücher kann man sich gar nicht kaufen. (Mal davon abgesehen, dass es die Bücher mitunter auch im semilegalen/illegalen Filesharing als eBooks findet). Die ganze Sache mit dem veralten ist darüber hinaus bei Büchern noch viel präsenter, immerhin kann eine Internetseite nochmal aktualisiert werden, mit nem Buch sieht's da ja eher schlecht aus. Mit den Notizen muss ich Kachelator aber recht geben, dass ist echt ein Nachteil, aber es gibt ja noch einen Drucker...


----------



## SMiller (21. Juni 2004)

Ich wollte nicht angeben. Ich wollte lediglich zeigen, dass es Bereiche gibt, die man nicht einfach mit irgendwelchen Tutorials im Internet abdecken kann. Weil es C++ ist! Dabei meine ich nicht etwas wie C++ Users Journal, sondern Tutorials von Leuten, die selbst nicht mehr Ahnung haben als der Leser. Dass dich die Antwort auf meine Frage nicht interessiert und du 8! Jahre programmierst wundert mich (ich programmiere vielleicht halb so lange wenn es hoch kommt, aber egal). Man kann 15 Jahre lang programmieren und es immer noch so schlecht wie im ersten Jahr  tun. Auf jeden Fall habe ich noch keinen guten C++-Programmierer getroffen, der ohne Fachliteratur zum Meister in seinem Fach wurde und da ist der Punkt, wo wir uns nicht einig sind. Und beim Programmieren sowie in der Medizin sollte man nach Wissen streben, weil man eben nie auslernt.

Für Leute, die sich für die Antwort interessieren: Methodenzeiger oder auch Methodenzeiger von virtuellen Methoden belegen nicht wie andere Zeiger (dazu gehören natürlich auch Funktionszeiger) 4 Bytes im Hauptspeicher, sondern mehr, um sich zu *kennzeichnen*. Eine Vererbung spielt dabei *auch* eine Rolle, aber hauptsächlich besteht der Unterschied zwischen einem Zeiger auf eine Funktion und einem Methodenzeiger.


----------



## Kachelator (21. Juni 2004)

SMiller, hast du da noch mehr Infos zu (ich meine einen Link)? (Hier zeigt sich dann die Stärke der Online-Information!)

Dudadida, du verwendest doch in deinem Medizinstudium sicher auch Bücher, oder? Ich gehe mal von "Ja" aus. Warum sollten Programmierer eher auf Bücher verzichten können? Die Onlinesachen von Nehe usw. sind grossartig, aber das sind Tutorials und Beispiele -- keine Versuche _Sprachgrundlagen_  zu vermitteln. Es gibt da überhaupt keinen Konflikt. Ich nehme ein Buch, um die Grundsätze zu verstehen; dann nehme ich etwas von Nehe (oder der MSDN, oder, oder... ), um Beispiele anzuschauen und/oder mich in neue Spezialgebiete einzuarbeiten.


----------



## Sicaine (21. Juni 2004)

@tayyfan also ich habs auch mit diesem buch probiert dann auf die seite gelegt für ein jahr weils nich ging und dann hat ich auch keine lust. Jetzt nach einem Jahr IT-Schule mit c++ und vorher in php oop gelernt und nur 30 minuten vom lehrer alles erklören lassen und voila ich kapiers! Wo war das problem? Diesse Buch macht zwar ne schritt für schirtt anleitung aber einfach zu sagen das is das und dort is das und das braucht man hier damit man weis was wo wann wo hinkommt, steht da nicht. Da steht am anfang nur diese doofe schritt für schritt anleitung. Die auch noch relativ lahm daherkommt.

Hm am besten lern zuerst bisl c++ mit konsole. Is zwar doof aber dann kannst in vc++ gleich mehr schreiben und bist nich so abhängig.und vorallem das oop solltes kapiert ham dann is es einfach. Weil ja button listenfield... objekte sind die eigenschaften ham und methoden...


----------



## SMiller (21. Juni 2004)

Ne, einen Link habe ich gerade leider nicht, aber probier's aus:

```
#include <iostream>
using namespace std;

void funk(); // Eine globale Funktion

class A { public: void funk(); /* Hier eine Methode */ };

int main()
	{
	cout << "Globaler Zeiger belegt: " << sizeof(&funk) << " Bytes" << endl;
	cout << "Methodenzeiger belegt: " << sizeof(&A::funk) << " Bytes" << endl;

	return 0;
	}

void funk() {}
void A::funk() {}
```
Ich glaube in dem Buch "Die C++ Programmiersprache" oder/und  in "Modernes C++ Design" müsstest du es allerdings finden.


----------



## Kachelator (21. Juni 2004)

Ja, das werde ich mal ausprobieren. Vielen Dank, und gute Nacht!


----------



## Dudadida (21. Juni 2004)

Doch prinzipiell bin ich der Meinung das Programmierer eher auf Bücher verzichten können, das liegt in der Sache an sich, weil man prinzipiell immer üben kann, weil die meisten immer einen PC zur Hand haben und das Internet auch viel bietet, auch viele Grundlagentutorials. Ich rate ja keinem von Büchern ab (vor allem am Anfang ganz praktisch, weil man weniger suchen muss), ich meine nur, es geht auch so (und mit Medizin lässt sich Info da überhaupt nicht vergleichen, weil bei ersterem ohne eine Unmenge von Büchern gar nix geht, nicht als Wertung betrachten, das ist einfach wie Apfel und Birne). Ach ja, SMiller, vor 8 Jahren war ich 12 und da habe ich nicht mit C angefangen und prinzipiell sehe ich das Programmieren auch nur als Weg um etwas umzusetzen, wobei ich mich stets nur mit Mechanismen befasst habe, die ich auch beim Programmieren brauche, bzw. natürlich mit der Art und Weise wie ein PC arbeitet. Aber diese Zeigersache ist doch super spezifisch, das hat doch nichts mit Programmieren an sich zu tun, das ist doch nur eine C++ interne eigene Konvention, die den Programmierer nur höchst beiläufig streift und deshalb auch nichts über dessen Qualifikation aussagt, wenn er davon nix weiß. Solche Konventionen gibt es schließlich hunderte in allen möglichen Sprachen. Aber klär uns doch mal auf, wie viel Bytes sind's denn und welcher Art ist die Zusatzinfo, die mitgespeichert wird.


----------



## SMiller (21. Juni 2004)

Man muss sowas nicht wissen, klar. Aber belastet es dich, wenn du weißt, wie der Compiler die Sache verwaltet, keine Neugier? 
Wieviele Bytes es sind? Bei mir sind es 12 auf dem 32--Bit System und dem Compiler von Borland. Welcher Art? kA, habe den Compiler nicht geschrieben.
Ich denke damit ist es gegessen, wer der bessere Programmierer ist ist mir egal, wir haben verschiedene Ansichten und das stört mich persönlich nicht.
Gute Nacht.


----------



## tayyfan (21. Juni 2004)

@Sicaine also jetzt habe ich mir mal vorgenommen das buch mal durchzulesen,
ich frage mich ob man dafür begabt sein muss um es zu begreifen
da schreibt mir das buch vor was konstanten sind (zwei arten literale und symbolische) wie man typedef gebrauchen kann u.s.w aber manchmal frage ich mich was ich damit anfangen kann....
ich will nur verstehen wie die c++ sprache funktioniert 
genau so denken wie die sprache 
ich bin schon bei tag 5 aber habe vielleicht mal tag 1 bis 3 verstanden
doch ich frage mich was ich damit anfangen soll 
naja muss mir einige bücher zulegen wie es aussieht...


----------



## Christian Fein (21. Juni 2004)

> _Original geschrieben von Dudadida _
> * wobei ich mich stets nur mit Mechanismen befasst habe, die ich auch beim Programmieren brauche, bzw. natürlich mit der Art und Weise wie ein PC arbeitet.
> *



Deine Einstellung ist komplett falsch und führt zu schlechter Software. 
Das Programmieren hört nicht beim schreiben richtiger Syntax auf, sondern fängt da gerade erst an. 
Ich habe 2 Bücherschränke voll mit Büchern, und das auch obwohl ich seid langer Zeit programmiere, und seid mehreren Jahren auch beruflich.
Ich kaufe/lese mir dennoch 2 Bücher pro Monat und werde wohl auch noch in 10 Jahren das so machen. 
Designpatterns, UML, Paradigma sind recht schwer erlernbar ohne richtige Literatur. 
SMiller hat zudem recht, mann *muss* zwar nicht wissen wie der Compiler funktioniert um 
Syntaxerror freie Programme zu erstellen, aber um performante und wartbare, portable Programme
zu erstellen ist es ein sehr wichtiges Wissen.



> _Original geschrieben von Dudadida _
> *
> Aber diese Zeigersache ist doch super spezifisch, das hat doch nichts mit Programmieren an sich zu tun, das ist doch nur eine C++ interne eigene Konvention, die den Programmierer nur höchst beiläufig streift und deshalb auch nichts über dessen Qualifikation aussagt, wenn er davon nix weiß.
> *



Das ist definitiv falsch. Zeiger sind nicht C++ spezifisch. Mann kommt an der Art wie Zeiger funktionieren, wie Refernezen funktionieren auch nicht dran vorbei wenn mann eine Sprache, ohne Zeiger, wie Java fortgeschritten programmieren will.
Obwohl ich C++ schon seid Jahren nicht mehr angefasst habe, und mich nur Java (Ruby und konsorten) widme, helfen mir die C++ Kentnisse die ich mir seinerzeit angelernt habe, um die JVM zu verstehen und performant zu programmieren, immer noch. Gerade jene Kentnisse die die Speicherverwaltung betreffen sind hierbei sehr wichtig.

Zum Threadstarter:



> ich frage mich ob man dafür begabt sein muss um es zu begreifen



Nö, ich habs doch auch begriffen  *soll eine aufmunterung sein*
Du brauchst nur eines ganz sicher, Geduld.



> da schreibt mir das buch vor was konstanten sind (zwei arten literale und symbolische) wie man typedef gebrauchen kann u.s.w aber manchmal frage ich mich was ich damit anfangen kann....



Das ist eine Frage, die auf eine ähnliche Art beantwortet werden kann, wie die oft im PHP Forum vorkommende Frage: Wozu Objectorientierung.
Mann muss bei prozedualer Programmierung erst an die Grenzen stossen, bei denen mann merkt das es schwer zu handlend wird um wirklich die Vorteiler OOP zu sehen. 
Genauso ist es die Sache der Konstanten.  Du wirst selber ein Stück Code schreiben, und dir auf die Schulter klopfen " jetzt hab ichs begriffen" 
Unter Java und Interfaces ist es ähnlich, die Sprüche die in Büchern stehen wie Interfaces geben Zusicherrungen das dies und jenes implementiert ist, sind zwar richtig aber nicht hilfreich. Dennoch kommt mann später an eine Stelle an der mann diese Eigenschafft zu schätzen weiss.



> ich bin schon bei tag 5 aber habe vielleicht mal tag 1 bis 3 verstanden
> doch ich frage mich was ich damit anfangen soll
> naja muss mir einige bücher zulegen wie es aussieht...



Das mit in 21 Tagen ist ein Titel. Gerade bei C++ ist es nicht einzuhalten mit dem Buch. 
Im übrigen finde ich das Buch recht ok, nur darfst du nicht erwarten das du in 21 Tagen fertig bist.
Kleiner Tip um jedes Kapitel zu verstehen, erst das Kapitel auf Teufel komm raus einfach mal an einem Abend durchlesen.
Am nächsten 1-2 Tage die Beispiel (jedes!) durcharbeiten, sprich abschreiben danach mit Buch und Erklärung im Debugger verfolgen (dabei gleich lernen den Debugger !richtig! zu nutzen). 
Ein Tag drauf würde ich nochmal ein eigenes Progrämmchen schreiben das auf dem im Kapitel vorgestelltem Wissen basiert.

Damit wärest du schon bei 4 Tage pro (Buchtag). Damit ändert sich der Title in C++ in 84 Tagen was auch schon etwas realistischer ist


----------



## Sicaine (21. Juni 2004)

Hm ich find Bücher auch wesentlich besser. Ok ich muss erst hinten reingucken oder das inhaltsverzeichniss bemühen aber es ist mir lieber. Auch kann ich dann im Bett noch lesen oder sonst wo und brauch keinen pc wenn mir was einfällt und ich nachschlagen will. 

Auch das mit dem String in c++ fand ich genial. Da sieht man doch erst wie eine porgramiersprache wirkich aufgebaut ist.

@tayyfan hm begabung? Ka denke aber schon dass du Logisch begabt sein solltest. Für mich wennichs einmal verstanden habe, is es nich mehr schwer. Einzige Problem: Wie icih neue Befehle methoden... lerne.  Das buch als Ebook is ganz lustig weil ich mir damit jetzt rausziehen kann was ich will, aber als Afnänger... vergiss das mit diesem buch. Terrashop hat ne menge und such dir mal ein 2 andere bücher. 
Und wie schon gesagt, fang erst mal mit c++ an und oder php wegen oop. Dann is es ein kinderspiel.

@dudaidais hm ich les auch as php-buch und weis dadurch was möglich ist! Ich kenn auch szepialfälle die ich jetzt zwar nich brauche, aber später mich nich mehr aufhalten werden.


----------



## Dudadida (21. Juni 2004)

@Christian Fein: Ich denke nicht, dass meine Einstellung da so falsch ist. Lies dir doch mal richtig durch, was ich geschrieben habe. Ich verweigere mich doch nicht dem Wissen, meine Meinung ist nur, dass man keine Bücher brauch, um sich das anzueignen. Turbo Pascal hatte ich mir mit 13 sogar ohne Internet beigebracht, nur mit der Hilfe, hat auch funktioniert (auch wenn es etwas länger gedauert hat). So soll man es aber gar nicht machen, ich rate lediglich dazu, sich gut zu überlegen, was man wirklich brauch, denn zwangsläufig führt überflüssiges Wissen dazu, dass man es wieder vergisst und erfahrungsgemäß triefen viele Bücher von Wissen das man schon hat oder nicht braucht und sich deshalb nicht merkt. Spezialwissen bekommt man vielleicht nur aus Büchern, dafür ist die "Qualitätskontrolle" des Internets zu schlecht (bzw. nicht vorhanden), aber es ging hier die ganze Zeit darum in C/C++ einzusteigen und da gibt's meiner Meinung nach gute Seiten im Netz. Auch für einige Spezialfälle bspw. OpenGL braucht man definitiv kein Buch, das Red Book gibt's im Netz, Tutorials um die Funktionen zu verstehen gibt's wie Sand am Meer und der Rest sollte mit einem Funken Logik zu machen sein.
Du kannst mir glauben, dass ich genug über die Mechanismen eines PCs Bescheid weiß um keine schlechte Software zu schreiben, im Gegenteil, ich bin sehr viel am Optimieren mit Assembler etc. (im Vergleich zu dem was der Comp. erstellt hat) und damit verschlechtere ich meine Programme sicher nicht. Ich denke ich weiß sehr gut, wie man einen Algorithmus effizient gestaltet, bzw. was ich dabei PC-bedingt zu beachten habe. (Ich glaube auch nicht, dass sich hier außer mir viele (aus dem nicht professionellen Bereich) hinsetzen und teilweise die Prozessortakte zähle, die eine Zählschleife in einem kritischen Abschnitt benötigt und versuchen da zu optimieren.) 
Und was ich mit "Zeigersache" meine, erschließt sich eigentlich aus dem Kontext, nämlich die Aussage von SMiller, dass virtuelle Methodenzeiger mehr Speicher brauchen. Ich muss dagegen ankämpfen mir nicht ver**scht vorzukommen, wenn ich deine Erklärung dazu lese. Mir ist voll und ganz bewusst, dass Zeiger nicht C spezifisch sind, sonst hätte ich sie ja nicht in Turbo Pascal/ Delphi/ Assembler verwenden können. 

@SMiller: Nein es schadet nicht das zu wissen, aber da ich noch nie über einen Fall gestolpert bin, in dem es relevant gewesen wäre, wäre ich auch nicht gestorben, hätte ich es nie erfahren. Und eben weil ich es nicht brauche, bringt mich die Neugier auch nicht um, wenn die Größe von 'nem int plötzlich eine andere wäre, hätte ich bestimmt mehr Interesse aufgebracht .


----------



## Kachelator (22. Juni 2004)

> Du kannst mir glauben, dass ich genug über die Mechanismen eines PCs Bescheid weiß um keine schlechte Software zu schreiben, im Gegenteil, ich bin sehr viel am Optimieren mit Assembler etc. (im Vergleich zu dem was der Comp. erstellt hat) und damit verschlechtere ich meine Programme sicher nicht.


  Hm, die Optimierung auf dieser Basis steht auf meiner Prioritätenliste ganz, ganz unten. Das überlasse ich getrost den Compilern. 
Gute Code hat meiner Meinung nach folgende Merkmale:
1. erfüllt seine Aufgabe 
2. ist stabil
3. ist leicht wartbar (lesbar)
4. ist erweiterbar

Erst wenn Punkt 1 nicht zutreffen würde (infolge von mangelnder Performanz), würde ich mich an Optimierung machen. Und die sähe dann nicht so aus, dass ich dem Compiler die Arbeit wegnehme, sondern würde auf einer höheren Ebene ansetzen, durch Suchen und Finden von Engpässen und Wahl günstigerer Algorithmen oder Container. 
Das "zweitlowleveligste" Optimierungsproblem, das ich bisher hatte, war die Entwicklung einer platzsparenden Stringklasse, weil der std::string auf der  XBox zu fett war (28 Byte  -- leer!) 
Das "lowleveligste" eine Reihe von Funktionen zur Manipulationen von Bitmaps.

Hier noch einer meiner Lieblingslinks zum Thema Optimierung: http://www.flounder.com/optimization.htm


----------



## JoKne (22. Juni 2004)

Ich kann Christian Fein voll und ganz zustimmen das man Bücher braucht, ich würde sogar sagen, man kann auf Bücher nicht verzichten.

Wenn man sich durch Bücher erstmal die Grundlagen angeeignet hat, hat man schon die halbe Miete.  Danach kann man sich aus dem Internet oder Referenzen einfach immer das Beste rauspicken und verwerten, aber woher soll ich wissen was gut ist und was nicht, wenn ich keine Ahnung von den Grundlagen hab

C++ ist wirklich eine sehr komplexe Sprache, die mit der Zeit sehr unübersichtlich geworden ist,  vielleicht solltest du erstmal mit C anfangen und dann an c++ gehen. Es gibt dort ein gutes buch von Willms "c lernen" in einigen Skripten wird das als Basis für C++ vorgeschlagen.


----------



## Dudadida (22. Juni 2004)

Hm Kachelator, sicher hängt es zunächst von den Algorithmen ab, aber auch sehr vom Anwendungsbereich. Wenn du für die XBox schreibst, dann weißt du ja, wie optimiert bspw. 3D Anwendungen sein müssen. Und besonders da mein Rechner nicht mehr der neuste ist, bin ich gezwungen extremen Wert auf Geschwindigkeit zu legen. Selbstverständlich ist dieser Schritt immer der letzte, wenn man weiß, dass man um einen Algorithmus nicht mehr herum kommt und ihn nicht weiter "konventionell" verbessern kann. Wenn man da gut kommentiert und strukturiert (bspw. auch die ersetzten Zeilen auskommentiert stehen lässt), dann lässt sich das auch gut verwalten.
Dieses Denken, dass man das doch lieber den Compiler machen lassen kann etc. ist meiner Meinung nach grundfalsch. Sieh dir mal Spiele wie Duke Nukem 3D an, das war derart hoch optimiert, dass es auf einem 486 lief, heute würde wahrscheinlich nicht mal mehr ein Taschenrechner auf 'nem 486 laufen, weil der schon wieder 10MB im Arbeitsspeicher belegt. Die Ressourcen sind ja da, reicht ja wenn man lieber "von oben" optimiert, damit man selbst es ein bisschen leichter hat. Nur wenn dann mal die Hightechmaschine auch mal nicht mehr kann, dann muss man doch mal "lowlevelig" werden. Alles integriert, alles erweiterbar, alles übersichtlich,... Das ist meiner Meinung nach pures Verschwenderdenken.


----------



## squeaker (22. Juni 2004)

Schaut mal im masmforum im Laboratory vorbei - ein C und ein ASM programmierer optimieren Code. Es geht um eine Umrechnung ASCII nach Radix40

Starwert: ~7900 cycles
Endwert: ~290 cycles.

Da lohnt es sich schon zu optimieren wenn die Funktion oft genug aufgerufen wird. Aber für solche Analysen hat man ja den Profiler.


----------



## Christian Fein (22. Juni 2004)

> _Original geschrieben von Dudadida _
> *
> Dieses Denken, dass man das doch lieber den Compiler machen lassen kann etc. ist meiner Meinung nach grundfalsch. Sieh dir mal Spiele wie Duke Nukem 3D an, das war derart hoch optimiert, dass es auf einem 486 lief, heute würde wahrscheinlich nicht mal mehr ein Taschenrechner auf 'nem 486 laufen, weil der schon wieder 10MB im Arbeitsspeicher belegt. Die Ressourcen sind ja da, reicht ja wenn man lieber "von oben" optimiert, damit man selbst es ein bisschen leichter hat. Nur wenn dann mal die Hightechmaschine auch mal nicht mehr kann, dann muss man doch mal "lowlevelig" werden. Alles integriert, alles erweiterbar, alles übersichtlich,... Das ist meiner Meinung nach pures Verschwenderdenken. *




Programme die auf einem 486 oder von mir aus realistischer LowEnd Embedded Systeme laufen müssen sind eher die Ausnahme als die Regel.

Softwareentwicklung ist ein kostspieliger Prozess. Das heisst überhöhte Handoptimierungen mögen Spass machen sind aber zumeist vollkommen kontraproduktiv.

Wie Kachalator schon gesagt hat, eine gute Software bietet Stabilität, Hohewartbarkeit und erweiterbarkeit.

Insbesondere bei der Wartbarkeit sind selbstgeschriebene ASM Algorythmen alles andere als erwünschenstwert. 
Zumal der Flaschenhals bei modernen Anwendungen ganz wo anders liegt als in der Durchfühung von z.b Sotieralgorythmen. Der Flaschenhals liegt in Persistenzmodelle, in schlechtem Anwendungsdesign, IO Zugriffe allgemein. 
Gutes Anwendungsdesign lässt sich nicht durch ausprobieren lernen, das kann ich dir garantieren. Es gibt Design Patterns die grosse Teile designtechnischer Probleme durch 
Musterlösungen abdecken. 
Kein Mensch wird ein Erbauer Pattern eben neu Erfinden. Programmieren ohne Bücher, ohne vom Wissen anderer zu lernen ist demnach das Rad immer wieder neu erfinden.



> Dieses Denken, dass man das doch lieber den Compiler machen lassen kann etc. ist meiner Meinung nach grundfalsch.



Wenn ich mich auf Algorythmen vertraue die in der J2SE API mitgeliefert werden, dann überlasse ich nicht dem Compiler das denken sondern dem Programmierer der diese Methode geschrieben hat.
Das nennt sich Arbeitsteilung und das ist in der modernen Programmierung das A & O.
Zurückgreifen auf bestehenden Code, und diesen nutzen ist das beste Mittel gegen zu hohen Entwicklungskosten. Nur damit kann dem gut entgegen gewirkt werden.
Wenn ich ein Haus baue, will ich nicht selber einen Zement erfinden, sondern ich greife 
auf den Zement zurück der für mein Haus die besten Eigenschafften hat.
Genauso wie ich als Zimmermann dem Mauerer das Mauerwerk überlasse und meine Dachstuhl auf dessen Mauern aufsetze, in dem Vertrauen das er was von seinem Job versteht. 
Das Hintergrundwissen in Bücher, das wirklich recht üppig ist, ist aber extrem wichtig. 

Ein Beispiel für Hintergrundwissen, welches auf den ersten Blick überflüssig scheint, 
wie bei mir immer in Java.
Die VM speichert, zu optimierung, Strings in einem StringPool. 
Das erklärt wieso:

```
String a = "bla";
   String b = "bla";
   if(a==b) return true;
```
mannchmal false und mannchmal true, zurück gibt. Eigentlich vergleicht == die Referenzen und nicht den Inhalt. Da aber a und b Referenzen auf einen String in diesem Stringpool sind ist das ergebnis oftmals true. Wird aber aus irgendeinen Grund ein neuer String im Stringpool angelegt, dann ergibt dies false. 
Das verwirrt und erscheint als Bug, ist es aber nicht aufgrund der internen Eigenschafft wie die VM vorgeht. 
Wenn ich das weiss werde ich mich viel eher bereierlären grundsätzlich Strings mit der dafür vorgesehenen Methode a.equals(b) zu vergleichen welche mir in diesem Fall immer das gewünschte Ergebnis true zurückgibt.
PS: Die Frage kam schon mehrfach in verschiedenen Foren, Usenetgroups zu Java vor.
Es gibt noch sehr viele Beispiele. Und Bücher haben noch einen ganz entscheidenden Vorteil. Der Code in guten Büchern (ich vertraue OReillys) ist immer etwas an den mann 
sich stilistisch halten kann. Ein gutes Beispiel wie ein Code auszusehen hat, wie er designed werden soll.
Das sind Dinge die in Tutorien oftmals komplett ausser acht gelassen werden. Sprich:
Hauptsache es funktioniert und zeigt die Methode.

Das ist das selbe wie in der Schule. Auch gute Schüler aus der 10. 11. könnten einen aus der 8. Klasse in Mathe unterrichten. Das Ergebnis wird unter garantie nicht genauso gut sein wird mit einem ausgebildeten Pädagogen.

Zumal haben Bücher noch einen ganz entscheidenden Vorteil, mann kann sie mit in die Badewanne, Baggersee, Zug, Adriastrand, Puff  nehmen.


----------



## squeaker (22. Juni 2004)

man muss ja nicht gleich mit der Asm-Keule schlagen aber es gibt auch einfache Beispiele wie man die Prozessorarchitektur besser ausnutzt um mehr Performanz zu bekommen.

Beispiel:


```
for (int i=0; i<128; i++) {
   sum+=x[i];
}
```



```
for (int i=0; i<128; i+=4) {
   sum+=x[i];
   sum+=x[i+1];
   sum+=x[i+2];
   sum+=x[i+3];
}
```
(nützt die Parallelisierbarkeit von additionen aus, ausserdem weniger Sprünge)

desweiteren sind auf dem PIV z.B. sprünge Rückwärts günstiger als vorwärts (wegen der branch prediktion), bei If-Abfragen in Schleifen kann man erwägen (falls möglich) umzubauen, so daß die Schleifen in den Abfragen stehen und nicht umgekehrt, bei Switchanweisungen die Wahrscheinlichsten Sprungmarken zuerst, floatingpoint-Befehle so einbauen, dass sie paralell ausgeführt werden können (der Compiler darf sie aus Genauigkeitsgründen nicht anfassen), float statt double verwenden wenn möglich, da float mittels MMX verarbeitet werden kann ...

der C-Mensch hatte in dem Thread seine Version von über 7000 cycles auf 700 gebracht. Faktor 10! Ohne ein Wort ASM!
Klar, bei simplen Sachen bzw. Dingen die auf Userinput warten lohnt es sich nicht. Aber es gibt immer vielgebrauchte Subrutinen die es sich lohnt zu optimieren.


----------



## Christian Fein (22. Juni 2004)

> _Original geschrieben von squeaker _
> *man muss ja nicht gleich mit der Asm-Keule schlagen aber es gibt auch einfache Beispiele wie man die Prozessorarchitektur besser ausnutzt um mehr Performanz zu bekommen.
> *



Es spricht nichts gegen Optimierung wenn sie 
a) den Code wartbar halten
b) nicht zu teuer sind


----------



## Dudadida (22. Juni 2004)

Weißt du Christian, das mag ja alles gut und schön sein und tatsächlich hat irgendwer meistens schon den perfekten Algorithmus für eine bestimmte Anwendung geschrieben und man braucht ihn nur noch kopieren. Und das ist ja auch gut so und das kann man ja auch nach belieben machen und spart Zeit und im professionellen Bereich auch viel Geld. ABER es ist viel befriedigender wenn man eben das Rad mal neu erfindet. Ich habe schon binäre Bäume benutzt, bevor ich wusste was das ist, ebenso ging es mir mit unzähligen anderen Standardalgorithmen, die ich mir selbst aus den Fingern gesogen habe. Von der pädagogischen Seite ist das zehnmal mehr Wert als irgendeinen vorgekauten Code abzupinseln, weil man selbst gezwungen ist zu denken und nicht nur "wie passe ich Standard X an mein Problem an" sondern "wie löse ich das Problem"!  Und guten Stil gewöhnt man sich schon zwangsläufig an, wenn man die Übersicht waren will und sich Gedanken über das macht, was man schreibt und versucht es zu verbessern (wobei es da auch einige Ausnahmen zu geben scheint, ok).
Wenn man es dann kann, gut und schön, aber ich finde es verwunderlich, dass ich teilweise immer noch von Freunden die Informatik studieren die Programmieraufgaben löse und das obwohl sie ihre teuren Bücher zu Hause haben und voll sind, von theoretischem Fachwissen, es aber nicht umsetzen können.
Dass die IT-Branche da anders denkt und lieber Wert setzt auf billig und billig und billig ist klar, schließlich ist man ja nicht mehr gezwungen mit langsamen Systemen zu arbeiten und man kann vollkommen in Richtung Wartbarkeit und Kostenersparnis denken, aber das ist meiner Meinung nach von der programmiertechnischen Seite her nicht der beste Weg, weil so nach außen hin nicht die beste Software produziert wird, damit hat's nur der Programmierer leichter.

PS.: Oh Mann, wer nimmt denn ein C++ Buch mit an den Strand... das lenkt doch nur vom wesentlichen ab... *g*

@Squeaker: Aber eben solche Optimierungen sind vielen Leuten ein Dorn im Auge, denn wenn es mal nicht mehr eine derart triviale Operation ist, die man durchführt und kompliziertere Anweisungen viermal schreibt, wird es verständlichweise wieder schwerer wartbar...


----------



## Kachelator (22. Juni 2004)

@Christian Fain:
Ich bin der Chor, und ich stimme zu! Ich stimme zu, ich stimme zu, ich stimme zu! Besonders bei den Büchern. Ich bin ganz definitiv ein Buch-an-den-Strand-Mitnehmer. 

@Dudadida:
Da bereits verheiratet, gibt es bei mir nicht so das Problem mit der Ablenkung, Dudadida. Kann mir jetzt denken, woher dein Nickname kommt. 



> ABER es ist viel befriedigender wenn man eben das Rad mal neu erfindet.


  Ja, das ist auch lehrreich, aber wie du selber weisst, gilt im Job die Befriedigung nicht so viel. Ich bin ein begeisterter Programmierer, aber ich bin auch bewusst "faul" und versuche immer wieder, neue Möglichkeiten zu finden,  mir weniger Arbeit zu machen -- in der Hoffnung, dass der ganze Low-End-Kram mal irgendwann wirklich nicht mehr berücksichtigt werden muss. Ab und zu macht es mir auch Spass, zum Beispiel einen Screensaver mit lustigen Pixeleffekten zu bauen (in meiner Freizeit!) und da kommt dann auch einiges an Optimierungsaufwand zusammen. Das ist aber Hobby, kein Beruf, und hat nicht unbedingt was mit Professionalität zu tun. Vielleicht bin ich aber auch einfach aus dem Alter raus, wo mir das Bit-Verbiegen als Selbstzweck noch Spass macht. Ich mache mir lieber Gedanken über Algorithmen.



> Wenn man es dann kann, gut und schön, aber ich finde es verwunderlich, dass ich teilweise immer noch von Freunden die Informatik studieren die Programmieraufgaben löse und das obwohl sie ihre teuren Bücher zu Hause haben und voll sind, von theoretischem Fachwissen, es aber nicht umsetzen können.


  Ich finde es eher bedenklich als verwunderlich und ich muss sagen, dass es mir auch ziemlich auf den Keks geht, dass dann solche Leute mit ihrem Diplom auf dem Arbeitsmarkt herumstolzieren und den wirklich fitten und ambitionierten Autodidakten und Quereinsteigern "die Jobs wegnehmen". Das klingt jetzt hart (ich habe stark übertrieben) und ich will auch wirklich nichts gegen deine Freunde sagen, die ich ja nicht kenne. Ich will auch um Gottes willen nicht alle studierten Informatiker vergraulen! Ich bin in der Beziehung nur inzwischen etwas empfindlich geworden.

(Oh Mann, in diesem Thread tun sich ja Abgründe auf!    )

So wie es aussieht, tut sich in dem Bereich allerdings wohl einiges.  Industriezertifikate  scheinen ja Wert zu verlieren, und mit cert-it werden neue Standards geschaffen, um auch die berufliche Fitness von Quereinsteigern zu bewerten.

Ich zwinge mich mal, hier zu schliessen... 

---
Edit: Habe ein 'e' durch ein 'a' ersetzt. Rache an Christian für's "Kachalator"...


----------



## Daniel Toplak (22. Juni 2004)

*Auch mal mitreden*

Also dann möchte ich auch mal meinen Standpunkt vertreten.
Da ich auch beruflich Programmiere und doch einiges an Erfahrung mitbringen kann denke ich ebenso wie Christian.
Nein ich will ihm hier nicht nur einfach nachreden, denn das wäre ja langweilig, vielmehr will ich die wirtschafliche Effiziez von Programmiermethoden noch mehr untermauern. Denn die Wartbarkeit und skalierbarkeit von Softwareprodukten ist nun mal heutzutage wesentlich wichtiger als die Perfromance, dabei meine ich das ganz Allgemein, denn bestimmte Spezialfälle sind natürlich davon ausgeschlossen.
Denn wie schnell geht es heutzutage, daß bei einem Projekt mal schnell jemand abgezogen wir und dafür 2 andere Programmierer nahtlos weiter machen müssen. Da zählen kurze Einarbeitungszeiten strukturierter Aufbau und Dokumentation.
Klar das sind Theorien, in der Praxis sieht es meist schlimm aus (kenn das aus Erfahrung), aber eben diese Theorien (um Christian nochmals zu zitieren) werden einem eben nicht aus einem Forum oder Tutorial gelehrt, die kann man aber auch nicht allein aus Büchern lehrnen, sondern natürlich auch durch Erfahrung.

Die Problematik, mit teilweise unqualifizierten Informatik-Studenten (bitte Niemand böse sein), die Dudadida und Kachelator angesprochen hat, ist mir auch bekannt und davon kann ich auch ein Lied singen. Woran das liegt, ist mir auch nicht bekannt, aber es gibt mit Sicherheit einige Gründe dafür.
Einer der Gründe ist auf alle Fälle die sog. "Lernresistenz" mancher Leute. Ein anderer ist meiner Meinung nach auch, dass viele Leute, im Zeitalter von Computer & Co nichtmehr wissen dass es Literatur gibt, egal ob in gedruckter oder digitaler Form.
Ob Buch oder eBook, das soll derjenige selbst entscheiden, denn wie Christan schon gesagt hat haben Bücher (obwohl sie schon so alt sind) doch gewisse Vorteile.

Gruß Homer

P.S. An den Adriastrand nehm ich lieber nen Roman mit als ein C++-Buch


----------



## Dudadida (22. Juni 2004)

Hehe, sorry Kachelator, den Nickname habe ich nur, weil ich irgendwann festgestellt habe, dass den sonst nie irgendjemand hat, so kann ich immer den gleichen Nick nehmen (aber interessante Schlussfolgerung, die werde ich wohl übernehmen, wenn du erlaubst , falls mich mal wer nach dem Namen fragt... ).
So langsam decken sich auch die Ursachen der unterschiedlichen Ansichten auf, ich habe halt stets nur als Hobby programmiert, strebe ja auch einen anderen Beruf an, mal intensiv, mal für lange Zeit gar nicht und da legt man dann halt mehr Wert auf die lieben Details, es hängt einem ja keine Deadline im Nacken oder ein verärgerter Chef oder was auch immer und da hält man sich halt schonmal gern an 'nem Algorithmus auf, der woanders schon besser vorliegt. (Halt die üblichen Sinnlosprogramme, ich glaube JEDER hat schonmal nen Taschenrechner programmiert...) Mittlerweile versuche ich aber schon, wenn ich denn was mache, irgend etwas zu programmieren, das mir weiterhilft und das noch nicht überall zu finden ist. 
Was die Info-Studs betrifft, muss ich sagen, dass man da sehr differenzieren muss. Es gibt sicherlich genug, die ihr Fach wirklich beherrschen, aber es gibt auch (wie immer) einige, die sich so durchdrücken, wie auch schon in der Schule und dann irgendwann auf den Arbeitsmarkt losgelassen werden (die Lern- oder vielleicht besser Verständnisresistenz eben - lernen können die meisten ja ganz gut, nur verstanden wird nix). 
Aber ich glaube das ist in jedem Fachbereich irgendwo ähnlich. In Medizin ist es bspw. ganz krass, da werden ja bewusst Theorieroboter herangezogen, die das ganze 1500 Seiten Innere Medizin Buch auswendig hervorbeten können. Und ohne wirklich praktisch tätig geworden zu sein werden die Studenten so auf die unvorbereiteten Patienten losgelassen werden, die sogar noch Vertrauen aufbringen, weil auf dem Namensschild schließlich "Arzt" steht.

P.S.: Ja der Roman wirkt am Adriastrand auch viel cooler...


----------



## Kachelator (22. Juni 2004)

> Hehe, sorry Kachelator, den Nickname habe ich nur, weil ich irgendwann festgestellt habe, dass den sonst nie irgendjemand hat, so kann ich immer den gleichen Nick nehmen (aber interessante Schlussfolgerung, die werde ich wohl übernehmen, wenn du erlaubst , falls mich mal wer nach dem Namen fragt... ).


  Na cool, dann war ja meine Bemerkung richtig nützlich!  



> So langsam decken sich auch die Ursachen der unterschiedlichen Ansichten auf[... (und Folgendes)]


  Da kommen wir auf einen Nenner (auch ich habe einen Taschenrechner programmiert!  ).



> Theorieroboter


  Das muss ich mir merken!  



> P.S.: Ja der Roman wirkt am Adriastrand auch viel cooler...


  Wenn es ein C++-Buch  mit einem Notebook für 10000000€ daneben ist, sieht das bestimmt anders aus. Abgesehen davon sollte man sich im Urlaub erholen.


----------



## squeaker (23. Juni 2004)

Ich fürchte mit der Wartbarkeit ist es so eine Sache. Jeder Code ist wartbar wenn er a) ordentlich designt ist und b) ordentlich kommentiert ist.

Klar, bei optimiertem Code gehört bei der Methode/Prozedur eine Beschreibung dazu WAS die Methode/Prozedur macht und WIE sie es macht und WARUM diese Zeilen Code etwas optimieren.

Das Code nicht wartbar ist liegt in 99.99% der Fälle an mangelnder Dokumentation.


----------



## Christian Fein (23. Juni 2004)

Deine Schlussfollgerrungen sind falsch komplett falsch.



			
				Dudadida hat gesagt.:
			
		

> Weißt du Christian, das mag ja alles gut und schön sein und tatsächlich hat irgendwer meistens schon den perfekten Algorithmus für eine bestimmte Anwendung geschrieben und man braucht ihn nur noch kopieren. Und das ist ja auch gut so und das kann man ja auch nach belieben machen und spart Zeit und im professionellen Bereich auch viel Geld. ABER es ist viel befriedigender wenn man eben das Rad mal neu erfindet. Ich habe schon binäre Bäume benutzt, bevor ich wusste was das ist, ebenso ging es mir mit unzähligen anderen Standardalgorithmen, die ich mir selbst aus den Fingern gesogen habe.



Mann kann einerseits einen Sotieralgorythmus schreiben, oder anderseits einen von der API 
nehmen um damit schneller und leichter ein benutzbares Endprodukt programmieren. 
Mann hat durch den Suchalgorythmus mehr Zeit sich auf das Endprodukt zu konzentrieren
und seine Energien da hinein zu stecken, wo es wirklich benötigt wird.



			
				Dudadida hat gesagt.:
			
		

> Von der pädagogischen Seite ist das zehnmal mehr Wert als irgendeinen vorgekauten Code abzupinseln, weil man selbst gezwungen ist zu denken und nicht nur "wie passe ich Standard X an mein Problem an" sondern "wie löse ich das Problem"!  Und guten Stil gewöhnt man sich schon zwangsläufig an, wenn man die Übersicht waren will und sich Gedanken über das macht, was man schreibt und versucht es zu verbessern (wobei es da auch einige Ausnahmen zu geben scheint, ok).



Mann pinselt nichts ab, mann ruft einfach eine Methode auf. 
Und guten Stil gewöhnt mann sich nicht so einfach an indem mann sich nur Gedanken macht, sondern indem mann fremden Code liest, und in einem Team programmiert. Mann muss sich
das antrainieren, und Bücher sind da ein guter Anfang.



			
				Dudadida hat gesagt.:
			
		

> Wenn man es dann kann, gut und schön, aber ich finde es verwunderlich, dass ich teilweise immer noch von Freunden die Informatik studieren die Programmieraufgaben löse und das obwohl sie ihre teuren Bücher zu Hause haben und voll sind, von theoretischem Fachwissen, es aber nicht umsetzen können.



Das Informatikstudium befähigt noch lange nicht zum programmieren. Ich muss das immer wieder bei Bewerbungen die hier eintrudeln erkennen.
Nur Informatikstudenten die sich nebenbei mit der Programmierung beschäftigen, werden 
auch gute Programmierer.
Das Informatikstudium ist viel zu theoretisch. Und Bücher allein machen auch noch keinen
guten Programmierer.  Mann muss schon was dafür tun, sprich Theoretisches Wissen +
Praktische Erfahrung.



			
				Dudadida hat gesagt.:
			
		

> Dass die IT-Branche da anders denkt und lieber Wert setzt auf billig und billig und billig ist klar, schließlich ist man ja nicht mehr gezwungen mit langsamen Systemen zu arbeiten und man kann vollkommen in Richtung Wartbarkeit und Kostenersparnis denken, aber das ist meiner Meinung nach von der programmiertechnischen Seite her nicht der beste Weg, weil so nach außen hin nicht die beste Software produziert wird, damit hat's nur der Programmierer leichter.



Sorry, aber so wie du denkst wurde auch zu den Zeiten, die mann allgemein als Softwarekrise betrachtet gedacht. Der Punkt ist, früher konnten sich nur Grosskonzerne wie Siemens individualsoftware leisten, da die Kosten mehrere Hundertausende € verschlungen. 
Heutzutage sind die preise für Individualsoftware in einem Bereich, in dem sich auch Mittelständische Firmen das leisten kann. Der Markt nach bezahlbarer Indidualsoftware ist 
gross geworden. Früher gab für ein solches Projekt sehr lange Entwicklungszeiten, die über mehrere Jahre gingen. Heute sinds oft wenige Monate.
Aber das programmieren heute hat sich geändert, mann hat grosse Frameworks die einem Arbeit abnehmen, mann hat extrem gute IDEs die einen helfen, es gibt Dinge wie Testdriven Development, XtremeProgramming, es gibt Model Driven Architektur und Projekte wie 
Apache Jakarta Commons, die einen viele Arbeit abnehmen. 
Das wichtige in der modernen Programmierung ist das konzentrieren auf den Knackpunkt bei 
der Software, die logic.
Das dies schlechte Software ist, die nicht alle Algorythmen selber schreibt, kannst du komplett vergessen, denn gerade Software wie Oracle DB, Eclipse, Apache Tomcat, JBoss, KDE usw 
machen extremen gebraucht von dieser Code wiederverwenbarkeit.
Sämmtlicher professioneller Code basiert zum grössten Teil auf wiederverwendete Algorythmen.



			
				Dudadida hat gesagt.:
			
		

> PS.: Oh Mann, wer nimmt denn ein C++ Buch mit an den Strand... das lenkt doch nur vom wesentlichen ab... *g*



ähm ich  
Mann kann so beschäftigt tun, wärend mann .... 
... aber lassen wir das


----------



## squeaker (23. Juni 2004)

Naja, wer das Optimieren anfängt bevor das Produkt funktioniert ist selber schuld. Aber weglassen ist unnötige Verschwendung von Ressourcen und das Gerücht, mit der nächsten Hardwaregeneration wird's schon besser ist wie gesagt nur ein Gerücht.


----------



## Christian Fein (23. Juni 2004)

Dudadida hat gesagt.:
			
		

> Aber ich glaube das ist in jedem Fachbereich irgendwo ähnlich. In Medizin ist es bspw. ganz krass, da werden ja bewusst Theorieroboter herangezogen, die das ganze 1500 Seiten Innere Medizin Buch auswendig hervorbeten können. Und ohne wirklich praktisch tätig geworden zu sein werden die Studenten so auf die unvorbereiteten Patienten losgelassen werden, die sogar noch Vertrauen aufbringen, weil auf dem Namensschild schließlich "Arzt" steht.



Meine ex hat jetzt vor nem Monat?! ihr letztes Staatsexamen fertig. Ich war in der Zeit 
als sie ihr Physikum gemacht hat mit ihr zusammen, und da war das mit der Theorie 
schon ziemlich heftig, mit welchem Lehraufwand das verbunden ist.

Aber so wie ich mitbekommen habe, hatte sie sehr wohl ihr Praktisches Jahr in der
Klink und auch sonst war es etwas weniger Theoretisch nach dem Physikum.

mhhh



> Klar, bei optimiertem Code gehört bei der Methode/Prozedur eine Beschreibung dazu WAS die Methode/Prozedur macht und WIE sie es macht und WARUM diese Zeilen Code etwas optimieren.


Das sehe ich anders. Wenn ich eine Methode habe die eine Beschreibung benötigt weil sie nicht selbstredent ist, dann wird die Methode über den Jordan geschickt und ich schreibe den
betreffenden Code neu, da er hässlich ist.
Erst wenn ich dann beim neuschreiben merke das ich nicht drumherum komme eine erklärungsbedürftige Methode zu schreiben, wird diese ausführlich kommentiert.

Eine Methode wie:
public String[] getParametermap(HttpRequest ) oder int extractIdentifier(paramMap); sind selbstredent und benötigen keiner Kommentierung. Es ist sogar oftmals so das Kommentare sich eher störend auf die lesbarkei auswirken.

Wann schreibt mann denn Kommentare?
a) Es ist nicht auf den ersten Blick ersichtlich was passiert
b) Bestimmte Rückgabewerte haben eine besondere Bedeutung 
c) Betreffende Codeteil wird von irgendwo aufgerufen, es muss dieser Aufruf in die Analyse mit einbezogen werden, Abhängigkeiten
d) nicht leicht zu erkennender Algorythmus z.b Rekursiever aufruf mit entsprechenden sprung Variablen
...

Was kann mann machen?
a) Den code so umbauen das er selbstredender wird, Code in entsprechende Methoden auslagern die gut benannte werden.
b) Mit Enums und vergleichbaren arbeiten die wiederrum aufgrund des Bezeichners ihre bedeutung verraten.
c) Den Code mehr modularisieren, so das die Enge verbindung verloren geht. Wenn dies nicht
möglich ist, dies eher durch einen Ausführbaren Test, z.b JUnit dokumentieren. 
d) wenn möglich vereinfachen. Wenn nicht möglich ist hier ein Kommentar angebracht.

Also meiner Meinung nach werden Kommentare oftmals unsinnig eingesetzt und sind eine entschuldigung für schlechtes Design.


----------



## Dudadida (23. Juni 2004)

> _Original geschrieben von Christian Fein _
> Mann kann einerseits einen Sotieralgorythmus schreiben, oder anderseits einen von der API
> nehmen um damit schneller und leichter ein benutzbares Endprodukt programmieren.
> Mann hat durch den Suchalgorythmus mehr Zeit sich auf das Endprodukt zu konzentrieren
> ...



Ich geb's auf. Sorry, aber ich habe irgendwie den Eindruck, dass du gar nicht versuchst zu verstehen was ich meine. Mir geht's hier nicht darum in kürzester Zeit das tollste Programm zu schreiben, sondern das Programmieren zu lernen. Da bringt es einen meiner Meinung nach weiter, wenn man den Suchalgorithmus selber schreibt.



> ähm ich
> Mann kann so beschäftigt tun, wärend mann ....
> ... aber lassen wir das



...ist ein Argument...


----------



## squeaker (23. Juni 2004)

> _Original geschrieben von Christian Fein _
> *
> Das sehe ich anders. Wenn ich eine Methode habe die eine Beschreibung benötigt weil sie nicht selbstredent ist, dann wird die Methode über den Jordan geschickt und ich schreibe den
> betreffenden Code neu, da er hässlich ist.
> ...



Ich habe in meinem Leben noch keine selbsterklärende Methode entdeckt die nicht-triviale Algorithmen enthält.
Bitte schreibe mir doch einmal eine Huffmankompression die sich selbständig erkläre, d.h. bei der man ohne Kenntnis des Algorithmus einfach so feststellt was da geschieht. Das will ich sehen - andernfalls sehe ich deine Behauptung als wiederlegt an.

Womit wir auch wieder bei der Optimierung sind. Huffman eine Durchsatzverdopplung zu bringen ist sicherlich einiges an Dokumentation wert..

Genau das gleiche in String-Routinen oder ähnlichem. Wenn ich mich recht entsinne, programmierst du hauptsächlich bzw. auch Java. Wenn da die Klassenbibliotheken auf einmal um Faktor 2-3 langsamer sind in den häufig benötigten Routinen dann würdest du die Sprache weglegen.
Klar hat es keinen Sinn eine Taschenrechnerapplikation bezüblich Geschwindigkeit zu optimieren - aber wenn sich bei einer Applikation die Rechenzeit von 10h auf 5h kürzen läßt (was nicht unrealistisch ist bein nicht optimierten Applikationen), dann ist das wesentlich. Gleiches bei Webservern  - wenn die plötzlich doppelt so viele dynamische Webseiten ausliefern können spart das einiges an Geld.
Ich denke es kommt auf das Ziel drauf an. Ich kenne genügend Anwendungen die ein plus an Geschwindigkeit leicht vertragen könnten.

zu den JUnits - manchmal geht das nicht weil man nicht den ganzen Wertebereich mit Tests abdecken kann. Dann stehst du damit im Regen.


----------



## Christian Fein (23. Juni 2004)

Dudadida hat gesagt.:
			
		

> Ich geb's auf. Sorry, aber ich habe irgendwie den Eindruck, dass du gar nicht versuchst zu verstehen was ich meine. Mir geht's hier nicht darum in kürzester Zeit das tollste Programm zu schreiben, sondern das Programmieren zu lernen. Da bringt es einen meiner Meinung nach weiter, wenn man den Suchalgorithmus selber schreibt.



Das habe ich nicht bestritten. Ich habe irgendwo geschrieben das es sehr wohl von Vorteil ist wenn 
mann einmal irgendeine Art von Sort geschrieben hat, selbst wenn mann später Arrays.sort() nutzt.
Zusätzlich habe ich auch geschrieben das mann Programmieren lernt indem mann Theorie und Praxis verbindet. Aber es geht nicht darum das es nötig ist das mann jeden Algorythmus selber mal geschrieben haben muss, denn es gibt genügend Dinge in der Welt des Programmierers die ebenso aufwendig zu lernen sind, und einen höheren Praktischen Nutzen haben. So wie eben die Design Patterns, der praktische Nutzen in der Programmierung ist sehr viel höher.
Denn das Ziel des Programmieren lernens kann nur das Programmieren von Software (welche auch immer) bedeuten, und da ist es wichtig das mann sich auf die wirklichen Probleme die Software mitsich bringt eingeht.



			
				squeaker hat gesagt.:
			
		

> Ich habe in meinem Leben noch keine selbsterklärende Methode entdeckt die nicht-triviale Algorithmen enthält.
> Bitte schreibe mir doch einmal eine Huffmankompression die sich selbständig erkläre, d.h. bei der man ohne Kenntnis des Algorithmus einfach so feststellt was da geschieht. Das will ich sehen - andernfalls sehe ich deine Behauptung als wiederlegt an.



Welche Behauptung widerlegt:
diese: 
d) wenn möglich vereinfachen. Wenn nicht möglich ist hier ein Kommentar angebracht.
Oder existieren bei dir nur Methoden die solche Algorythmen beherbergen? Eigentlich sind
Methoden in denen wirklich etwas passiert das nicht trivial ist höchstens 10 % aller Methoden.
Falls dies nicht der Fall ist trifft Lösung nr.
a) Den code so umbauen das er selbstredender wird, Code in entsprechende Methoden auslagern die gut benannte werden.
in Kraft.

Oder aber du programmierst im Augenblick ein neues Verschlüsselungsverfahren, dann kann es durchaus sein das mann mit 10 % nicht zurecht kommt. Aber ansonsten sollte das mit den 10 % schon stimmmen. 
Zudem ist die Frage wenn ich eine Methode schreibe die etwas nicht triviales mache dann sollte sie dennoch so designed sein das Parameter der Methode und Rückgabewert der Methode klar sind. Zudem sollte die Methode fertig sein, das heisst es besteht kein Bedarf an dieser Methode etwas zu ändern. Änderrungen die aufkommen werden durch das Design abgefangen. 
Für denjenigen der die Methode nutzt muss klar sein was die Methode durchführt und wie sie angewendet wird.



> Genau das gleiche in String-Routinen oder ähnlichem. Wenn ich mich recht entsinne, programmierst du hauptsächlich bzw. auch Java. Wenn da die Klassenbibliotheken auf einmal um Faktor 2-3 langsamer sind in den häufig benötigten Routinen dann würdest du die Sprache weglegen.


Die Frage ist doch, sind diese Routinen der Flaschenhals oder nicht. Sprich was sagt mein Profiler? Wieviel verlier ich durch die 2-3 mal langsamer. Wenn ich in einer Operation 20 Millisekunden verliere dann werde ich diese Routinen auch weiterhin nutzen. Denn ich weiss 
das diese Methoden Threadsicher sind, und auch wenn ich jetzt noch nicht sie in einer Multithreadumgebung aufrufe, so steht mir die Option für die Zukunft offen. Optimier ich aber meine eigenen Routinen und die sind nicht Threadsave spaaren mir aber 20 ms, so habe ich 
Erweiterungsproblem sobald ich sie über verschiedene Threads aufrufe.
Der Flaschenhals bei Anwendungen die langsam sind, befindet sich meist bei Externen Zugriffen, IO Operationen, Datenbank verbindungen, SOAP Verbindungen, RMI usw.
Gerade in den Bereichen lassen sich ganz andere Performancegewinne erreichen, die keinen 
faden Beigeschmack haben.



> zu den JUnits - manchmal geht das nicht weil man nicht den ganzen Wertebereich mit Tests abdecken kann. Dann stehst du damit im Regen.


Dafür gibt es MockObjecte. Mann kann soziemlich alle Daten modelieren und simulieren. 
Wenn es Dinge gibt die sich nicht simulieren lassen, dann haben wir zumeist wiederrum schlechte s zusehr unmodales Design.


----------



## squeaker (23. Juni 2004)

Wie modelierst du eine Funktion die von RxR nach R abbildet? Testet dein Mock-Objekt alle Werte?

Ich habe nie davon gesprochen alles zu optimieren - ich glaube ich habe vorher auch mal das Wort Profiler erwähnt (zumindest gedacht). Optimieren ist ne feine Sache, aber man muss wissen, was man tut.

Was richtig eklig ist und wovon man eigentlich die Finger lassen sollte:
Selbstmodifizierender Code - hässlich, einfach hässlich.


----------



## Christian Fein (23. Juni 2004)

Ein Beispiel für schlecht zu testendes sind z.b Servlets die wichtige Daten aus von ServletContainer bereitgestellte Objecte beziehen. Z.b eben ServletContext Object, und ähnliches. 

Es hält einen nichts davon ab, Daten vorzugeben. So kann ich durchaus ein ServletContext Object selber erzeugen und in der JUnit ein TestServlet von diesem Servlet ableiten welches die Methode getServletContext() überschreibt und somit mein eigenes ServletContext zurückgibt. Benötige ich nur die Attribute aus dem ServletContext so überschreibe ich in meienm ServletContext die Methoden getAttribute und setAttribute und schreibe / lese aus einem extra definierten HashMap.
So habe ich die Möglichkeit die Werte die das ServletContext beherbergt von Hand zu definieren, und somit auch die Möglichkeit auch bestimmte Werte zu erwarten.

Um Zusammenhänge zu dokumentieren sind JUnit wirklich eine sehr gute Wahl, denn 
mann erkennt wie wird ein ein Teil angewendet, welche Ergebnisse werden erwartet und
weiteres. 

Ich betone nochmals es gibt Dinge die zu dokumentieren sind, aber ganz oft sind Dinge 
einfach falsch wenn sie eine ausgiebige Dokumentation benötigen.


----------



## SMiller (23. Juni 2004)

@Christian Fein
Ich hoffe du missverstehst mich jetzt nicht, meine es gut:
[klugschei*]
Ma*n* kann ist was anderes als Ma*nn* kann, also wenn du die Männer unter uns ansprechen willst, dann müsstest du es schon groß schreiben, ansonsten sollte *man* "man" mit einem n schreiben. 

Nur so 'ne kleine Bemerkung nebenbei, habe es in vielen Beiträgen entdeckt bei dir. Schadet ja nicht zu sagen hoffe ich...  
(das und dass sind wohl auch nicht so die Stärken von dir)
[/klugschei*]


----------



## Christian Fein (23. Juni 2004)

> _Original geschrieben von SMiller _
> *@Christian Fein
> Ich hoffe du missverstehst mich jetzt nicht, meine es gut:
> [klugschei*]
> ...



Ne kein Problem, ich bin der beste Beweis das Leute mit Rechtschreibschwäche auf tutorials.de nicht kommentarlos gekickt werden 

Ne nehm ich nicht übel auf, ist mir nur bekannt, aber wie heisst es so schön, was das Hänschen nicht lernt ...


----------



## squeaker (24. Juni 2004)

> _Original geschrieben von Christian Fein _
> *Um Zusammenhänge zu dokumentieren sind JUnit wirklich eine sehr gute Wahl, denn
> mann erkennt wie wird ein ein Teil angewendet, welche Ergebnisse werden erwartet und
> weiteres.
> ...



Naja, wir reden hier ja nicht darüber ob etwas schlecht oder gut designt wurde. Aber auch gut designte Anwendungen bedürfen Dokumentation und die häufig verwendeteten Teile dürfen meiner Meinung nach auch optimiert werden. Mir geht die Ressourcenverschwenderrei ein wenig auf den Keks. Man muss es ja nicht gleich so übertreiben wie Farbrausch, die einen 3D-Shooter in 96kByte gepackt haben, aber so ein bischen weniger Verschwendung würde schon helfen.


----------



## Christian Fein (24. Juni 2004)

> _Original geschrieben von squeaker _
> *Naja, wir reden hier ja nicht darüber ob etwas schlecht oder gut designt wurde. Aber auch gut designte Anwendungen bedürfen Dokumentation und die häufig verwendeteten Teile dürfen meiner Meinung nach auch optimiert werden.*



Kommentare != Dokumentation

Eine Dokumentation ist weitereichender und sehr wichtig. Kommentare im meisten Fall 
eher störend als fördernd.

Eine Dokumentation erklärt wie die Zusammenhänge sind und zeigt dies evtl auch  Grafisch da, kommentare die irgendwo im Code versteckt sind wollen oft schlechten Code kaschieren.


----------



## Dudadida (24. Juni 2004)

Will ich meinen Senf auch mal dazugeben. Wenn es nicht super trivial und einleuchtend ist gehört meiner Meinung nach vor jede Funktion/Methode eine kleine Erläuterung was die Aufgabe der Funktion/Methode ist und ein Hinweis darauf, wie es realisiert wird. Außerdem gehört an kritische (meine komplizierte) Codestellen zumindest ein Verweis auf den Algorithmus den man verwendet, wenn es ein allgemein bekannter ist, oder eine kleine Erläuterung wie er funktioniert. Jeder der schonmal auch nur seinen eigenen Code nach einem Jahr oder so versucht hat nachzuvollziehen, weiß, wie nützlich Kommentare sein können.



> _Original geschrieben von squeaker _
> *Mir geht die Ressourcenverschwenderrei ein wenig auf den Keks. Man muss es ja nicht gleich so übertreiben wie Farbrausch, die einen 3D-Shooter in 96kByte gepackt haben, aber so ein bischen weniger Verschwendung würde schon helfen. *



Amen!


----------



## Christian Fein (24. Juni 2004)

> _Original geschrieben von Dudadida _
> * Jeder der schonmal auch nur seinen eigenen Code nach einem Jahr oder so versucht hat nachzuvollziehen, weiß, wie nützlich Kommentare sein können.
> *



Wenn das nicht funktioniert liegt das Problem am Code und nicht an fehlenden Kommentaren. 
Wenn ich noch nichtmal meinen eigenen Code nachvollziehen kann, wer sollte es sonst noch können.

Sprich wenn das nicht funktioniert muss mann seine komplette Art und Weise wie mann programmiert hinterfragen.

Hier sollte mann die Ursache bekämpfen.


----------



## Dudadida (24. Juni 2004)

Ein komplizierter Algorithmus bleibt ein komplizierter Algorithmus, egal wie "schön" ich ihn schreibe. Wenn es keine sehr trivialen Aufgaben sind, dann muss man sich halt an irgendeiner Stelle mal die Gehirnwindungen verrenken um zur Lösung zu kommen und wenn man seinen Schritt dann nicht kommentiert, kann es gut sein, dass man in einem Jahr nicht mehr weiß, was man sich da gedacht hat. Einfaches Bsp.: Schnittpunkt zwischen Gerade und Ebene im Raum. Wenn man das geometrisch löst - und das geht recht gut - hat man einfach nur 2 Zeilen - und sowas packe ich sicher nicht der Struktur zuliebe in unterschiedliche Funktionen oder so -, die einem aber, wenn man darüber nachdenkt wirklich nicht wie Schuppen von den Augen fallen. Wenn man dann nicht kommentiert, muss man nochmal komplett neu herleiten und das ist sicherlich nicht sehr effektiv. Vor allem kann man ohne Kommentar bei solchen Algorithmen Fehler sehr schlecht finden, wenn sie auftreten, eben weil man gezwungen ist nochmal herzuleiten und ein Fehler finden auf den ersten Blick unmöglich wird.


----------



## Christian Fein (24. Juni 2004)

> _Original geschrieben von Dudadida _
> *Ein komplizierter Algorithmus bleibt ein komplizierter Algorithmus *



Besteht dein Programm nur aus mathematisch komplexen Algorythmen?
Wahrscheinlich nicht, nur hier und da kommt das bei Knackpunkten vor, das erklärt aber noch 
lange kein bis zu unleserlichkeit mit Kommentaren zugeschissener Code wie mann ihn allzuhäufig leider gottes sieht.
Viel sinnlose kommentare, aber keine Dokumentation.

Glaube mir eins, ich bin da ein gebranntes Kind da ich eine Software anpassen durfte die
genau so verunstalltet war bis zur Unlesbarkeit.
Gegen ein - zwei kommentare an wirklich verständlichen Stellen gibts nichts gegen einzuwenden, habe ich auch nichts dagegen gesagt.
Aber allzu häufig wird falsch Designter Code nachträglich kommentiert um "nach einem 
Jahr lesbar" zu sein. Das geht aber nach hinten los, denn wenn ein Code in jeder Klasse
mehrere Kommentare enthält ohne die mann mit diesem Code nicht arbeiten könnte, dann 
ist der Code einfach schlecht!
Das währe dann der richtige Zeitpunkt extremes Refactoring zu betreiben.

Wenn ich eine komplizierte Geschichte habe, dann setze ich mich solange hin und schreibe die 
Methode bis sie wunderbar läuft. Danach muss ich sie mir nicht mehr anschauen sondern nur noch aufrufen. Und wie der Algorythmus abläuft ist mir soziemlich egal, mich interressiert ein Jahr später nur noch Was stecke ich hinein und was bekomme ich heraus.

Ein Fehler sollte grundsätzlich nicht auftreten. Wenn sich in einer Methametischen Bereichnung ein Bug eingeschlichen hat, dann ist es Zeit diese Bereichnung komplett wegzuwerfen da sie nicht vertrauenswürdig ist.
Läuft sie jedoch fehlerfrei so muss ich sie nur anwenden.


----------



## squeaker (24. Juni 2004)

> _Original geschrieben von Christian Fein _
> *Besteht dein Programm nur aus mathematisch komplexen Algorythmen?
> Wahrscheinlich nicht, nur hier und da kommt das bei Knackpunkten vor, das erklärt aber noch
> lange kein bis zu unleserlichkeit mit Kommentaren zugeschissener Code wie man ihn allzuhäufig leider gottes sieht.*



Wir reden hier nicht von schlechten Kommentaren. Und ja, viele Probleme sind mathematisch komplexe Algorithmen. Die sollten erst einmal Dokumentiert sein (was macht der Algorithmus und wie macht er es) und dann sollten bei solchen Problemen bei denen es auf Performanz ankommt (String matching z.B., Datenkompression, Verschlüsselung, Rechtschreibkorrektur, 3D-Graphik, Simulation um nur ein Paar zu nennen) Optimierungen vorgenommen werden und diese, sofern sie nicht algorithmischer Natur sind auch im Quelltext kommentiert werden. Dies ist essentiell und je näher die Sprache dem Prozessor steht, um so mehr werden Kommentare benötigt. Dies geht soweit, dass in ASM die meisten Zeilen kommentiert sein sollten.
Smalltalk hingegen braucht man kaum kommentieren, da sogar die Parameterübergabe in Sprachähnlicherform geht (Beispiel: decompressFile: aFilename withAlgorithm: anAlgorithm - sähe in Java so aus: decompress(String filename, Algorithm algo).

in Asm z.B.:

push eax ; eax=Adresse des Algorithmus
push ebx ; ebx=Adresse des String
call decompress

hier sind Kommentare bitter notwendig und ohne ist man aufgeworfen (ich habe mich schon an reverse-engineering probiert - ist echt schwierig ohne Kommentare).

Ich glaube du Programmierst ein einem Anwendungsprofil wo deine Verhaltensweise sicher angebracht ist. Ausserdem hast du sicher häufig gesehen wie man es nicht macht. Daraus zu schliessen, dass (fast) jeder Kommentar unnötig ist halte ich aber für fragwürdig


----------



## Christian Fein (24. Juni 2004)

> _Original geschrieben von squeaker _
> *
> Ich glaube du Programmierst ein einem Anwendungsprofil wo deine Verhaltensweise sicher angebracht ist. Ausserdem hast du sicher häufig gesehen wie man es nicht macht. Daraus zu schliessen, dass (fast) jeder Kommentar unnötig ist halte ich aber für fragwürdig *



Was ich ausdrücken will: 

Kommentiere mit bedacht. Wenn mann bemerkt das ein Kommentar nötig ist weil mann sonst den betreffenden Teil nicht versteht, sollte mann erst überlegen wie kann ich es Umbauen das 
es leicht verständlich wird. 

Ein kleiner Code, etwas übertrieben kommentiert in der ersten Version. Es soll aber 
nur deutlich machen das viele Dinge viel lesbarer werden wenn mann sich ein 
bischen Gedanken macht.


```
Iterator iterator = accaunts.iterator();
int i  =0 ;
int status = 0;
while(iterator.hasNext() { 
    i++;
    Accaunt current = (Accaunt)iterator.next();
    //  wenn nächster Accaunt null ist, ist aktueller auf jeden fall grösser
    if(accaunts.get(i) == null ||
     // check ob Quota grösser als Quota nächster accaunt
      ( current.getQuota() > accaunts.get(i).getQuota() &&
       // status muss status des Prototypes entsprechen
       current.getStatus() == prototype.getStatus() ) ) {
       // tu irgendwas
     } else {        
       // Fehler status muss auf -1 gesetzt werden 
       status = -1;
     }
}
```

besser umschreiben in 

```
AccIterator aIterator = accaunts.iterator();
int status = 0;
while(iterator.hasNext() { 
    Accaunt current = aIterator.getNext();
    Accaunt afterCurrent = aIterator.getAfterCurrent();
    if(isCurrentQuotaBigger(current,afterCurrent,prototype) {
       // tu was
    } else  {
       status = -1;
    }
}

private boolean isCurrentQuotaBigger(Accaunt current, Accaunt afterCurrent, Accaunt prototype) {
    if(afterCurrent==null) return false;
    if(current.getQuota() <= afterCurrent.getQuota()) return false;
   return true;
}
```

Ich muss mir nicht die Methode isValid anschauen um die while schleife zu verstehen.  Ich lese isCurrentQuotaBigger als Methodename der mir genau sagt was die Methode denn vergleichen will, da ich current und afterCurrent übergebe erkenne ich auch was denn
genau verglichen wird. 
Zumal habe ich im ersten Beispiel sinngemäss folgendes Konstrukt:
if( naechstesCurrent == null ||
    diesesCurrent > naechstesCurrent) 
Das heisst die Logic sagt das der current accaunt aufjedenfall grösser als der nächste 
ist wenn dieser null ist.
Aber mein gott muss ich mich ein Jahr später mit dieser Logik auch befassen wenn ich mich
in das Projekt einlese? Nein nicht wirklich ich habe es in eine Methode gepackt die das abhandelt, wie die Methode implementiert ist brauch ich mir erst anzuschauen wenn ichs wirklich wissen muss. 

Ist vielleicht kein Top Beispiel aber ich hoffe ich das macht klar was ich meine.


----------



## squeaker (24. Juni 2004)

Warum diskutieren wir eigentlich wenn wir sowieso einer Meinung sind?


----------



## Christian Fein (24. Juni 2004)

> _Original geschrieben von squeaker _
> *Warum diskutieren wir eigentlich wenn wir sowieso einer Meinung sind? *



Keine Ahnung
weil es spass macht?


----------



## squeaker (24. Juni 2004)

Ich dachte du willst mich zum Gold-Mitglied machen *G*

Dann werde ich mal ein Gegenbeispiel auftreiben:


```
// Reverse the 32-bits in EAX, leaving the result in EBX:
                     mov( 32, cl );
RvsLoop:    shr( 1, eax );    // Move current bit in EAX to the carry flag.
                     rcl( 1, ebx );    // Shift the bit back into EBX, backwards.
                     dec( cl );
                     jnz RvsLoop
```

Dies ist der einfache - triviale und übersichtliche Code. Dummerweise muss die Schleife 32 mal durchlaufen werden um bei einem 32bit Register die Bits umzudrehen.

Hier der Optimierte Code:


```
//optimierte Version
     mov( eax, edx );         // Make a copy of the odd bits in the data.
     shr( 1, eax );           // Move the even bits to the odd positions.
     and( $5555_5555, edx );  // Isolate the odd bits by clearing even bits.
     and( $5555_5555, eax );  // Isolate the even bits (in odd posn now).
     shl( 1, edx );           // Move the odd bits to the even positions.
     or( edx, eax );          // Merge the bits and complete the swap.
  
     mov( eax, edx );         // Make a copy of the odd numbered bit pairs.
     shr( 2, eax );           // Move the even bit pairs to the odd posn.
     and( $3333_3333, edx );  // Isolate the odd pairs by clearing even pairs.
     and( $3333_3333, eax );  // Isolate the even pairs (in odd posn now).
     shl( 2, edx );           // Move the odd pairs to the even positions.
     or( edx, eax );          // Merge the bits and complete the swap.
 
     mov( eax, edx );         // Make a copy of the odd numbered nibbles.
     shr( 4, eax );           // Move the even nibbles to the odd position.
     and( $0f0f_0f0f, edx );  // Isolate the odd nibbles.
     and( $0f0f_0f0f, eax );  // Isolate the even nibbles (in odd posn now).
     shl( 4, edx );           // Move the odd pairs to the even positions.
     or( edx, eax );          // Merge the bits and complete the swap.
 
     bswap( eax );            // Swap the bytes and words.
```

ich fürchte ohne Kommentare wäre er a) schlecht wartbar und b) unverständlich. Allerdings ist die Optimierung eine substantielle Geschwindigkeitsverbesserung die nicht ungenutzt bleiben darf wenn diese Operation häufig gebraucht wird.

Du bist dran


----------



## Christian Fein (24. Juni 2004)

Mensch das Assembler nicht ohne weiteres lesbar ist wenns komplexer wird 
ist ja nun wirklich keine Überraschung


----------



## squeaker (25. Juni 2004)

es ist immerhin schon High Level Assembler (ein Präprozessor für verschiedenen Assembler der Hight Level Konstrukte in den jeweiligen Assemblercode übersetzt und eine Bib bereit stellt - ist für asm lernen gedacht).

Aber der Algorithmus wäre auch in Java nicht lesbarer. Er arbeitet mit logischen Tricks auf Bitebene.


----------

