Was ist für euch guter Programmcode?
-
Mecnels schrieb:
Nur ein gut gemeinter Rat.
Der dummerweise völliger Käse ist.
Konstanten dürfen WIRKLICH nur ein einziges Mal definiert werden, und sind deshalb nicht dafür geeignet, in einem Header zu stehen.
Käse. Konstanten können ganz wunderbar in Headern stehen. const heißt in C++ automatisch static, also internal linkage. Desweiteren sind Integerkonstanten in C++ Compile-Zeit-Konstanten, d.h. es wird, sofern du nicht die Adresse der Konstanten bildest, kein Speicher benötigt.
Stell Dir vor, du benötigst den selben Header in den unterschiedlichsten Modulen, dann kannst Du Dir mit Konstanten, die im Header stehen, vom Compiler üblicherweise anhören, dass doppelte Definitionen von Konstanten nicht erlaubt sind, was Konstanten völlig ungeeignet macht, mehreren Modulen zur Verfügung zu stehen
Käse. Wahrscheinlich hast du irgendwann mal geschrieben:
const char* bla = "Fred";
und dann hat sich dein Linker beschwert (zurecht) und du hast die völlig falschen Schlüsse gezogen.
-
HumeSikkins schrieb:
Mecnels schrieb:
Nur ein gut gemeinter Rat.
Der dummerweise völliger Käse ist.
was sogar ich als neuling weiß, weil ichs in meinen paar miniprogrammen, die ich bis jetzt nur erstellt hab, verwendet habe. Mecnels, du hast einfach keine praktische erfahrungen mit sowas. nichts gegen das gedankenexperiment an sich, aber ab und an sollte man seine theorien in der praxis erproben.
ich meine, ich bin durchaus kein anhänger von gruppenzwang, aber wenigstens könntest du doch inzwischen (nachdem sich immer noch niemand FÜR deinen programmierstil ausgesprochen hat) mal auf die idee gekommen sein "hey, ich probier einfach mal aus, was die da die ganze zeit beschreiben". was würdest du schon verlieren? entweder hast du recht, dann kannst du viel aufrichtiger deine meinung weiterhin vertreten, oder wir haben recht, dann kannst du dich verbessern. und ist es nicht dein ziel, dich weiterzuentwickeln, dich und das, was du erschaffst, immer weiter zu verbessern?
-
Mecnels schrieb:
Zahl und Vektor haben soviel gemeinsam wie Auto und Regenwurm, und niemand konvertiert Autos in Regenwürmer.
Das will auch niemand machen...
Aber was stört dich zB an explicit für den Ctor?Wenn dein Vektor einen Ctor mit nur einem int als Param nehmen würde, dann würde dein Grund gegen op+ als non member zutreffen.
Natürlich würde man dann den Ctor explicit deklarieren und eine Konvertierung findet nicht statt.
Interessanterweise hast du ohne explicit aber enorme Probleme:
void f(Vektor); f(1);
würde plötzlich gehen.
schlimm schlimm
Deshalb ist explicit keine spielerei die unnötig ist, sondern essentiell.
Natürlich ist op+ als member kein fehler, solange du nur vektors miteinander addierst.
aber wenn du einen neuen op+ dazu gibst, dann hast du einen op+ als member und einen als non member. das stört doch die konsistenz, oder?
ich mag es, wenn sachen die zusammen gehören an einer stelle sind.
-
besserwisser schrieb:
was sogar ich als neuling weiß, weil ichs in meinen paar miniprogrammen, die ich bis jetzt nur erstellt hab, verwendet habe. Mecnels, du hast einfach keine praktische erfahrungen mit sowas. nichts gegen das gedankenexperiment an sich, aber ab und an sollte man seine theorien in der praxis erproben.
Du hast ganz recht, von ein paar miniprogrogrammen sollte man wirklich nicht auf die Praxis schließen.
In der Praxis interessiert es die Verwender Deiner Funktionen überhaupt nicht, wie Du irgend etwas implementiert hast, die erwarten nämlich nur, dass die Schnittstelle eine Schnittstelle ist, sprich, das macht, was draufsteht, wenn sie sie verwenden wollen. (Genau dazu kapselt man nämlich die internen Daten - um den tatsächlichen Umfang der Klasse zu verstecken und dem Anwender zu ersparen, sich Gedanken darüber zu machen, warum die Schnittstelle funktioniert)
Irgendwie seid ihr komische Käuze, die einen verteufeln es, Microsoft Code als Vorbild zu nehmen, ist ja klar, er wird ja auch nur von den bestbezahlten Spitzenprogrammierern der Welt entwickelt (aber ihr wisst es ja sicher besser).
Die anderen wie unwissender und Shade schreiben ein paar Miniprogramme wie TicTacToe und wollen einem einreden, dass man seit 20 Jahren und nach einigen hundert Projekten praxisfern arbeitet.
Bedenklich ist nur, dass Euch Eure eigenen Widersprüche gar nicht auffallen, weil Ihr Euch so auf mich eingeschossen habt.
Nehm's Euch trotzdem nicht übel, empfehle unwissender einfach einmal, C++ Das Grundlagen Buch (auch wenn's viel Arbeit ist, 1000 Seiten durch zu ackern), das ist nämlich wirklich eines der besseren Bücher, die im Laufe der letzten Jahre erschienen sind. Und wenn dann die Grundlagen einmal sitzen, dann seht Ihr vielleicht einige meiner Diskussionsbeiträge in einem anderen Licht, fürchtet Euch nicht mehr, Zeiger einzusetzen, wo sie nötig sind usw.
Bis dann.
-
Du Hirn. Wir fürchten uns nicht, Zeiger einzusetzen. Es geht darum, Zeiger zu wrappen, damit man weniger Dinge vergessen kann. Wenn ich nen auto_ptr hab, kann ich das deleten nicht vergessen, auch nicht bei Exceptions. Wenn ich nen vector nehme, kann ich das deleten nicht vergessen und ne Indexprüfung einbauen.
Du krasser Ober-Hacker vergisst sowas natürlich sowieso nicht. Das passiert nur uns. Die anderen haben wirklich gute Gründe vorgetragen für bestimmte Dinge und nicht nur ich habe dir eine ganz konkrete Buchempfehlung ausgesprochen.
Dein Alterstarrsin kann einen ganz schön auf den Keks gehen. Seit wann arbeiten bei Microsoft Spitzenprogrammierer? Natürlich wird es dort auch gute geben, genauso wie es dort auch schlechte geben wird und falls du es noch nicht gemerkt hast:
DAS WINDOWS API IST C OHNE ++ !!Und was du codest ist auch C ohne ++ vielleicht noch mit Klassen. Zum letzten mal: Lies Scott Meiers. Und lerne C++ damit. Du bist nicht im Recht, nur weil du dich als alten Hasen siehst. Und wenn du glaubst, das Shade noch nichts anderes als ein TicTAcToe zustande gebracht ha, täuscht du dich. Das war ein Design-Experiment, etwas was dir anscheinend überhaupt nichts sagt.
</Diskussion>
-
MecnelsAmArbeitsplatz schrieb:
In der Praxis interessiert es die Verwender Deiner Funktionen überhaupt nicht, wie Du irgend etwas implementiert hast, die erwarten nämlich nur, dass die Schnittstelle eine Schnittstelle ist, sprich, das macht, was draufsteht, wenn sie sie verwenden wollen.
Ich rede nicht von Client Code. Denn dann dürften wir uns nur die Schnittstelle ansehen, aber nicht die Implementierung. Und um eine Schnittstelle beurteilen zu können, braucht man viel wissen um die Domain.
Es geht hier um die Implementierung. Und da spielt wartbarer Code eine sehr große Rolle, oder schreibst du nur wegwerfcode? Vermutlich nicht, deshalb ist es wichtig, dass er wartbar bleibt. Und da ist die Implementierung durchaus interessant (schließlich kann man an der Schnittstelle nicht viel warten ;))
Irgendwie seid ihr komische Käuze, die einen verteufeln es, Microsoft Code als Vorbild zu nehmen, ist ja klar, er wird ja auch nur von den bestbezahlten Spitzenprogrammierern der Welt entwickelt (aber ihr wisst es ja sicher besser).
WinAPI Code ist nicht schön. Kann dir jeder hier bestätigen.
Natürlich ist er funktionell und es ist eine wahnsinns Leistung von MS die Winapi so stabil zu halten. Aber sie ist auch eine C API, deshalb sind einige Designentscheidungen in C++ nicht vertretbar. Denn C++ und C sind halt doch 2 verschiedene Sprachen.Die anderen wie unwissender und Shade schreiben ein paar Miniprogramme wie TicTacToe und wollen einem einreden, dass man seit 20 Jahren und nach einigen hundert Projekten praxisfern arbeitet.
Wie kommst du darauf?
Ich habe sicher nicht mehr Erfahrung als du, aber ich bin auch schon ein paar Jahre "in the real world". Habe als doch ein wenig einblick.Bedenklich ist nur, dass Euch Eure eigenen Widersprüche gar nicht auffallen, weil Ihr Euch so auf mich eingeschossen habt.
Oh, sehr schön. Welche denn? Ich will ja lernen...
Aber du bringst leider kaum Argumente
Wie soll ich dann je besser werden? Ich lege meine Argumente offen da, du kannst nachfragen (und wenn es dir gelingt, mich in widersprüche verstricken) usw. aber du zeigst leider kaum argumentedas macht die sache recht schwer darüber zu diskutieren.
zB welche vorteile haben #defines gegenüber konstanten?
warum sind wrapper böse?
was spricht gegen explicit bei einem ctor der nicht zur konvertierungen verwendet werden soll?
usw.Und wenn dann die Grundlagen einmal sitzen, dann seht Ihr vielleicht einige meiner Diskussionsbeiträge in einem anderen Licht, fürchtet Euch nicht mehr, Zeiger einzusetzen, wo sie nötig sind usw.
Bitte erklär deinen Standpunkt doch.
Und lies bitte was ich schreibe. Ich habe nicht gesagt: verwende keine Zeiger, sondern ich habe gesagt: wrappe sie lieber.Ich würde von mir nie behaupten C++ zu beherrschen (außer einem Personalchef gegenüber ;)) aber die Grundlagen kann ich mittlerweile schon ganz gut. Und Zeiger stellen für mich auch kein Problem da. Aber dennoch finde ich es schöner, mich nicht darum kümmern zu müssen, weil es ein Wrapper macht.
Das spart mir Zeit und reduziert die Fehlerquellen und das bedeutet weniger Zeit geht für das Debuggen drauf. Und das macht mich glücklich
btw: ich habe den heutigen Vormittag damit verbracht den Code für die Anwendung die ich gerade schreibe zu kürzen und ein neues Modul eingeführt
Das erlaubt leichtere erweiterung des Codes, weil man nun nur ein kleines Modul ändern muss um neue Funktionalität hinzufügen zu können, statt wie vorher direkt im Source code an 2 stellen die änderungen vorzunehmen.
-
MecnelsAmArbeitsplatz schrieb:
Irgendwie seid ihr komische Käuze, die einen verteufeln es, Microsoft Code als Vorbild zu nehmen, ist ja klar, er wird ja auch nur von den bestbezahlten Spitzenprogrammierern der Welt entwickelt (aber ihr wisst es ja sicher besser).
Tut mir leid, aber looooooooooooooooooooooool
Guck Dir den Code an, dann weißt Du wie man NICHT programieren sollte. Wenn die so toll wären, hätten sie dann so übermäßig viele Sicherheitslücken?
Wenn Du guten Code sehen willst, dann guck Dir z. B. Linux, POSIX, Boost und co. an.
Jetzt muss ich mich weiter tot lachen
-
Wahrscheinlich ist das Feld der C/C++ Programmierung wirklich so weit gesteckt, dass man so leicht aneinander vorbeireden kann.
Ganz kurz zu den Schnittstellen, ein sehr gutes Beispiel ist DirectX:
Als Programmierer habe ich nun mal nicht wirklich Interesse daran, wie genau ein Funktion implementiert ist, die Oberflächen kopiert, Blitts durchführt, Ein CooperativeLevel für ein Device setzt usw. usf. Trotzdem sind das alles Funktionen, und zwar alles durchweg solche, die NICHT in zehn Zeilen codiert sind! Ärgert Dich die beschränkte Mächtigkeit/Einsetzbarkeit Deiner Minifunktionen denn nicht selber? Alles was Du davon hast ist ein Bezeichnerwildwuchs, der ziemlich leichte Aufgaben plötzlich total kompliziert erscheinen lassen. Man kann es so wie Du machen und 20 oder noch mehr Module schreiben. Stattdessen kann man die Aufgabe auch analysieren:
1.) Abwechselnd setzen zwei Spielteilnehmer Jetons oder dergleichen auf ein 3x3 grosses Spielfeld. (== Problemstellung)Aha, also brauchen wir Klassen für Jetons und Felder, die jeweils ein ELEMENT des gesamten Spieles sind.
Das GESAMTE Spiel OPERIERT mit diesen ELEMENTEN, und dementsprechend stecken wir die Felder und Jetons in eine Klasse TicTacToe, die in ihren Elementfunktionen mit Objekten der Klasse Jetons und solchen der Klasse Feld operiert.Das ist meiner Meinung nach jedenfalls der Sinn der Objektorientierung:
Die Möglichkeit, kompliziertere Datentypen als einfache Zahlen und kompliziertere Operationen als einfache Additionen aus der Sicht des Programmierers mit ihrem Namen anzusprechen, das meinte ich mit Baukastenprinzip: Du baust Dir die Objekte, die Du brauchst, aus den einfachen ganzzahligen Datenobjekten allmählich zu einem sehr großen, die Problemstellung lösendes Objekt, zusammen.Aber das ist glaube ich wirklich nur eine Frage der allgemeinen Programmierphilosophie, wie man zu Werke geht, und sicher nicht ein Grund, sich darüber zu streiten, wie es denn nun richtiger gehen müsste:
Denn jedenfalls lösen wir trotz aller Unterschiede unsere Problemstellungen doch immer zufriedenstellend für unsere Chefs.
-
ROFL schrieb:
Wenn Du guten Code sehen willst, dann guck Dir z. B. Linux, POSIX, Boost und co. an.
Jetzt muss ich mich weiter tot lachen
Genau auf so einen Kommentar habe ich gewartet.
Erstens: Linux ist Vodoo. Die Anhänger schwärmen, dass man damit alles machen KANN, sagen aber nicht dazu, dass man damit auch alles selber machen MUSS, um dem Rechner Vernünftiges zu entlocken.
Ich finde es deshalb bei uns hier in Österreich total verkehrt, dass an den Unis Linux-Rechner stehen, an denen die Studenten ausgebildet werden, wenn die armen dann von der Uni abgehen, verlangt plötzlich jeder Arbeitgeber, der gut zahlt, Win2000. Das Gejammer kenn ich nur zu gut von jüngeren Mitarbeitern bei uns. Lustiger Weise hat sich bei uns an den Hochschulen auch die Sitte herausgebildet, Java als Lehrsprache zu verwenden, wieder einmal sind sie auf einen kurzlebigen Trend (Hype heisst das heutzutage, oder?) hereingefallen, der sich mittlerweile offensichtlich tot gelaufen hat, und jetzt können die Jungs zwar Java aber das interessiert niemanden, weil sich C/C++ eben schon seit fast 30 Jahren und mehr bewährt hat. Die Plattformunabhängigkeit ist angesichts der langsamen Interpretation des Objektcodes einfach nicht überzeugend, schon gar nicht, wenn auf 90% aller Rechner sowieso das selbe OS werkelt. Aber ich mach ja die Lehrpläne nicht, denn dann würden die Leutchen viel besser auf das Leben vorbereitet von der Hochschule abgehen - indem man ihnen C/C++ anstatt Java beibringt und indem man sie vor Win2000 und nicht vor Substandard Linux Rechner setzt.
Nur wieder die Meinung eines alten Sturkopfes, aber ihr könnt ja weiterhin weghören.
-
Darf ich? Darf ich?
...ne, ich halt mich mal zurück, solange der letzte Beitrag nicht in einen neuen Thread ausgelagert wird.
-
Gregor schrieb:
Darf ich? Darf ich?
...ne, ich halt mich mal zurück, solange der letzte Beitrag nicht in einen neuen Thread ausgelagert wird.
Sorry hab ja vergessen dass auch ein Java-Fan mitdiskutiert (Interpretersprachen begeistern mich eben nicht, ist ja nur meine Meinung und deshalb sicher kein Fall für einen extra-Thread)
-
Mecnels schrieb:
Konstanten dürfen WIRKLICH nur ein einziges Mal definiert werden, und sind deshalb nicht dafür geeignet, in einem Header zu stehen.
Bei define ist das egal, weil da immer die letzte Definition gilt, die sich natürlich beim selben Header niemals von eventuell vorhergehenden Definitionen unterscheidet.Da fragt man sich wirklich, wer der komische Kauz ist.
Wie lang programmierst du schon? 20 Jahre? Da möchte man doch meinen, dass du es besser wissen solltest.
Mit #define angelegte Bezeichner darfst du jedenfalls nur einmal definieren. Das hat mit "die letzte Definition gilt" nix zu tun. Warum meckert nun der Compiler nicht? Ganz einfach, eine Mehrfachdefinition ist nur dann zulässig, wenn der Bezeichner exakt den selben Wert (bzw Ersetzung) hat, wie zuvor. Und da das bei der Einbindung der selben Header normalerweileder Fall ist, ist das Programm nicht ill-formed. Hinzu kommt, dass Header normalerweise mit Include-Guards versehen sind, und somit eine Mehrfachdefinition bereits damit verhindert wird.
Und mit Hilfe genau solcher Include-Guards kannst du ebenfalls problemlos richtige Konstanten in Headern verwenden. Ich hab jetzt nicht den ganzen Thread mitverfolgt, also wenn ich irgendwas wiederhole, dann bitte überspringen. Jedenfalls ist die Verwendung von defines als Konstanten in C++ schon deshalb unclever, weil der Präprozessor keine Namensräume kennt.Mecnels schrieb:
Irgendwie seid ihr komische Käuze, die einen verteufeln es, Microsoft Code als Vorbild zu nehmen, ist ja klar, er wird ja auch nur von den bestbezahlten Spitzenprogrammierern der Welt entwickelt
Gut bezahlt bedeutet noch lange nicht, auch gut in seinem Job zu sein. Kennst du persönlich MS Programmierer, dass du dich zu solchen Aussagen berufen fühlst?
ROFL schrieb:
Wenn Du guten Code sehen willst, dann guck Dir z. B. Linux, POSIX, Boost und co. an.
Willst du dich dem Niveau von Mecnels anpassen? (bitte keine Beschwerden bzgl. boost
)
-
MecnelsZuLinux schrieb:
...Lustiger Weise hat sich bei uns an den Hochschulen auch die Sitte herausgebildet, Java als Lehrsprache zu verwenden, wieder einmal sind sie auf einen kurzlebigen Trend (Hype heisst das heutzutage, oder?) hereingefallen, der sich mittlerweile offensichtlich tot gelaufen hat, und jetzt können die Jungs zwar Java aber das interessiert niemanden, weil sich C/C++ eben schon seit fast 30 Jahren und mehr bewährt hat...
Javs vs C++ @ Jobpilot.de
713 : 666^^
edit: direkt verlinken geht net. einfach mal bei jobpilot nach java und nach c++ suchen
-
MecnelsZuLinux schrieb:
ROFL schrieb:
Wenn Du guten Code sehen willst, dann guck Dir z. B. Linux, POSIX, Boost und co. an.
Jetzt muss ich mich weiter tot lachen
Genau auf so einen Kommentar habe ich gewartet.
Erstens: Linux ist Vodoo. Die Anhänger schwärmen, dass man damit alles machen KANN, sagen aber nicht dazu, dass man damit auch alles selber machen MUSS, um dem Rechner Vernünftiges zu entlocken.
Ich finde es deshalb bei uns hier in Österreich total verkehrt, dass an den Unis Linux-Rechner stehen, an denen die Studenten ausgebildet werden, wenn die armen dann von der Uni abgehen, verlangt plötzlich jeder Arbeitgeber, der gut zahlt, Win2000. Das Gejammer kenn ich nur zu gut von jüngeren Mitarbeitern bei uns. Lustiger Weise hat sich bei uns an den Hochschulen auch die Sitte herausgebildet, Java als Lehrsprache zu verwenden, wieder einmal sind sie auf einen kurzlebigen Trend (Hype heisst das heutzutage, oder?) hereingefallen, der sich mittlerweile offensichtlich tot gelaufen hat, und jetzt können die Jungs zwar Java aber das interessiert niemanden, weil sich C/C++ eben schon seit fast 30 Jahren und mehr bewährt hat. Die Plattformunabhängigkeit ist angesichts der langsamen Interpretation des Objektcodes einfach nicht überzeugend, schon gar nicht, wenn auf 90% aller Rechner sowieso das selbe OS werkelt. Aber ich mach ja die Lehrpläne nicht, denn dann würden die Leutchen viel besser auf das Leben vorbereitet von der Hochschule abgehen - indem man ihnen C/C++ anstatt Java beibringt und indem man sie vor Win2000 und nicht vor Substandard Linux Rechner setzt.
Nur wieder die Meinung eines alten Sturkopfes, aber ihr könnt ja weiterhin weghören.Schließe mich Gregor an! Tut mir leid, aber Java ist wohl alles andere als ein "Hype"...
Zu Linux: Tja, für die früheren Programmierer 1970-1995 war das selbstverständlich, daß man alles selber machen muß. Die Anwender die schwärmen, wie ich, wissen auch wie es geht.
Glaubst DU bei Windows war das schon immer so? Soundkarte rein, Plug'n Play und alles klappt? Das ist kein Verdienst der MS Programmierer, sondern der Hardware Industrie! Linux ist ein Unix und Unix == System für versierte Anwender
Falls Du weiter darüber diskutieren möchtest, dann eröffne einen neuen Thread!
Hier ist EOD
-
groovemaster schrieb:
Warum meckert nun der Compiler nicht? Ganz einfach, eine Mehrfachdefinition ist nur dann zulässig, wenn der Bezeichner exakt den selben Wert (bzw Ersetzung) hat, wie zuvor. Und da das bei der Einbindung der selben Header normalerweile
der Fall ist, ist das Programm nicht ill-formed.
Genau das habe ich ja gemeint.
Mecnels schrieb:
Irgendwie seid ihr komische Käuze, die einen verteufeln es, Microsoft Code als Vorbild zu nehmen, ist ja klar, er wird ja auch nur von den bestbezahlten Spitzenprogrammierern der Welt entwickelt
Ich glaub schon dass ich meinen Neffen noch kenne. So alt bin ich auch wieder nicht.
ROFL schrieb:
Wenn Du guten Code sehen willst, dann guck Dir z. B. Linux, POSIX, Boost und co. an.
Willst du dich dem Niveau von Mecnels anpassen? (bitte keine Beschwerden bzgl. boost
)[/quote]
Soll er sich etwa 20 Jahre Erfahrung aus dem Hut zaubern? Das ist nicht fair, was Du da verlangst.
Eine kleine Aufgabe für Euch, bin gespannt wer das von Euch schafft:
Ein C++ Programm enthalte die folgende Anweisung:
choose ("hour") (2,3);
Das war's schon. Wie ist diese Codezeile zu verstehen - rein syntaktisch betrachtet?
Alltag bei mir, für Euch wahrscheinlich eine harte Nuss.
Ein kleiner Tip, es hat etwas mit Zeigern zu tun.Schönen Tag noch.
-
@Shade
Ich würde von mir nie behaupten C++ zu beherrschen (außer einem Personalchef gegenüber )
Bitte würdige Dich nicht soweit herunter. Ich will mich demnächst auch bewerben und komme mir sonst wie ein Betrüger wenn ich dem Personaler was von meinen C++ - Kenntnisen erzähle.
Deine Klasse fühlt sich ziemlich STL-like an. Sicher ist es für die Dokumentation sinnvoll trotzdem Funktionen wie size, clear usw. zu kommentieren, aber sicher doch keine Todsünde es nicht zu tun, oder?
Ich würde von solchen Funktionen ohne Kommentare erwarten, das sie ganau das gleiche tun wie die Funktionen der STL.@all
Ich fand Gregor hat das Thema super auf den Punkt gebracht:
- wenig Redundanz
- relativ kurze Methoden
- aussagekräftige Variablennamen usw.
- ausgiebige Nutzung der Standardbibliothek (man soll sich keine eigene Liste schreiben, wenn es in der Standardbibliothek schon eine gibt)
- defensiver Programmierstil
- Verwendung üblicher Entwurfsmuster, wo diese Sinn machen
- Verwendung jedes sinnvollen Sprachmittels (der Code soll nicht unnötig kompliziert sein, weil sich der Programmierer nicht gut genug mit der Sprache auskennt)alles andere artet schon wieder zu sehr in sprachspeziefische Rumstreitereien aus (auch wenn ich dadurch das erste mal was von explicit gehört habe
). Es ging doch ursprünglich um guten Code im Allgemeinen.
-
Java als Lehrsprache zu verwenden, wieder einmal sind sie auf einen kurzlebigen Trend (Hype heisst das heutzutage, oder?) hereingefallen, der sich mittlerweile offensichtlich tot gelaufen hat
Hihi. Jaja, du kennst die Branche in- und auswendig. Du weißt, was aufm Markt so abgeht.
Dein Fan
-
TheBigW schrieb:
- wenig Redundanz
- relativ kurze Methoden
- aussagekräftige Variablennamen usw.
- ausgiebige Nutzung der Standardbibliothek (man soll sich keine eigene Liste schreiben, wenn es in der Standardbibliothek schon eine gibt)
- defensiver Programmierstil
- Verwendung üblicher Entwurfsmuster, wo diese Sinn machen
- Verwendung jedes sinnvollen Sprachmittels (der Code soll nicht unnötig kompliziert sein, weil sich der Programmierer nicht gut genug mit der Sprache auskennt)alles andere artet schon wieder zu sehr in sprachspeziefische Rumstreitereien aus (auch wenn ich dadurch das erste mal was von explicit gehört habe
). Es ging doch ursprünglich um guten Code im Allgemeinen.
Dich schickt der Himmel. Wir sollten wirklich wieder zum Thema des Threads zurückkehren, meine Beiträge habt ihr ja jetzt ausgiebig runtergemacht, drum bin ich echt mal auf Beiträge von Euch gespannt (ich freu mich schon wenn ich irgendwo ein define sehe und dann darauf herumhacken kann, auch wenn ich keinen blassen Schimmer habe, welche Funktion es in einem gegebenen Programm hat).
choose ("hour")(2,3);
Wie ich mir gedacht habe, fällt dazu keinem was ein, drum geb ich noch mal einen kleinen Tip: es hat etwas mit Funktionszeigern zu tun.
-
MecnelsBekehrt schrieb:
Ganz kurz zu den Schnittstellen, ein sehr gutes Beispiel ist DirectX:
Als Programmierer habe ich nun mal nicht wirklich Interesse daran, wie genau ein Funktion implementiert ist, die Oberflächen kopiert, Blitts durchführt, Ein CooperativeLevel für ein Device setzt usw. usf. Trotzdem sind das alles Funktionen, und zwar alles durchweg solche, die NICHT in zehn Zeilen codiert sind!Sind sie dass wirklich?
Keine Ahnung. Ich kenne den DirectX Code leider nicht. Ich kenne nur die Schnittstelle, deshalb kann ich darüber nichts sagen.Aber was spricht dagegen, dass DirectX intern eine Menge Funktionen verwendet?
Bedenke: ein Funktion kann andere aufrufen. Du würdest zB eine verschachtelte Schleife machen, ich würde vielleicht eine einfache Schleife machen, die in der Schleife eine Funktion aufruft, die wiederum eine Schleife beinhaltet.
Das Interface wäre das selbe. Insofern verstehe ich dein Argument nicht.
Ärgert Dich die beschränkte Mächtigkeit/Einsetzbarkeit Deiner Minifunktionen denn nicht selber?
Ne. Es ist ja nicht so, dass ich 100.000 kleine Funktionen der reihe nach aufrufe.
Ein gutes Beispiel ist hier die Unix Welt:
wie filtert man bestimmte dateien beim anzeigen eines ordners?
ls /foo/bar | grep filterman baut sich also sein "programm" zusammen.
ähnlich mache ich es. ich habe ls und grep als Funktion (welche intern wieder aus vielen funktionen bestehen) und wenn ich jetzt beides zusammen machen will, dann kommt ein funktion ls_und_grep die beides machtSo baue ich mächtige Funktionen.
Die Idee dahinter ist leichtere wartbarkeit.Alles was Du davon hast ist ein Bezeichnerwildwuchs, der ziemlich leichte Aufgaben plötzlich total kompliziert erscheinen lassen.
Nein, ist es nicht.
Beispiel aus meiner aktuellen Arbeit:
Ich habe die Funktion
createItemDisplayForm()
sie erstellt eine Form anhand 2 parameter - name und handle zu der existierenden form.sie arbeitet als factory und besteht aus lediglich einem switch()
in diesem switch wird der name gecheckt und je nachdem an die passende funktion weitergereicht.
diese funktion, zB CreateFooDisplayForm()
erstellt ein CreateControls Objekt und ruft pro control einmal AddControl auf (worstcase: 3 zeilen pro control) bei normalen etwa 4 controls hat die funktion etwa 10 zeilen.
weiters wird noch ein filter gesetzt, nochmals 3 bis 5 zeilen.
sind in etwa 13 zeilen die diese funktion hat.aber AddControl hat sogar nur 7 zeilen code.
es ruft CreateControl, CreateDataSource und CreateUpdater auf. mehr macht es im prinzip nicht.
CreateControl, CreateDataSource und CreateUpdate sind ähnlich kurz und erstellen konkrete Objekte.wie du siehst ist CreateItemDisplayForm durchaus mächtig und kann sehr viel.
aber es besteht aus nur wenigen zeilen code, keine 20 zeilen.CreateControl und Co kann man nun aber wunderbar erweitern, weil diese alle wieder eine factory sind. man kann also anhand ein paar zeilen änderung die anwendung um ein neues control erweitern, zur zeit etwa 2-3 zeilen code die man dafür braucht.
das ist schön und wäre mit einer monster funktion nicht so einfach möglich. weil man dadurch ja auch nicht so schön code wiederverwenden könnte...
Das ist meiner Meinung nach jedenfalls der Sinn der Objektorientierung:
Die Möglichkeit, kompliziertere Datentypen als einfache Zahlen und kompliziertere Operationen als einfache Additionen aus der Sicht des Programmierers mit ihrem Namen anzusprechen, das meinte ich mit Baukastenprinzip: Du baust Dir die Objekte, die Du brauchst, aus den einfachen ganzzahligen Datenobjekten allmählich zu einem sehr großen, die Problemstellung lösendes Objekt, zusammen.Ich gehe hier einen Schritt weiter und baue mir selber "einfache" Datenobjekte und aus diesen Baue ich weiter auf.
Ich habe also eine Pyramide wenn du so willst.Denn jedenfalls lösen wir trotz aller Unterschiede unsere Problemstellungen doch immer zufriedenstellend für unsere Chefs.
Jo, das ist das wichtigste.
Erstens: Linux ist Vodoo. Die Anhänger schwärmen, dass man damit alles machen KANN, sagen aber nicht dazu, dass man damit auch alles selber machen MUSS, um dem Rechner Vernünftiges zu entlocken.
Stimmt nicht. Installier Mepis, Suse, Mandrake, RedHat,... die sind vollwertige Desktopbetriebssysteme wo ein laie nur merkt, dass die farben anders aussehen, aber sonst zu windows keinen unterschied kennt.
Lustigerweise findet da wo ich gerade arbeite momentan eine umstellung auf linux statt
es ist also nicht so, dass es vollkommen praxisfern ist, linux kenntnisse zu haben.schon gar nicht, wenn auf 90% aller Rechner sowieso das selbe OS werkelt.
Du vergisst die Zielgruppe zu erwähnen, sonst ist diese Aussage falsch.
Mecnels schrieb:
groovemaster schrieb:
Warum meckert nun der Compiler nicht? Ganz einfach, eine Mehrfachdefinition ist nur dann zulässig, wenn der Bezeichner exakt den selben Wert (bzw Ersetzung) hat, wie zuvor. Und da das bei der Einbindung der selben Header normalerweile
der Fall ist, ist das Programm nicht ill-formed.
Genau das habe ich ja gemeint.
Kapiere ich nicht. groovemaster hat gemeint, dass du Konstanten auch mehrmals definiert darfst. Und genau das war doch dein vorteil für #define oder?
Ein C++ Programm enthalte die folgende Anweisung:
choose ("hour") (2,3);
Das war's schon. Wie ist diese Codezeile zu verstehen - rein syntaktisch betrachtet?
choose ist eine variable und es wird der op() davon aufgerufen, dieser liefert ein objekt und davon wird der op() aufgerufen.
Oder etwa nicht?
C++ Syntax ist kontextabhängig, deshalb bringt diese zeile nichts.
es könnte auch eine funktion choose sein, die einen funktionszeiger returned, der dann aufgerufen wird.
oder choose ist eine klasse...
ach, das führt zu nix.ich kann leider keinen obfuscated code pasten, denn bei mir gibt es sowas idr nicht
btw: Java wird idr nicht interpretiert
die wenigsten system interpretieren wirklich. auch PHP macht das nicht@TheBigW:
:p
-
Optimizer schrieb:
Java als Lehrsprache zu verwenden, wieder einmal sind sie auf einen kurzlebigen Trend (Hype heisst das heutzutage, oder?) hereingefallen, der sich mittlerweile offensichtlich tot gelaufen hat
Hihi. Jaja, du kennst die Branche in- und auswendig. Du weißt, was aufm Markt so abgeht.
Dein FanWir können ja einen Fanclub gründen - der wird bestimmt riesig
Mecnels schrieb:
choose ("hour")(2,3);
Da wird wohl keiner wissen.