c#
Geizhals » Forum » Programmierung » c# (56 Beiträge, 636 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
..........
Re(10): richtige sprache
28.11.2005, 18:06:53
Wieso denn ?

Innerhalb deiner Klassen bist eh oft prozedural...

Und sauberes OO-Design ist etwas für Leute, die IMHO jahrelang programmiert haben - mit 2stelligen Wochenstundenanzahlen - sonst wird das nix (Kann aber auch an meiner persönlichen Präpotenz liegen ;-) ).

Versteh' mich nicht falsch... Objektorientiert Coden hat durchaus seine Berechtigung und einige Aufgabenstellungen (die ich aber nicht direkt am erzeugten Code sondern eher an der Organisation der Entwickler sehen würde) lassen sich so superst lösen... Abgesehen davon läßt sich durch den Verkauf von
Klassenbibliotheken auch wieder Kohle verdienen ;-)

Ich liefere Dir aber noch ein Killerbeispiel, warum ich OO nicht für Anfänger gut finde:
http://www.objectmentor.com/resources/articles/Walking_through_A_UML_Design.pdf

Das schöne an dem Beispiel ist:
1.) Es ist logisch
2.) Sie haben Recht
3.) zeige mir zum Vergleich, wie das ein Programmier-Anfänger in seinen ersten 2 Jahren gelöst hätte ;-)

Traurig dabei ist, daß ich mir die Aufgabenstellung anfangs selbst zu Gemüte geführt habe - und daß ich bei weitem nicht so weit gekommen wäre wie sie... Wobei ich seit 23 Jahren code (nun gut, viell. bin ich zu alt ;-) ) - und immerhin 2-3 Jahre OO gecoded habe (allerdings Turbo-Pascal V5.5 ;-) ).

Wie auch immer... OO ist ein sehr umfangreiches Instrumentarium, und alleine zum Erlernen der Designpatterns (die nicht einmal zwischen Sprachen portabel sind) - und dem Durchdenken-ausprobieren-Erfahrungen sammeln - braucht man IMHO locker ein Jahr...

Der Vorwurf "sich via proz. Coding falsche Wege einlernen" stimme ich auch nicht zu... Denn jeder, der wie ich in den frühen 80ern auf ZX-81, C=64, ... begonnen hat, lernte sich zwangsweise Spaghetti-Code ein (egal ob Basic oder Assembler) - und ich denke, daß ich inzwischen sauberst prozedural code ;-)

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
..............
Re(14): richtige sprache
28.11.2005, 18:56:42
Natürlich kostet der Umstieg /immer/ Zeit... Keine Frage. [Habe ich eh mit meinem Beispiel auch bestätigt ;-)]

Nur hat ein absoluter Anfänger im Programmieren eben IMHO die Wahl:
Variante 1:
-) Syntax lernen
-) "Zerlegen von Problemen lernen" - sinnvolle functions
-) Trial-und-Error der Implementierung

oder
Variante 2:
-) mehr Syntax lernen (zB scheint mir OO ohne Templates wenig zielführend... Sie erscheinen mir aber weder portabel noch trivial [noch etwas, wo ich Java als sinnlos kastriert empfinde ;-)])
-) Design-Patterns lernen
-) UML lernen (wie soll er sonst designen)
-) in UML dann das "Zerlegen von Problemen lernen":
Was kommt in eine Factory, was wird Abstract, ...
-) Trial-und-Error der Implementierung

Also die "erste Hürde" scheint mir bei Prozedural geringer ;-)

Und zu deinem "Im Prozeduralen ist alles statisch"... Nun ja, dann wird's aber schwierig, Callbacks unterzubringen... Als möglicher Ersatz eines Delegates, ... ;-)

Im Gegenzug könntest den Prozedural'lern ja beim Wechsel zu OO sagen "Jetzt kommt nur noch eine andere Art von Callbacks" und fertig sind wir mit OO ;-).

OO verwendet IMHO größtenteils einen sehr marketingwirksamen neuen Namen für alte Konzepte... Nur zwingt dich OO von Haus aus zu Objekten - also zu /mehr/ zum Lernen.

Anyways, wer schon ein paar Sprachen kennt, hat so oder so leichter lachen... Ich will ihm ja auch nicht OO komplett ausreden - nur als allererster Programmieransatz ist's hart (da war aber IMHO auch schon das von allen so gelobte Lisp hart... An die Listen muß man sich erst mal gewöhnen ;-) ).

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
....
Re(4): richtige sprache
28.11.2005, 18:15:50
glut et al würde ich auf dem Zielsystem voraussetzen... Damit hast schon eine saubere, portable Basis....

