was versteht man unter gutem Programmdesign?



  • Schwachsinn.
    Hört nicht auf den Mann.



  • abseits von µC sind doch globale Variablen schlechter Stil und goto erst recht

    Es gibt in jeder Programmiersprache Techniken, die "problembehaftet" sind.
    Goto's und gloabale Variablen gehören sicher dazu ....

    Aber nur wenn man was zu 100% eliminieren kann, es also für jede Situation eine bessere Lösung existiert, kann man eine Technik auch wirklich meiden ^^

    bei goto's geht das ganz gut bei diversen Programmiersprachen zum beispiel ... aka gotos im Code = schlechter Code.

    bei goto hast du eben den komfort, unkompliziert an eine programmstelle zu springen

    Oder man schaut sich sein design eine Stufe hoeher noch mal an ^^
    Oft ! ist ein Goto gar ned so sehr ein problem, es macht den Code nicht so viel schwerer nachvollziehbar und vereinfacht aufn 1. blick Dinge ...
    Aber wenn man einmal mit Goto's angefangen hat ...
    Und es geht meist auch besser ohne Goto's, nur ist da das drüberliegende Design schon Problematisch / suboptimal ... und das zu korrigieren macht mehr Arbeit ...
    Um zig verschachtelte bedingungsbläcke zu vermeiden, gibts andere Techniken z.b.

    Bei globalen variablen möchte ich das auch mal sehen ^^
    IMHO globale Variablen lassen sich ab und an nicht vermeiden, ohne andere problembehaftete Dinge zu tun. Aber in diversen programmiersprachen lassen sich globale variablen super verstecken, aka salonfähig machen ^^

    Mich würde interessieren, wie "gutes" Design aussehen würde,

    Kann man eigentlich mit wenigen Stichpunkten schnell beschreiben, aber im Detail ergeben sich dann ne ganze Menge SubPropleme ....
    - Verständlichkeit
    - Wiederverwendbarkeit
    - Sich an technische Vorgaben der Programmiersprache / verwendeten Libs halten

    Alle Punkte die einen immer um die Ohren geworfen werden, lassen sich da zuordnen ^^

    Und in der Praxis gibts kaum 100% einwandfreien code ....
    Programmierer schreiben im normalen Alltag keine Lehrbücher sondern praktische Lösungen. Das heisst, Zeitdruck !
    Und zu einem grossteil sind Anwendungen gewachsen. Das heisst am anfang gabs ne "Dirty" Lösung, ne Demo, nen script ...
    Viele Anwendungen fangen mit "Tools" Scripts ... etc an, die Techniker mit kaum Programmiererfahrung mal fix "hingezaubert" haben. Durch Verbreitung ensteht dann erst einmal der Bedarf an so einem Tool ...
    Und man soll plötzlich was solonfähiges draus machen, mit features, die keiner vorher genau beschreiben kann, sondern immer nur hinterher sagen, das so wie es implementiert wurde, nicht gemeint war ^^
    Also berabeitet man oft immer nur die schlimmsten dinge ....

    Ciao ...



  • naja ich kann mich nicht daran erinnern gesagt zu haben, dass schleifen, verzeigungen und funktionsaufrufe schwachsinn sind und nur noch goto verwendet werden sollte, und genauso wenig habe ich gesagt, dass man sämtliche im programm vorkommenden variablen global anlegen soll.
    klar vermeiden kann mans immer, ist manchmal halt aufwändiger und man muss aufpassen, was man da macht, aber wenns komplett überflüssig wäre, hätte man es aus der sprache entfernt.

    wobei das mal ne super aufgabe für nen wettbewerb o.ä. wäre, ein programm nur mit goto und einer minimalen anzahl globaler variablen / arrays zu realisieren. 😃



  • naja ich kann mich nicht daran erinnern gesagt zu haben, dass schleifen, verzeigungen und funktionsaufrufe schwachsinn sind und nur noch goto verwendet werden sollte

    Nein, aber es liest sich wie "naja ein Goto, solange der Code ned davon strotzt ist doch legitim" -> aka 1 oder 2 goto's = noch gutes Design 🙂
    Das wollt ich nur bissi korrigieren 🙂
    Und es gibt noch viel mehr üble Dinge die in Programmiersprachen drinne sind, grad in C/C++ die man nur wegen code(abwärts)-kompatiblitaet ned abschaltet.

    Wie groß wär die acceptance eines neuen C-Compilers, wenn der die linux kernel ned mehr übersetzen könnte ...

    Ciao ...



  • Kommt drauf an, wofür man die ein, zwei goto verwendet. Eine Schleife ist vom maschinencode her ja nichts anderes, als goto, warum dann also goto verwenden?

    Wenn man dieses ganze "gefährliche Zeugs" sowieso doof findet, kann man ja auch Java benutzen, ist zwar ohne ende langsam, aber dafür ist alles abgesichert.



  • Benutz kein goto und gut ist. Gibt außer schlechter RAII-Nachahmung keinen Grund dafür.



  • HansKlaus schrieb:

    aber wenn du z.b. threads hast und sperrvariablen setzen willst, warum solltest du dann keine globalen variablen verwenden? ist doch das einfachste.
    ...
    klar vermeiden kann mans immer, ist manchmal halt aufwändiger und man muss aufpassen, was man da macht, aber wenns komplett überflüssig wäre, hätte man es aus der sprache entfernt.

    Hör auf mit deinem naiv dümmlichen Laiengequatsche. Du hast keine Ahnung wovon du redest. Deine Annahmen warum etwas so ist wie es ist, sind Schwachsinn.
    Halt einfach die Klappe und trolle dich dahin zurück, woher du kommst.

    HansKlaus schrieb:

    Wenn man dieses ganze "gefährliche Zeugs" sowieso doof findet, kann man ja auch Java benutzen, ist zwar ohne ende langsam, aber dafür ist alles abgesichert.

    lol
    "In Java ist alles abgesichert."
    Von C hast du keine Ahnung und von Java auch nicht.
    Du hast keine Ahnung wovon du redest.
    Halt einfach die Klappe und trolle dich dahin zurück, woher du kommst.



  • HansKlaus schrieb:

    Wenn man dieses ganze "gefährliche Zeugs" sowieso doof findet, kann man ja auch Java benutzen, ist zwar ohne ende langsam, aber dafür ist alles abgesichert.

    Langsam ist relativ.
    Es gibt sogar Hardware-Emulatoren in Java und Java-Bytecode-Prozessoren.



  • Wutz schrieb:

    "In Java ist alles abgesichert."
    Von C hast du keine Ahnung und von Java auch nicht.
    Du hast keine Ahnung wovon du redest.
    Halt einfach die Klappe und trolle dich dahin zurück, woher du kommst.

    naja in java kannst du nicht mal eben so daten irgendwo hinschreiben, du hast keine zeiger und keinen zugriff auf die hardware, jedenfalls nicht so, wie du ihn bei c hast bzw. haben könntest. selbst für globale variablen musst du dir erstmal ein objekt erstellen. für mich ist das "alles schön abgesichert".
    hat natürlich für den allgemeinen gebrauch sicherlich seine vorteile, da die fehleranfälligkeit niedriger istt, ändert aber nichts daran.

    Mirek schrieb:

    Langsam ist relativ.
    Es gibt sogar Hardware-Emulatoren in Java und Java-Bytecode-Prozessoren.

    sicherlich, ist aber trotzdem nur "fast so schnell" wie c++. es reicht in den meisten fällen ja auch, aber manchmal kommt es darauf an, ob eine anweisung 6 takte braucht, oder nur 3.



  • Dass Java eine lahme Krücke ist, ist natürlich nicht mehr richtig, manchmal kann es hinsichtlich der Ausführungsgeschwindigkeit (nicht vergessen, Programmiersprachen haben keine Geschwindigkeit....) schon mit der von C++ mithalten, besonders wegen des Jit und Hotspot Gedöns.
    Mir ist Java trotzdem nicht geheuer...


  • Mod

    @HansKlaus: Wutz drückt es vielleicht nicht sehr höflich aus, aber hat schon Recht, dass das was du hier über Sprachkonzepte in C und Java zum Besten gibst ziemliches Halbwissen ist. Du verzettelst dich mit jedem Beitrag immer mehr.



  • HansKlaus schrieb:

    sicherlich, ist aber trotzdem nur "fast so schnell" wie c++. es reicht in den meisten fällen ja auch, aber manchmal kommt es darauf an, ob eine anweisung 6 takte braucht, oder nur 3.

    Darauf hast du mit C auch keinen Einfluss. Zum Glück sind die Zeiten, in denen der Programmierer Taktzyklen zählen durfte, lange vorbei.

    Und letztlich gilt immer noch: ein performanter Algorithmus in einer "lahmen Sprache", schlägt immer sein unperformantes, dilettantisch dahingefrickeltes Gegenstück in C.



  • Öhem,

    worum geht's eigentlich? Man kann auch unter strikter Einhaltung der MISRA- Regeln ziemlich obfuskativen Schrott schreiben, genauso kann eine Verwendung von goto Licht ins Dickicht bringen.
    In Ermangelung von Exceptions bleibt in C ja nicht viel anderes. Ein goto auf ein Label cleanup:, das (hoffentlich) alle Ressourcen zurückgibt, ist auf jeden Fall übersichtlicher, als alle Steuerstrukturen einzeln aufzulösen.
    Technisch passiert ja auch nichts anderes als ein gezielter Verwurf des Returnstacks. Beim break passiert das gleiche, halt nur mit dem obersten Element. switch-case z.B. würde sonst nur begrenzt Sinn machen.

    Unter "gut" verstehe ich hauptsächlich "les- und nachvollziehbar", mache das nicht daran aus, ob da ein goto drinsteht.

    Los, steinigt mich! :p



  • pointercrash() schrieb:

    Öhem,

    worum geht's eigentlich? Man kann auch unter strikter Einhaltung der MISRA- Regeln ziemlich obfuskativen Schrott schreiben, genauso kann eine Verwendung von goto Licht ins Dickicht bringen.
    In Ermangelung von Exceptions bleibt in C ja nicht viel anderes. Ein goto auf ein Label cleanup:, das (hoffentlich) alle Ressourcen zurückgibt, ist auf jeden Fall übersichtlicher, als alle Steuerstrukturen einzeln aufzulösen.
    Technisch passiert ja auch nichts anderes als ein gezielter Verwurf des Returnstacks. Beim break passiert das gleiche, halt nur mit dem obersten Element. switch-case z.B. würde sonst nur begrenzt Sinn machen.

    Unter "gut" verstehe ich hauptsächlich "les- und nachvollziehbar", mache das nicht daran aus, ob da ein goto drinsteht.

    Los, steinigt mich! :p

    Die Angst vor dem GOTO kann ich auch nicht nachvollziehen. Ich denke, sie kommt noch aus der Zeit, als BASIC-Homecomputer-Programmierer die strukturierte Programmierung in Pascal entdeckten.

    Ich glaube, Donald Knuth hat vor über 30 Jahren mal eine Streitschrift gegen die Dämonisierung des GOTOs publiziert. Müsste im Netz noch zu finden sein.



  • Mirek schrieb:

    Die Angst vor dem GOTO kann ich auch nicht nachvollziehen. Ich denke, sie kommt noch aus der Zeit, als BASIC-Homecomputer-Programmierer die strukturierte Programmierung in Pascal entdeckten.

    Jupp.
    Es ging mit den Basic-Dialekten aber nicht anders.
    Wenn du das durch hast, willst du kein goto mehr.

    Es ist daher einfacher einem Anfänger die Nutzung von goto zu untersagen.
    Wenn er dann mehr Erfahrung hat und weiß was er tut, kann er es ja benutzen.
    Nochmal: Wenn er weiß, was er tut.
    ^Aber wer weiß das schon^



  • uns hat man im 1. semester auch die verwendung von goto und globalen variablen untersagt. vermutlich, weil man sonst nur noch goto und globale variablen verwenden würde und natürlich, weil man sonst nicht überprüfen kann, ob wir die konzepte der schleifen und funktionsaufrufe verstanden haben.
    im 3. semester hieß es dann, dass man damit den code unter gewissen umständen sehr viel übersichtlicher und schneller machen kann, und dass es unter assembler sowieso nur noch goto und globale variablen gäbe, c aber eine hochsprache sei, deren konzepte man durchaus nutzen dürfe, sofern sie sinnig seien. 🙄



  • Hör auf mit deinem Geschwätz.
    Die Leser des Forums könnten denken, man programmiert in C tatsächlich so wie du fabulierst.
    Wer zur Uni geht um dort Programmieren zu lernen ist grenzenlos naiv und dumm.



  • programmieren ist dort halt ein teil der ausbildung, und zumindest in meinem fall hat informatik sogar was mit computern zu tun. 🙄

    und ja: da programmiert man dann auch so. es wird ohne ende mit goto und globalen variablen rumgesaut, weil man eben so unglaublich schlau ist, nicht einfach so drauf loszuproggen, sondern sich vorher erst mal auf dem papier gedanken zu machen, wie das alles ablaufen soll (90%) um das ganze dann ganz bequem einzugeben (10%).
    wobei eigentlich saut man damit nicht rum, man verwendet es bewusst, weils eben nicht anders geht.



  • DirkB schrieb:

    Mirek schrieb:

    Die Angst vor dem GOTO kann ich auch nicht nachvollziehen. Ich denke, sie kommt noch aus der Zeit, als BASIC-Homecomputer-Programmierer die strukturierte Programmierung in Pascal entdeckten.

    Jupp.
    Es ging mit den Basic-Dialekten aber nicht anders.
    Wenn du das durch hast, willst du kein goto mehr.

    Wenig später gab es BASIC-Dialekte ohne Zeilennummern und mit erweiterten Kontrollstrukturen, wo man GOTO nur noch selten gebraucht hat. Auch das GOSUB wurde in CALL umbenannt. Das sieht einfach seriöser aus. 😉

    Ach ja, - Java hat goto als reserviertes Schlüsselwort. Aber es hat dort keinen Effekt.


Anmelden zum Antworten