Was ist für euch guter Programmcode?



  • Mecnels schrieb:

    Endlich hab ich Gewissheit, wo ihr steht, wenn nicht einmal die elementarsten Dinge klar sind. Es gibt nämlich nur eine einzige, eindeutige Interpretation (genauer: muss es geben - kein Compiler akzeptiert mehrdeutige Anweisungen, sind nämlich nicht übersetzbar)

    Nein, du verstehst nicht. Wie das ein Compiler interpretiert, hängt von der Implementierung ab. choose ("hour") kann genauso gut ein Objekt mit überladenem op() sein. 😉



  • Mecnels schrieb:

    volkard schrieb:

    Mecnels schrieb:

    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.

    dafür gibt's 1000 möglichkeiten.

    Endlich hab ich Gewissheit, wo ihr steht, wenn nicht einmal die elementarsten Dinge klar sind. Es gibt nämlich nur eine einzige, eindeutige Interpretation (genauer: muss es geben - kein Compiler akzeptiert mehrdeutige Anweisungen, sind nämlich nicht übersetzbar), nämlich dass choose eine Funktion ist, die einen Zeiger auf eine andere Funktion zurückgibt.

    kk
    Kannst du mir dann bitte verraten, warum volkards Beispiel dann funktioniert, obwohl es nix mit Funktionszeigern zu tun hat? 😃 👍



  • groovemaster schrieb:

    ROFL schrieb:

    Zu Linux: Tja, für die früheren Programmierer 1970-1995 war das selbstverständlich

    Ich muss zugeben, dass ich nicht so der grosse Linux Kenner bin, aber wurde Linux nicht erst Anfang der 90er ins Leben gerufen?

    Ja, gilt aber allgemein für Unices.

    groovemaster schrieb:

    ROFL schrieb:

    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!

    Natürlich. Ich frag mich nur, was die Hardware Hersteller ohne passende BS Schnittstelle machen. Ach was solls, die ist ja in ein paar Minuten gemacht. 🙄

    Komisch, als ich damals meine Gamecard eingebaut hab, lief sie nicht. Nicht kompatibel zu Windows 3.1.

    Falsch, der Hersteller liefert Treiber. Das Problem von Linux/BSD ist, daß die Hardware Hersteller keine Treiber schreiben. Schnittstellen hat so ziemlich jedes OS 😉



  • guyondrugs schrieb:

    Kannst du mir dann bitte verraten, warum volkards Beispiel dann funktioniert, obwohl es nix mit Funktionszeigern zu tun hat? 😃 👍

    Der Compiler hat nen Bug. Ist doch ganz klar. 🤡 👍



  • ROFL schrieb:

    Komisch, als ich damals meine Gamecard eingebaut hab, lief sie nicht. Nicht kompatibel zu Windows 3.1.

    LOL. Dir ist aber schon klar, dass Win 3.1 kein BS ist?

    ROFL schrieb:

    Falsch, der Hersteller liefert Treiber. Das Problem von Linux/BSD ist, daß die Hardware Hersteller keine Treiber schreiben. Schnittstellen hat so ziemlich jedes OS 😉

    Es ging mir aber nicht um die Treiber. Dass die vom Hersteller kommen ist schon klar. Nur nützt das nix, wenn du keine Schnittstelle zwischen Treiber und OS hast. Und sowas ist nicht etwas, was man mal so nebenbei für ein BS bereitstellt.



  • groovemaster schrieb:

    Nur nützt das nix, wenn du keine Schnittstelle zwischen Treiber und OS hast. Und sowas ist nicht etwas, was man mal so nebenbei für ein BS bereitstellt.

    äh, wie war das... wenn man keine Ahung hat, ...



  • Mecnels schrieb:

    Endlich hab ich Gewissheit, wo ihr steht, wenn nicht einmal die elementarsten Dinge klar sind. Es gibt nämlich nur eine einzige, eindeutige Interpretation

    Wenn du von C redest, hast du natürlich recht. Weil man dort den op() nicht überladen kann.

    Aber in C++ ist das nicht der Fall, da kann man richtig kranke sachen machen.

    zB wenn choose eine KLasse ist, dann erstellt choose() ein Objekt
    ist choose eine Variable wird der op() aufgerufen
    das sind 2 grundverschiedene sachen.

    (genauer: muss es geben - kein Compiler akzeptiert mehrdeutige Anweisungen, sind nämlich nicht übersetzbar),

    Ich sagte ja auch: kontextabhängig.
    Und C++ _ist_ kontext abhängig.

    denn niemand kann mir verraten was

    foo();
    

    macht.
    wird eine funktion aufgerufen? wird der op() eine variablen foo aufgerufen oder ist foo eine Klasse, dann wird hier ein temporäres Objekt erstellt.

    weiters wird es kompliziert wenn der PP hier rein kommt, aber das lassen wir lieber, weil damit nichts mehr auch nur annährend vorhersehbar wäre.

    nämlich dass choose eine Funktion ist, die einen Zeiger auf eine andere Funktion zurückgibt. War aber auch tückisch gestellt, die Frage, also kann auch einem Haudegen wie Dir passieren, drauf rein zu fallen.

    Schau dir volkards Code an. In C++ ist es nicht eindeutig.
    in C wüsste ich jetzt auf die schnelle auch keine situation wo etwas anderes als funktionszeiger möglich wären.

    Ich bin immer wieder erstaunt, wie schnell Altersunterschiede polarisieren,
    und damit das hier wieder zur Ruhe kommt, spiel ich ab jetzt nur mehr den Beobachter, ist auch amüsant genug.

    Verstehe ich nicht. Was hat das alter damit zu tun? Es ist leicht zu beweisen dass der Code ohne kontext mehrdeutig ist, dass kann auch ein 10 jähriger 😉



  • Optimizer schrieb:

    guyondrugs schrieb:

    Kannst du mir dann bitte verraten, warum volkards Beispiel dann funktioniert, obwohl es nix mit Funktionszeigern zu tun hat? 😃 👍

    Der Compiler hat nen Bug. Ist doch ganz klar. 🤡 👍

    Nene, volkard hat das mit dem GCC kompiliert. Da dieser nicht von bestbezahlten Spitzenprogrammierern geschrieben wurde, kompiliert der alles.



  • #define doChoose(A,B) {int i,j;for(i=0;i<B;++i){for(j=0;j<A;++j) printf("%s ",str);printf("\n");}}}
    #define choose(STR) {char* str=STR;doChoose
    
    int main(){
    	choose("hour")(2,3);
    

    ist nicht mehr so extrem sinnvoll, daß choose("hour")(2,3); ein 2x3 grid malt, wo in jedem feld "hour" steht. aber ist ohne c++.



  • @Optimizer

    Tut mir leid wenn ich mich so einmische, aber studierst du nicht an der FH-München? Ich meine mal einen link von dir dazu gesehen zu haben.

    Ich frage, weil ich zum nächsten ws auch gerne dort anfangen würde.

    Wie ist es dort und was lernt man dort alles? Wie schwer ist das Studium? Ich mache demnächst mein Abi und möchte gerne in Bayern bleiben.



  • Das Studium ist ein bisschen anders, als ich mir das vorgestellt habe. Ich möchte nicht sagen schlecht. Aber wenn du mit der Erwartung reinkommst "jetzt voll was über Computer zu lernen", wirst du enttäuscht werden. Das musst du dir in der Freizeit selber beibringen.
    Zumindest in den ersten Semestern ist es eher ein Mathematik-Studium, so Fächer wie Compilerbau und Software-Engineering klingen aber natürlich vielversprechend. Alles in allem habe ich jetzt gerade erst mein (99% Mathematik-) Grundstudium beendet, also kann ich dir dazu noch nicht so wirklich viel sagen. 🙂



  • Optimizer schrieb:

    Das Studium ist ein bisschen anders, als ich mir das vorgestellt habe. Ich möchte nicht sagen schlecht. Aber wenn du mit der Erwartung reinkommst "jetzt voll was über Computer zu lernen", wirst du enttäuscht werden. Das musst du dir in der Freizeit selber beibringen.
    Zumindest in den ersten Semestern ist es eher ein Mathematik-Studium, so Fächer wie Compilerbau und Software-Engineering klingen aber natürlich vielversprechend. Alles in allem habe ich jetzt gerade erst mein (99% Mathematik-) Grundstudium beendet, also kann ich dir dazu noch nicht so wirklich viel sagen. 🙂

    Ohh, ich dachte nur an einer Uni hat man soviel Mathe? Ich hab nur GK und damit auch noch einige Probleme... 😞

    Wir war Deine Vorbildung in Mathe?



  • @Mecnels: Danke, so köstlich habe ich mich seit einiger Zeit nicht mehr amüsiert.



  • MaSTaH schrieb:

    @Mecnels: Danke, so köstlich habe ich mich seit einiger Zeit nicht mehr amüsiert.

    Wenigstens ist meine Signatur etwas besser geworden.



  • wieder M. schrieb:

    MaSTaH schrieb:

    @Mecnels: Danke, so köstlich habe ich mich seit einiger Zeit nicht mehr amüsiert.

    Wenigstens ist meine Signatur etwas besser geworden.

    Wenn man nen lustigen Tag hat kann man sich über diesen Satz totlachen.

    Aber wohl leider Fake, so kennen wir unseren Mecnels garnicht 😞 😃



  • MaSTaH schrieb:

    @Mecnels: Danke, so köstlich habe ich mich seit einiger Zeit nicht mehr amüsiert.

    100% agree, der thread ist richtig gut 😃

    fast sogut wie der eine von vor ca nem halben jahr, der einen auf dicke hose gemacht hat, und dann von den mods aus dem forum vertrieben wurde 😃



  • otze schrieb:

    MaSTaH schrieb:

    @Mecnels: Danke, so köstlich habe ich mich seit einiger Zeit nicht mehr amüsiert.

    100% agree, der thread ist richtig gut 😃

    fast sogut wie der eine von vor ca nem halben jahr, der einen auf dicke hose gemacht hat, und dann von den mods aus dem forum vertrieben wurde 😃

    War nicht zufällig "ProjecktX" oder so :D?



  • @Optimizer schrieb:

    Ohh, ich dachte nur an einer Uni hat man soviel Mathe? Ich hab nur GK und damit auch noch einige Probleme... 😞

    Naja mein Studiengang heißt ja auch schon bezeichnenderweise Informatik/Mathematik. Ich erwarte jetzt allerdings schon auch, dass es sich "bessert". War aber schon krass bis jetzt, IMHO.
    War bis zur zehnten aufm Gymnasium und hab dann FOS Technik gemacht.



  • simon.phoenix schrieb:

    otze schrieb:

    MaSTaH schrieb:

    @Mecnels: Danke, so köstlich habe ich mich seit einiger Zeit nicht mehr amüsiert.

    100% agree, der thread ist richtig gut 😃

    fast sogut wie der eine von vor ca nem halben jahr, der einen auf dicke hose gemacht hat, und dann von den mods aus dem forum vertrieben wurde 😃

    War nicht zufällig "ProjecktX" oder so :D?

    Ist Euch eigentlich schon einmal aufgefallen, dass nicht ich die ganze Zeit Euch einreden will, was IHR in Euren Codes besser machen solltet, sondern genau umgekehrt - ich kann ja gar nicht wissen, was Eure Aufgabenstellung war. Ein Alien mit telepathischen Fähigkeiten bin ich nicht, und darum maße ich mich auch nicht an, den Code anderer herunter zu machen, wenn ich die Aufgabenstellung nicht genau kenne. Gute Kommentierung ist in jedem Fall das Wichtigste überhaupt, speziell wenn andere auch mit dem Code etwas anfangen können soll.

    Stell Dir vor es gäbe eine Funktion, die hieße
    SetCooperativeLevel(). Toll wie der Bezeichner über sich selber spricht, oder? Weißt Du jetzt anhand des Namens, was die Funktion macht? Worauf Du bei der Parameterübergabe eventuell besondere Rücksicht nehmen solltest? In welchem Kontext und nach welchen zuvor stattgefundenen Initialisierungen Du die Funktion überhaupt aufrufen darfst, wenn Du schwere Systemfehler verhindern willst? Nein. Der Bezeichner sagt nichts über alles das aus, Du kannst die Funktion natürlich einfach aufrufen, und Dich dann wundern, warum etwa das Betriebssystem die Kontrolle über die Tastatur verloren hat und ein Kaltstart fällig geworden ist. Im Falle wie Funktionen wie dieser stehen die Kommentare, die Dir das ersparen hätten können, zwar nicht irgendwo im Quelltext, sondern als Lektüre in Büchern und der DirectX Hilfe, aber es sind nichtsdesto trotz Kommentare, die Dir den sinnvollen Umgang mit der Funktion überhaupt erst erläutern.

    Darum kann es so etwas wie 'Deine Kommentare erzählen Romane und darum ist der Quellcode schlecht' gar nicht geben, eher können gar nicht genügend Kommentare dastehen, vor allem wenn andere mit dem Quellcode etwas anfangen sollen. Jeder Extra Kommentar ist da ein Fehler weniger, den man später debuggen muss.

    Nein, ich bin es nicht, der behauptet, alles besser zu wissen. Das seid schon ihr mit 'nimm Konstanten statt defines', 'nimm explicit statt Elementfunktionen', 'nimm <vector> statt einen massgeschneiderten Container selber zu schreiben', 'vermeide um jeden Preis Schleifen', 'mach Fehlerbehandlung mit Exceptions anstatt mit bool-Rückgabewerten', 'verwende keine WINAPI und nie und nimmer MessageBox', UND UND UND

    Das sind alles EURE Kommentare. Alles was ich mache, ist, einen optimierten Quellcode für ein funktionsfähiges Programm, das eh nur für meinen Enkel gedacht ist und das ich mir in zwei Tagen aus dem Ärmel geschüttelt habe - ohne Leistungsdruck und völlig aus freien Stücken - so gut es mir möglich ist, zu verteidigen. Vielleicht könntet Ihr ja in Zukunft schreiben, wie IHR es anders gemacht hättet, und ab und zu ein Eingeständnis dass man selber nicht ALLES wissen kann, wie ich es gerade (und nicht zum ersten Mal) mache, würde das Diskussionsklima sicher wieder auf ein gesundes Level abkühlen.

    Mich interessiert ja auch, wie Ihr Projekte angeht, weil ich da ja sicher auch genug lernen kann.

    Gute Nacht. 🙂



  • @JBeni: ...zwar etwas spät, aber ich sag auch nochmal etwas zu deinem Code.

    <DISCLAIMER: Was ich sagen werde bezieht sich größtenteils expilzit auf Java-Code und die bei Javaprogrammierern vorherrschende "Design-Philosophie". Mit anderen Worten: Das ist nicht auf C++ Code und den dortigen Prinzipien übertragbar und wird teilweise in die genau entgegengesetzte Richtung gehen.>

    1. Im Großen und Ganzen ist dein Code gut. Die Anmerkungen, die ich im Folgenden mache betreffen größtenteils nur den "Feinschliff".

    2. Du nutzt zu wenig "final" für Variablen. "final" sollte bei lokalen Variablen, Parametern und Membervariablen so oft wie möglich genutzt werden, da hierdurch gewisse Fehler zur Comilezeit erkannt werden können, die sonst schwer zu finden wären. Bei Konstanten kommt bezüglich final außerdem noch ein Optimierungsaspekt hinzu.

    3. Du machst zu wenig bzw. nahezu gar keine Checks auf Gültigkeit von Parametern, Zwischenergebnissen usw.! Schmeiß doch mal bezüglich Fehlern bei der Benutzung der Klasse entsprechende RuntimeExceptions und nutze für innere Checks assert. Du wirst den Vorteil davon nach den nächsten paar Bugs, die du produziert hast, zu schätzen gelernt haben. Ein Performanceargument gegen solche Checks zählt im Übrigen nur begrenzt: (Angeblich) kann die JVM überflüssige Checks zur Laufzeit eliminieren.

    4. Irgendwo hast so eine if ... else if ... else if ... Orgie im Code. Das das nicht gerade ideal ist, sondern äußerst redundant, ist dir sicherlich klar. Überleg dir mal, wie du das eliminieren kannst. Wird vermutlich nicht ganz einfach sein, mir fällt auf anhieb zumindest nichts ein, aber irgendwas geht immer. Wenn du es wirklich restlos entfernen willst, wirst du wohl um eine Änderung des Designs im etwas größeren Rahmen nicht vorbeikommen. Mußt du selbst wissen, ob es dir das wert ist. Sooo schlimm ist diese Orgie noch nicht, aber es wäre sicherlich mal ne gute Übung, das restlos zu beseitigen, weil du dir dann in jedem Fall eine Designalternative für solche Fälle klar machst.

    5. Gut finde ich, dass du anscheinend mindestens alle öffentlichen Dinge mit Javadoc-Kommentaren versehen hast.

    6. Bei Java 1.5 Code kann ich dir für jede überschriebene Methode @Override als Marker-Annotation empfehlen, um weitere Fehler zur Compilezeit zu finden.

    7. In einem Code, in dem alle Bezeichner auf englisch sind, kommt ein Bezeichner "typ" sehr überraschend. ...ist sicher ein Versehen, oder?

    So, das reicht erstmal. Ist gar nicht viel Kritik geworden. 🙂 Abschließend noch ein Tipp: Du bist, nach deinem Code zu urteilen, gerade an einem Punkt, an dem sich das Buch "Effektiv Java programmieren" von Joshua Bloch für dich vermutlich sehr lohnt. Schau da mal rein. ...oder warte noch etwas auf die Version für Java 1.5 davon (kommt bestimmt demnächst irgendwann raus).


Anmelden zum Antworten