Das mit dem "genauso performant" kann hingegen nicht stimmen - die Frage ist nur, ob es Relevanz hat ;-)

Ad design patterns siehe mein voriges Posting... Bei Spielen machen sie absolut Sinn - zB austauschbare AI und ähnliches - nur ist das eben /gleichwertig/ zum registrieren von Callbacks (was anderes ist ja eine VMT eh nicht).

Tatsächlich kosten aber VMT-Aufrufe ordentlich Zeit - die man bei prozedural sparen kann...

IMHO machen die OO-Freunde immer folgenden Fehler:
Sie vergleichen die Performance einer APP, die einer in C++ geschrieben hat (unter impliziter Ausnutzung aller "Beschleunigungen", die saubere, mitgelieferte Klassen schon brachten wie zB perfect hashes) - und stellen die Performance einer C-App gegenüber, wo der Programmierer viel "selbstgestrickt" hat bzw. nicht die passenden gnu-libs verwendet hat...

Das Ergebnis von sowas ist klar: C++ zumindest gleich schnell bei großen Daten - und definitiv besser wartbar. Tatsächlich sehen sauber optimierte C-Programme aber meist komplett anders aus als in den Vergleichen  ;-)

Ein Beispiel, das IMHO für mich spricht:
Eclipse mit Swing. Eclipse ist auf meinem 1GHz-Lappy mit 512MB Ram IMHO saulangsam - verglichen mit Delphi (brav prozedural geschrieben) auf meinem Pentium133 mit 64MB Ram... Und das /trotz/ JIT, ...
Und ich denke schon, daß die Jahre an Entwicklungszeit, die dazwischen liegen, eigentlich bewirken müßten, daß bei gleicher Funktionalität des Outputs, zumindest gleich guten Entwicklern und gleich performanten Ansätzen Eclipse heute flotter sein müßte...

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
.....
Re(5): richtige sprache
28.11.2005, 18:32:10
GLUT mag das WGL und GLX wrappen.... PBuffer sind trotzdem immer noch ein Saukrampf, und definitiv nötig für diverse Effekte (Render-to-Texture-basierte). Aber es gibt wie gesagt die neue Framebuffer Objects (FBO) Extension, die die PBuffer ersetzen soll, aber die ist immer noch eine EXT und keine ARB Extension, und daher noch nicht so verbreitet.

Womit wir eh beim erwähnten Hauptproblem der Portabilität sind... GLUT mag Anwendungscode kapseln (also generelle WGL/GLX Initialisierung), aber Extensions können immer noch ein Krampf sein, und zwar nicht nur Cross-Platform (also Betriebssystemübergreifend), sondern auch Cross-GPU (ATI/NVIDIA/andere).

Die Situation ist mit OpenGL 2.0 und dem ARB-ratifizierten ARB Fragment/Vertex Programs sowieo der GL Shading Language (GLSL) schon besser geworden als zu Zeiten wo jede GPU-Architektur eigene vendor-spezifische Extensions mitbrachte für Shader.

Trotzdem gibt es immer noch Punkte wo genau dieser Faktor ziemliche Kopfschmerzen bereitet. Das geht soweit dass selbst die Default-Werte für die States in OpenGL oft anders sind bei ATI/NVIDIA (wobei hier generell eher vermutet wird dass hier ATI pfuscht).

Ad C vs C++:
Dein Argument ist, dass man in C viel optimieren kann wenn man selbst strickt (und quasi die Wartbarkeit verschlechtert) - nur, dann kann man genauso das Argument gelten lassen, dass man in C++ dieselben Optimierungen anwenden kann (da C++ ja großteils eine Obermenge von C ist)... wenn man eh auf Wartbarkeit schei*t, kann man ja beides in derselben Weise optimieren. Obwohl man da natürlich diskutieren kann ob ein C++ Code der großteils gleich wie C Code ist noch C++ Code ist... aber C++ ist wie gesagt definiert als (großteils) Obermenge von C (Natürliche Zahlen sind ja auch Reele Zahlen, da Reele Zahlen eine Obermenge der Natürlichen ist - nur um mal ein mathematisches Beispiel zu bringen).


Ad Delphi: Die Delphi IDE wurde auch objektorientiert programmiert, und zwar in der Delphi-eigenen VCL Library.












Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
......
Re(6): richtige sprache
28.11.2005, 18:45:35
Ad Delphi...
Delphi wurde mal in Assembler geschrieben... Zumindest steht das als protzig im Delphi(1)-Manual ;-) [was ich ihnen aber auch nicht so glaubte, hehe]

C ist IMHO (und hier zugegeben sehr IMHO ;-) ) eine Obermenge von C++, weil du mehr Möglichkeiten hast.

C++ ist einfach in vielen Punkten restriktiver - was ja Sinn macht.... Aber nachdem sich C++ in C transformieren läßt (Bin mir jetzt unsicher, aber war g++ nicht gaaanz am Anfang ein C++ -> C-Converter ???) aber C nicht in C++ (weil's dasselbe bleibt ;-) ) ... Nun ja, IMHO eine Frage des Blickpunktes.

IMHO bringen objektorientierte Sprachen die saubere Kapselung der Objekte mit Members und Methoden... Nur erkenne ich oft erst auf den 2. Blick (und mit viel gutem Willen, hehe) den Unterschied zur Kapselung von priv. Variablen und Funktionen in Bibliotheken. IMHO lassen sich oft (und sogar aus derselben Abstraktionsschicht) dieselben Probleme auf demselben Weg in C lösen (wo du halt Libraries verwendest) oder in C++ (Wo du halt Klassen verwendest).

Wobei C und C++ hier natürlich nur beliebige Repräsentanten für Proz. vs. OO sein sollen....

Zu meinem Beispiel mit dem C/C++-Source:
In OO verwendest du oft automatisch fertige Klassen, die schon brav optimieren - weil du es oft gar nicht anders sinnvoll realisieren kannst (zB Java-Hashtable). Bei proz. Source mußt du halt (zB) die gnu-Bibliotheken kennen, sonst schreibst halt schnell sinnlosen Schrott.

Lernen mußt du da wie dort zum sinnvoll Coden - hier die Klassenbibliotheken, dort die "normalen" Libs - wobei in der proz. Welt gerne und oft die Libs nicht genutzt werden... Leider. Insoferne bietet OO durch manche Restriktionen gerne auch oft mal saubereren Code... Zugegeben (so eben in öfters gesehenen "Vergleichstests".

Trotz allem erscheint es logisch und einsichtig, daß VMT-Zugriffe, late-Binding, ... Zeit kosten /müssen/ - und nicht zu knapp.

Aber ich gab' eh schon anfangs zu: Die Frage ist nur, ob das Performance-Delta Relevanz hat ;-)

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
.......
Re(7): richtige sprache
29.11.2005, 00:13:23

Ad Delphi...Delphi wurde mal in Assembler geschrieben... Zumindest steht
das als protzig im Delphi(1)-Manual  [was ich ihnen aber auch nicht so
glaubte, hehe]


Der Compiler, ja. Der ist auch wirklich sauschnell. Die IDE wurde aber mit dem Delphi-Compiler selbst sowie der mitgelieferten Visual Component Library (VCL) gemacht.


C ist IMHO (und hier zugegeben sehr IMHO  ) eine Obermenge von
C++, weil du mehr Möglichkeiten hast.C++ ist einfach in vielen Punkten
restriktiver - was ja Sinn macht....


Das halte ich für absolut falsch :)

C++ ist definitiv eine sprachliche Obermenge von C, da in C++ die meisten C Sprachkonstrukte genauso funktionieren.

C++ ist nur dann restriktiv wenn du es so machst (was oft Sinn macht), aber es ist kein Zwang dazu.


Aber nachdem sich C++ in C transformieren
läßt (Bin mir jetzt unsicher, aber war g++ nicht gaaanz am Anfang ein C++ ->
C-Converter ???) aber C nicht in C++ (weil's dasselbe bleibt  ) ... Nun ja,
IMHO eine Frage des Blickpunktes.


Ich spreche jedenfalls von der sprachtheoretischen Obermenge die auch etwa in Compilerbau sowie Theorie der Informatik diskutiert wird (kontextfreie Grammatiken usw.).


IMHO bringen objektorientierte Sprachen die
saubere Kapselung der Objekte mit Members und Methoden... Nur erkenne ich oft
erst auf den 2. Blick (und mit viel gutem Willen, hehe) den Unterschied zur
Kapselung von priv. Variablen und Funktionen in Bibliotheken. IMHO lassen sich
oft (und sogar aus derselben Abstraktionsschicht) dieselben Probleme auf
demselben Weg in C lösen (wo du halt Libraries verwendest) oder in C++ (Wo du
halt Klassen verwendest).


Libraries hast du in C++ genauso, das ist eigentlich eine andere Ebene. Die Kapselung an sich ist ja noch nicht wirklich das OO Kriterium per se (sondern nur die mittlerweile fast 30 Jahre alte OO-Grundidee, "reale Objekte" auf Software-Strukturen abzubilden). Erst die Vererbung bzw. das Superkonzept/Subkonzept Prinzip ist das wirklich entscheidende.


Wobei C und C++ hier natürlich nur beliebige
Repräsentanten für Proz. vs. OO sein sollen....


Wobei wie gesagt C++ sowohl prozedural als auch objektorientiert ist, also C quasi miteinschließt...


Zu meinem Beispiel mit dem
C/C++-Source:In OO verwendest du oft automatisch fertige Klassen, die schon
brav optimieren - weil du es oft gar nicht anders sinnvoll realisieren kannst
(zB Java-Hashtable). Bei proz. Source mußt du halt (zB) die gnu-Bibliotheken
kennen, sonst schreibst halt schnell sinnlosen Schrott.Lernen mußt du da wie
dort zum sinnvoll Coden - hier die Klassenbibliotheken, dort die "normalen"
Libs - wobei in der proz. Welt gerne und oft die Libs nicht genutzt werden...
Leider. Insoferne bietet OO durch manche Restriktionen gerne auch oft mal
saubereren Code... Zugegeben (so eben in öfters gesehenen "Vergleichstests".
Trotz allem erscheint es logisch und einsichtig, daß VMT-Zugriffe,
late-Binding, ... Zeit kosten /müssen/ - und nicht zu knapp.Aber ich gab' eh
schon anfangs zu: Die Frage ist nur, ob das Performance-Delta Relevanz hat  


Wie gesagt, bei einfachen Sortierprogrammen mag dieses Performance-Plus Relevanz haben, heutige Software ist in der Regel komplex genug, dass man eher das Nachsehen hat wenn man wirklich alles selber programmiert oder "allzu low-level" programmiert (ich denk nur an Multithreading).

Und nachdem C++ eine Obermenge von C ist, also die C-Konstrukte mehr oder weniger komplett einschließt, lassen sich für performance-kritische Abschnitte durchaus Dinge "in C" lösen.

Außerdem ist algorithmische Effizienz um einges wichtiger heutzutage als die paar CPU-Zyklen, die man durch C-Rumhackerei einspart (speziell bei heutigen Rechnerarchitekturen, wo Instruktionen nicht mehr unbedingt sequentiell abgearbeitet werden bzw bei Parallelverarbeitung).



Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
........
Re(8): richtige sprache
29.11.2005, 10:20:59

Außerdem ist algorithmische Effizienz um einges wichtiger heutzutage als die paar CPU-Zyklen, die man durch C-Rumhackerei einspart (speziell bei heutigen Rechnerarchitekturen, wo Instruktionen nicht mehr unbedingt sequentiell abgearbeitet werden bzw bei Parallelverarbeitung).


Aber genau drum geht's mir ja im Beispiel... Durch die Implizite Verwendung von Hashtables hast halt ein O(ld(n)) oder so... wärend du beim Standard-faulen-C-Coder halt oft ne primitiv verkettete Liste siehst (so auch gelernt in Algodat ;-) ) - mit O(1).

VMT kann teuer werden, wenn du wirklich am Ende der Leistungsfähigkeit des Proz. codest... zB die guten alten 3D-Spiele mit Raycasten via Vesa-Treiber oder ModeX... Oder beim Kernel schreiben... Funktionen, die 1000x/sec aufgerufen werden, würde ich ungern sauber in OO sehen..

Anyways, wir kommen ab - und ich will ja OO nicht verteufeln, mag es aber auch nicht als den heiligen Gral sehen ;-).

Außerdem habe ich den Verdacht, daß die große Reusability, die in OO als /das/ Marketingargument gesehen wird, in Wirklichkeit so ein dickes, fettes, ausgefressenes trojanisches Pferd ist - daß sich die unschuldigen Programmierer eingetreten haben ;-)

Denn /natürlich/ ist das besser reusable... Allerdings mußtest Du dann um soviel mehr Zeit in das Design stecken, daß du ein Produkt, das Du sonst nur 1x hättest verkaufen müssen (um die Kosten reinzukriegen) nun in mind. 4x verkaufen mußt ;-)

Für StandardSW scheint OO weiter sehr gut - bei IndividualSW wird's wohl noch schwieriger, den Aufwand zu rechnen...

War auf jeden Fall ein netter Thread mit Dir!

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung