Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Programmierdogmata (https://www.delphipraxis.net/174155-programmierdogmata.html)

Delphi-Laie 7. Apr 2013 16:15


Programmierdogmata
 
Hallo Programmierfreunde!

Was ich jetzt erstelle, brennt mir schon seit Tagen unter den Nägeln, nun ist es wegen dieses Beitrages soweit.

Im Verlaufe meiner mehrjährigen Forumsaktivität stieß ich auf mehrere Grundsätze, die ich teilweise bis gar nicht nachvollziehen kann. Just fallen mir drei ein:

1. Die Verteufelung des GOTOs. Sog. Spaghetticode mag auch ich nicht, aber wenn er funktioniert, ist gegen ihn nur einzuwenden, daß er schwierig nachzuvollziehen ist. Wer es so gewohnt ist, wer so am besten denken kann und fehlerfreie Ergebnisse liefert, dem solle man das so machen lassen, vor allem, wenn er für sich selbst programmiert und die Quellcodes aus gutem Willen beilegt. Ein dosiertes Verwenden dieses Sprungbefehles kann Code kürzer, effizienter und schneller machen. Machen wir uns nichts vor: break und exit sind verkappte GOTOs, die all' die zufrieden- und ruhigstellen sollen, die das GOTO scheuen wie der Teufel das Weihwasser (ich nicht).

2. Die Ablehnung globaler Variablen. Auch, wenn man keine explizit formuliert, so gibt es diese jedoch in Form z.B. bei der VCL-Programmierung in Form der Formulare (hier zeigt sich übrigens, daß exakter Ausdruck notwendig ist, denn wie verständlich wäre wohl "in Form der Forms"?!). Wenn der Compiler globale Variablen akzeptiert und dabei nicht mal mit Hinweisen oder gar Warnungen daherkommt, was ist daran so verdammenswert?

3. Die Forderung, Oberfläche und Rechenteil zu trennen. Dauern Berechnungen länger, ist die Oberfläche bei nur einem VCL-Thread unbedienbar, dann kann ich diese Forderung nachvollziehen. Doch was ist mit der Speicherung? Warum z.B. soll man ein StringGrid neben der Darstellung nicht gleich auch noch für die Speicherung derselben Daten verwenden (mißbrauchen?), wenn es dafür doch grundsätzlich geeignet ist, insbesondere, wenn man nur mit Strings operiert (ansonsten kommen lästige Konvertierungen hinzu)? Speichert man die angezeigten Daten "extra", so erhöhen sich m.E. tendenziell Quellcode (Übersichtlichkeit!) und Compilatsgröße. Gerade bei meinen 1-Mann-Projekten und begrenzten Programmierfähigkeiten ist es wichtig, den/die Quellcode(s) möglichst kompakt zu halten.


Vielleicht fallen Euch noch mehr solcher Grundsatzforderungen ein, die auf mich in ihrer reinen Form, ich nenne es ganz deutlich, die Tendenz zum Dogma erkennen lassen.

Wie sind Eure Meinungen dazu?

Gruß Delphi-Laie

Ergänzung: 4. An der Strukturierung der Quelltexte (Einrückungen usw.) scheiden sich auch regelmäßig die Geister bis hin zu ideologischen Grabenkriegen.

hoika 7. Apr 2013 16:32

AW: Programmierdogmata
 
Hallo,

Ich denke, dass du ein paar Tage zu spät drin bist !
Der 1. April ist bereits vorbei.


Heiko

jfheins 7. Apr 2013 16:48

AW: Programmierdogmata
 
Nur kurz:

1. Übermäßiges benutzen von goto macht den Code schlechter lesbar. Das ist wie mit Asbest: Am Anfang klingt das nach ner tollen Idee, aber wenn man dann nach ein paar Jahren nochmal ran soll hat man den Salat. Als "dosiertes Verwenden" lasse ich hier vielleicht so ein goto auf 30000 Zeilen gelten. Und man tut sich selbst i.d.R. einen Bärendienst, weil das dann "Einwegcode" wird. Möchte man in nem Jahr nochmal etwas größeres dran ändern ist das Horror.

2. Im Grunde siehe oben. Macht den Code tendenziell schwerer nachzuvollziehen und geht somit in die Richtung "Heute spare ich 15min, kostet mich morgen 1h. Aber erst morgen!!"

3. Äh ja, sobald du was anderes als Strings hast? Gibt so Zahlen und so ;-) Auch wenn du lange Listen mit Daten hast und eine Art "Filterfunktion" anbringst: Du entfernst einfach alle Daten aus der Anzeige, die nicht mit dem Filter übereinstimmen. Aber ja, das ist auch wieder ne Frage wie komplex das Programm ist. Zudem wird das Testen und umwandeln einfacher: Die eine Funktionalität auch als Konsolenprogramm? Kein Problem: Funktion rüberkopieren und ein bisschen Eingabelogik in die Main-Function. Oh, ein Bug aufgetaucht? Einmal fixen, copy paste zurück. Ein Level weiter ist dann, dass sich beide Versionen Quelltextdateien teilen. und somit wirklich den gleichen Algorithmus benutzen.

Allgemein hat das also eher mit der Komplexität zu tun: Bei einfachen Programmen kann man sich auch leicht wieder reindenken. Bei großen Programmen geht das nicht so einfach, da spielt dann die Wartbarkeit eine tragende Rolle.

Zitat:

Gerade bei meinen 1-Mann-Projekten und begrenzten Programmierfähigkeiten ist es wichtig, den/die Quellcode(s) möglichst kompakt zu halten.
Sehe ich als Fehlschluss. Leerzeilen und sprechende Typnamen tragen wesentlich zum Verständnis bei. Lieber ein bisschen mehr in Funktionen aufteilen und eigene Klassen erstellen als LOC-Minimierung zu betreiben.

Hehe, ich habe mir gerade mal Codemetriken von VS generieren lassen, für mein aktuelles Projekt:
Zitat:

Projekt: SecretWorldDominiation
Bereich: Namespace
Namespace: SecretWorldDominiation
Wartbarkeitsindex: 82
Zyklomatische Komplexität: 354
Vererbungstiefe: 7
Klassenkopplung: 172
Codezeilen: 1.657
Die Zeilen sind auf 16 Dateien aufgeteilt. (Fast jeder Klasse wurde eine eigene Datei spendiert)
Jetzt bräuchte ich da nur noch Vergleichswerte :stupid:

Daniel 7. Apr 2013 17:03

AW: Programmierdogmata
 
Alle 4 genannten Punkte wurden in (nicht nur) diesem Forum schon bis zum bitten Ende durchdiskutiert.

FBrust 8. Apr 2013 08:55

AW: Programmierdogmata
 
Hallo,

da hat Daniel natürlich recht und die meisten Diskussionen verwandeln sich tatsächlich spätestens nach dem 5. Post in Glaubenskriege.

Man muss sich darüber im klaren sein, dass man, sofern man in einem Team arbeitet, den Code nicht für sich selbst, sondern immer für den nächsten Entwickler schreibt, der sich damit auseinandersetzeen muss (diese Erkenntnis stammt nicht von mir, ich stimme ihr aber zu). Insofern geht es m. E. weniger darum, ob Goto, Exit usw. Teufelszeug sind oder nicht, sondern dass klare Regeln existieren, an die sich alle halten.

Bei uns im Haus gibt es ein mehrseitiges Dokument, in dem möglichst genau (d. h. bis hin zu Einrückung und Groß/Kleinschreibung) festgelegt ist, wie Quelltext zu erstellen ist, welche Anweisungen zu verwenden sind (und welche nicht) und wie er auszusehen hat. Das Ergebnis ist von allen lesbarer und nachvollziehbarer Code.

Jeder muss natürlich für sich selbst entscheiden, ob das für ihn Sinn macht oder nicht (und als Einzelentwickler ist es vielleicht nicht so wichtig), aber wenn man im Team arbeitet, ist meiner Erfahrung nach ein solches Dokument eine enorm große Hilfe.


Gruß
Frank

Furtbichler 8. Apr 2013 09:10

AW: Programmierdogmata
 
Hi, mein Senf:
Grundsätzlich kannst Du so schlampig programmieren, wie Du willst. Aber wenn Du dich stetig verbessern willst, dann schreib die besten und saubersten Programme der Welt.

1. Die Verteufelung des GOTOs. GOTO wird nie benötigt. Du kannst ein 'break', 'exit' oder 'return (xy)' verwenden. Und wenn man Clean-Code verfolgt, ist selbst ein 'break' unnötig.

2. Die Ablehnung globaler Variablen. Globale Variablen bedeuten, das Du faul bist und dir keine Gedanken über dein Systemdesign gemacht hast. Ganz ohne globale Variablen kommt man aber manchmal nicht aus. Allerdings sollte dein Bestreben sein, sie wen Möglich zu vermeiden. Die Gründe kannst Du im Netz und im Forum nachlesen. In modernen Sprachen sind die globalen Variablen/Singletons hinter statischen Klassen versteckt, was (fast) aufs Gleiche rauskommt, aber nicht so auffällt ;-)

3. Die Forderung, Oberfläche und Rechenteil zu trennen. Hiermit ist gemeint, das die Logik nicht hinter einem 'Button1_Click' ausprogrammiert werden sollte ("Trenne Funktion und Design").

4. Strukturierung der Quelltexte (Einrückungen usw.) Tu es einfach. Wenn mir das nicht gefällt, jage ich es durch meinen eigenen Formatierer und wir müssen uns darüber nicht streiten. Aber sorge Du dafür, das deine Einrückung konsistent und automatisierbar ist, denn ich hab keine Lust, mir dein Gemecker anzuhören, weil Du die Gleichheitszeichen immer in Spalte 39 haben willst und kein Formatierer der Welt das so für dich hinbekommt.


Zitat:

ich nenne es ganz deutlich, die Tendenz zum Dogma erkennen lassen.
Was ist für einen Newbie schlimm, sich an Dogmen (Mehrzahl von Dogma) zu halten? Diese Regeln (oder nenne es Dogmen, meine Güte) sind von Leuten erdacht, die 30+ Jahre programmieren und folglich die Essenz aus den Erfahrungen, die Du erst machen musst. Also: Partizipiere!

SubData 8. Apr 2013 09:20

AW: Programmierdogmata
 
Ich muss meinen Vorrednern da einfach zustimmen.
Nur weil man etwas verwenden kann, heißt das noch lange nicht, dass man es verwenden muss.
Wenn man wirklich sauberen und durchdachten Code schreibt, dann sind Dinge wie globale Variablen, GOTOs, Do Withs, etc. völlig unnötig.

Naja, fast unnötig. Ich habe in den meisten meiner Anwendungen auch globale Variablen.
Allerdings beschränke ich die immer gerne auf folgende Definition

Delphi-Quellcode:
threadvar
  tv: TThreadVars;
var
  pv: TPublicVars;
Im 'tv' werden alle globalen Werte gespeichert, die für diesen Thread notwendig sind.
Zum Beispiel ein Pointer auf den aktuellen Indy-Thread, oder ggf. noch eine Benutzerreferenz.

Im 'pv' stehen Werte für die aktuelle Programmversion, der Anwendungspfad, der Logpfad, etc.

Somit reichen 2 globale Variablen, die intern eine Klasse oder ein Record sind aus, um diverse
Konfigurationsmöglichkeiten durch die ganze Anwendung zu schleifen.

Uwe Raabe 8. Apr 2013 09:25

AW: Programmierdogmata
 
Zitat:

Zitat von FBrust (Beitrag 1210491)
dass man, sofern man in einem Team arbeitet, den Code nicht für sich selbst, sondern immer für den nächsten Entwickler schreibt,

Ich kann zwar nur für mich sprechen, aber ich bin heute nicht mehr der Entwickler, der ich z.B. noch vor zwei, fünf, zehn Jahren war, und ich muss mich heute mit meinem damaligen Code und den darin enthaltenen Unzulänglichkeiten herumschlagen. Oft ärgere ich mich, nicht schon früher die Erkenntnisse umgesetzt zu haben, die meine heutige Programmier-Basis bilden.

Also, der nächste Entwickler bist in den meisten Fällen du selbst. Es ist also in deinem eigenen Interesse, den Code so wartbar wie möglich zu gestalten.

Dabei ist es nicht wichtig, welche Codier-Regeln du verwendest - Hauptsache du verwendest überhaupt welche.

Delphi-Laie 8. Apr 2013 09:52

AW: Programmierdogmata
 
Danke an alle!

Was ich nun doch herauslas: Kleines, also vereinzeltes Ausbrechen aus dieser Regelmenge ist also manchmal doch vorteilhaft. Und genau das ist nämlich auch mein Empfinden. Nur darum ging es mir.

Zitat:

Zitat von Furtbichler (Beitrag 1210492)
Was ist für einen Newbie schlimm

Falls Du mich meinst: Ich programmiere seit 25 Jahren (insofern nicht mehrjährig, sondern eher vieljährig). Wenn ich ein Neuling wäre, hätte ich mir über so etwas nie Gedanken gemacht, ich hätte diese Grundsätze noch nicht einmal bemerkt, geschweige denn, den Kopf dafür freigehabt, auch diese zu beherzigen, zu befolgen.

Zitat:

Zitat von Furtbichler (Beitrag 1210492)
, sich an Dogmen (Mehrzahl von Dogma) zu halten? Diese Regeln (oder nenne es Dogmen, meine Güte)

Ach Furtbichler, Dogma ist ein griechisches Wort. Auch wenn wir es eingedeutscht großschreiben, kannst man ihm nicht wenigstens ab und zu seine originale Pluralform belassen und die nicht gleich reflexhaft - und fehlerhaft - als falsch verdammen? Ich tue es. Bitte nicht schon wieder.

Mathematiker 8. Apr 2013 10:12

AW: Programmierdogmata
 
Hallo,
bisher verfolge ich die Diskussion mit wachsendem Interesse und wollte mich eigentlich nicht äußern.
Aber:
Zitat:

Zitat von Furtbichler (Beitrag 1210492)
Globale Variablen bedeuten, das Du faul bist und dir keine Gedanken über dein Systemdesign gemacht hast.

Danke! :lol: Jetzt weiß ich endlich, dass ich faul bin.
Bitte den Umgangston etwas mäßigen! :evil:

Beste Grüße
Mathematiker

Uwe Raabe 8. Apr 2013 10:17

AW: Programmierdogmata
 
Zitat:

Zitat von Mathematiker (Beitrag 1210503)
Zitat:

Zitat von Furtbichler (Beitrag 1210492)
Globale Variablen bedeuten, das Du faul bist und dir keine Gedanken über dein Systemdesign gemacht hast.

Danke! :lol: Jetzt weiß ich endlich, dass ich faul bin.
Bitte den Umgangston etwas mäßigen! :evil:

Selber Mathematiker, die gemäß Aussage meines alten Profs von Natur aus faul sind, empfinde ich dieses Adjektiv in keiner Weise als Beleidigung! Es ist vielmehr die Grundvoraussetzung für meine stetige Suche nach Vereinfachung.

SubData 8. Apr 2013 11:11

AW: Programmierdogmata
 
Naja... Wenn man es auf Haarspalterei auslegt, dann kann eine Anwendung, die nicht mindestens eine
globale Variable beinhaltet gar nicht existieren ;-)
Oder zumindest in den seltensten Fällen...

Sir Rufo 8. Apr 2013 11:16

AW: Programmierdogmata
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1210506)
Zitat:

Zitat von Mathematiker (Beitrag 1210503)
Zitat:

Zitat von Furtbichler (Beitrag 1210492)
Globale Variablen bedeuten, das Du faul bist und dir keine Gedanken über dein Systemdesign gemacht hast.

Danke! :lol: Jetzt weiß ich endlich, dass ich faul bin.
Bitte den Umgangston etwas mäßigen! :evil:

Selber Mathematiker, die gemäß Aussage meines alten Profs von Natur aus faul sind, empfinde ich dieses Adjektiv in keiner Weise als Beleidigung! Es ist vielmehr die Grundvoraussetzung für meine stetige Suche nach Vereinfachung.

:thumb:

Sir Rufo 8. Apr 2013 11:17

AW: Programmierdogmata
 
Zitat:

Zitat von SubData (Beitrag 1210520)
Naja... Wenn man es auf Haarspalterei auslegt, dann kann eine Anwendung, die nicht mindestens eine
globale Variable beinhaltet gar nicht existieren ;-)
Oder zumindest in den seltensten Fällen...

Warum? Nur weil Borlemba da schlampt und kein echtes Singleton (Application) davon macht?

Furtbichler 8. Apr 2013 11:20

AW: Programmierdogmata
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1210501)
Zitat:

Zitat von Furtbichler (Beitrag 1210492)
Was ist für einen Newbie schlimm

Falls Du mich meinst: Ich programmiere seit 25 Jahren (insofern nicht mehrjährig, sondern eher vieljährig).

Gut, deine Gedanken bzw. Fragen hier im Forum haben einen anderen Eindruck auf mich gemacht. Aber Vorurteile sind ja dazu da, zu erkennen, das man sich irrt.

Zitat:

...Dogma ist ein griechisches Wort. ...man ihm nicht wenigstens ab und zu seine originale Pluralform belassen und die nicht gleich reflexhaft - und fehlerhaft - als falsch verdammen?...
Im Duden steht 'Dogmen' und nicht 'Dogmata'. Also ist es nicht reflexhaft, sondern recherchiert. Wir sprechen hier zudem kein Altgriechisch, sondern Deutsch.

Zitat:

Zitat von Mathematiker (Beitrag 1210503)
Danke! :lol: Jetzt weiß ich endlich, dass ich faul bin.

Wer guten Code schreiben will (und guter Code ist wesentlich mehr als 'funktionierender Code'), der muss auch Kritik einstecken können. Und 'faul' ist einerseits die treibende Kraft, Dinge zu vereinfachen und andererseits eine Charaktereigenschaft, die uns allen eigen ist, und gegen die man etwas unternehmen sollte.

Das mit den globalen Variablen dauert etwas, bis man kapiert, weshalb sie 'böse' sind. Im Endeffekt geht es hier im Wiederverwendbarkeit einzelner Module. Das wird genau dann schwer, wenn sie von globalen Variablen abhängig sind. Denn dann sind sie eben nicht unabhängig.

Daher ist es auch sinniger, sie in statische Klassen zu packen, dann muss man sich wenigstens nicht damit herumschlagen, ob die globale Variable überhaupt instantiiert ist.

Man kann auch mit Singletons arbeiten, die aber auch wieder 'böse' sind (eben wegen der o.g. Abhängigkeiten). Es gibt natürlich Singletons, die da sein müssen, z.B. ist die Festplatte oder der Bildschirm so ein schönes Beispiel.

p80286 8. Apr 2013 11:25

AW: Programmierdogmata
 
Zitat:

Zitat von Furtbichler (Beitrag 1210492)
Was ist für einen Newbie schlimm, sich an Dogmen (Mehrzahl von Dogma) zu halten? Diese Regeln (oder nenne es Dogmen, meine Güte) sind von Leuten erdacht, die 30+ Jahre programmieren und folglich die Essenz aus den Erfahrungen, die Du erst machen musst. Also: Partizipiere!

Die "alten Säcke" tun sich da schwerer, weil sie mit einigen Erfahrungen vorbelastet sind.
1) GOTO ist für mich ebenso wie ein Break eine Todsünde. Allerdings muß ich gestehen, das ich Sourcen gesehen habe wo beides augenscheinlich sinnvoll eingesetzt wurde.

2) Globale Variablen sind zu vermeiden, manchmal geht es allerdings nicht ohne.

3) Oberfläche und Berechnung trennen. Spätestens wenn eine zusätzliche oder abgeänderte Funktionalität benötigt wird, oder aber z.B. die darunterliegende DB sich ändert, erkennt man die Notwendigkeit dieser Trennung.

4) Code Formatieren ist reiner Selbsschutz, da dann der Code leichter zu überblicken ist. Ob man
Delphi-Quellcode:
if b then
  begin
  end
oder
Delphi-Quellcode:
if b then begin
end
nutzt ist meiner Meinung nach Geschmackssache, hingegen
Delphi-Quellcode:
var
  i,j,k,l,cnt,top,base : integer;
ist nicht so toll.

Gruß
K-H

a

Sir Rufo 8. Apr 2013 11:29

AW: Programmierdogmata
 
@p80286

Nenn doch mal ein Beispiel, wo eine globale Variable sinnvoll ist.

Mathematiker 8. Apr 2013 11:33

AW: Programmierdogmata
 
Hallo,
Zitat:

Zitat von Furtbichler (Beitrag 1210524)
Und 'faul' ist einerseits die treibende Kraft, Dinge zu vereinfachen und andererseits eine Charaktereigenschaft, die uns allen eigen ist, und gegen die man etwas unternehmen sollte.

Da Du schon gern den Duden zitierst:
Zitat:

Bedeutungen
1.durch Einwirkung zersetzender Bakterien [und unter Entwicklung übel riechender Gase] in Gärung, Verwesung geraten, übergegangen [und dadurch verdorben, unbrauchbar]
2.(umgangssprachlich abwertend) sehr zweifelhaft, bedenklich; nicht einwandfrei, nicht in Ordnung und daher unbefriedigend
3.abgeneigt zu arbeiten, sich zu bewegen, sich anzustrengen; nicht gern tätig; bequem, träge
4.(veraltend) säumig, nachlässig
1. und 4. stimmen hier wohl nicht. Also bleiben noch 2. und 3.
Was wird wohl auf mich zutreffen?

:gruebel:
Mathematiker

Caps 8. Apr 2013 11:35

AW: Programmierdogmata
 
Hallo,

ich muss sagen ich glaube daran, dass nur die eigenen Erfahrungen einem selbst wirklich etwas bringen. Mir ist auch erst durch das Anpassenmüssen fremden Codes klar geworden, wie schlecht nachvollziehbar das Verhalten eines Programms sein kann, wenn globale Variablen innerhalb einer Routine gesetzt werden (und nicht Objektfelder sind oder in der Signatur übergeben werden) und damit Auswirkungen auf alles mögliche andere hat - man sucht sich den Wolf, bis man kapiert hat, wo der Hase langläuft.

Vorher hatte ich überhaupt kein Problem mit globalen Variablen zum Beispiel. Ich setze auf die Erfahrung, es abstrakt zu vermitteln ist meiner Ansicht nach schwierig.

Beste Grüße
Caps

p80286 8. Apr 2013 11:45

AW: Programmierdogmata
 
Zitat:

Zitat von Sir Rufo (Beitrag 1210527)
@p80286

Nenn doch mal ein Beispiel, wo eine globale Variable sinnvoll ist.

Wenn Du z.B einen "Aufrufzähler" benötigst. Und jetzt sag nicht "das gehört in Form" bei einem Konsolenprogramm hast Du so etwas nicht. Ein anderes Beispiel wäre der Name einer Protokolldatei auch wenn er in der "Base-Date-Unit" untergebracht wurde.

Gruß
K-H

SubData 8. Apr 2013 11:45

AW: Programmierdogmata
 
Zitat:

Zitat von Sir Rufo (Beitrag 1210523)
Zitat:

Zitat von SubData (Beitrag 1210520)
Naja... Wenn man es auf Haarspalterei auslegt, dann kann eine Anwendung, die nicht mindestens eine
globale Variable beinhaltet gar nicht existieren ;-)
Oder zumindest in den seltensten Fällen...

Warum? Nur weil Borlemba da schlampt und kein echtes Singleton (Application) davon macht?

Siehst, du nennst den Grund ja schon selbst ;-)

Edit sagt: Man kann sich drüber streiten... Ich verteufel globale Variablen nicht pauschal, es gibt einige Situationen,
in denen die praktisch und nützlich sind, aber man muss eben sehr gewissenhaft damit arbeiten und sie nicht an
jeder Stelle, an der es gerade möglich ist, in den Quellcode hauen.
Ich habe auch schon sinnige Anwendungsfälle für Do With gesehen, und teilweise auch schon Situation, in denen
man mit einem Goto arbeiten könnte (KÖNNTE!, nicht MUSS!)

Regeln sind dafür da, das sie auch einfach mal gebrochen werden müssen, sonst würde keine Innovation existieren,
aber man muss eben immer abwägen, ob es wirklich einen Vorteil bringt und man sich bzw. dem nächsten Programmierer
damit Arbeit spart, oder ob man in dem Moment einfach zu faul ist, um es richtig zu programmieren...

Ich denke, dass 90% des sauberen Codes einfach damit zusammenhängt, dass man beim Entwickeln nachdenkt und nicht
gerade irgendwas reinhackt, was zufällig passt, bzw. sich Quellcode von den verschiedensten Stellen zusammen klaut.

Sir Rufo 8. Apr 2013 12:03

AW: Programmierdogmata
 
Zitat:

Zitat von SubData (Beitrag 1210539)
Zitat:

Zitat von Sir Rufo (Beitrag 1210523)
Zitat:

Zitat von SubData (Beitrag 1210520)
Naja... Wenn man es auf Haarspalterei auslegt, dann kann eine Anwendung, die nicht mindestens eine
globale Variable beinhaltet gar nicht existieren ;-)
Oder zumindest in den seltensten Fällen...

Warum? Nur weil Borlemba da schlampt und kein echtes Singleton (Application) davon macht?

Siehst, du nennst den Grund ja schon selbst ;-)

Niemand bezweifelt die Existenz von globalen Variablen, ich bezweifle aber die Sinnhaftigkeit derselben.
Und Application als globale Variable habe ich auch nicht zu verantworten und kann ich auch nicht ändern (außer kein Delphi mehr zu benutzen).

Ich bin für meinen Code primär und für die 3rd-Party-Libs sekundär verantwortlich und primär gibt es bei mir keine globalen Variablen (nein ich lösche die automatisch erzeugten Form-Variablen nicht - das ist mir zu affig, aber ich benutze diese auch nicht).

@p80286

Für beides gibt es sinnvolle(re) Alternativen. Zumal für das Loggen sich eine Klasse empfiehlt, die in ihrer Instanz den Dateinamen verwaltet.

p80286 8. Apr 2013 12:07

AW: Programmierdogmata
 
Zitat:

Zitat von Sir Rufo (Beitrag 1210546)
Für beides gibt es sinnvolle(re) Alternativen. Zumal für das Loggen sich eine Klasse empfiehlt, die in ihrer Instanz den Dateinamen verwaltet.

Manchmal sind es nur Formulierungen, die zum Nachdenken anregen.
Mal sehen Wie ich die "Globalen" ausrotten kann.

Gruß
K-H

Elvis 8. Apr 2013 12:12

AW: Programmierdogmata
 
Zitat:

Zitat von Sir Rufo (Beitrag 1210523)
Warum? Nur weil Borlemba da schlampt und kein echtes Singleton (Application) davon macht?

Singletons sind fast globale Variablen.
Haben ja auch fast alle Probleme, die generell mit globalem State auftauchen. Eine Ausnahme, die mir gerade in den Sinn kommt, wären immutable Objekte. Da sollte es keine Probleme mit Threads und anderen Nebenläufigkeiten geben. Aber auch die können per DI oder schlicht als Parameter durchgeschliffen werden.

SubData 8. Apr 2013 12:25

AW: Programmierdogmata
 
Ich sehe trotzdem kein Problem darin eine globale Thread-Variable anzulegen, die ggf. nötige Referenzen auf Sessions
oder das Eltern-Thread-Objekt beinhaltet. Ob da nun eine Klasse, eine Referenz, ein Record oder sonstwas hinter
steckt ist in dem Fall erstmal egal. Das ist in meinen Augen eine saubere Lösung und sie ermöglicht es an jeder Stelle
im Thread darauf zuzugreifen, ohne, dass ich sie in jeder Klasse durchschleifen bzw. sichtbar machen muss.

Sir Rufo 8. Apr 2013 12:28

AW: Programmierdogmata
 
Zitat:

Zitat von Elvis (Beitrag 1210550)
Zitat:

Zitat von Sir Rufo (Beitrag 1210523)
Warum? Nur weil Borlemba da schlampt und kein echtes Singleton (Application) davon macht?

Singletons sind fast globale Variablen.
Haben ja auch fast alle Probleme, die generell mit globalem State auftauchen. Eine Ausnahme, die mir gerade in den Sinn kommt, wären immutable Objekte. Da sollte es keine Probleme mit Threads und anderen Nebenläufigkeiten geben. Aber auch die können per DI oder schlicht als Parameter durchgeschliffen werden.

Eben nur fast ... ;)

Das Böse an globalen Variablen ist doch, dass diese eingesetzt werden, wo es sich absolut nicht um etwas Globales handelt und durch die Verwendung bekomme ich Abhängigkeiten die die Wiederverwendbarkeit nicht zulässt.

Wie schon festgestellt wurde, gibt es aber durchaus die Anforderung nach einer einzigen globalen Instanz, die naturbedingt auch nur einmal pro Anwendung vorkommen kann (Application, Screen, etc.).

Nimmt man hier aber jetzt eine globale Variable, so kann diese Variable auch übereschrieben werden, ohne dass die abhängigen Teile darüber informiert werden.

Gerade im Thread-Umfeld muss auch bedacht werden, dass eine globale Variable eben nicht threadsafe ist. Somit ist das in so einem Umfeld der vorgeplante Schuss ins Knie.

Furtbichler 8. Apr 2013 12:32

AW: Programmierdogmata
 
Zitat:

Zitat von Mathematiker (Beitrag 1210531)
1. und 4. stimmen hier wohl nicht. Also bleiben noch 2. und 3.
Was wird wohl auf mich zutreffen?

Hab dich nicht so. Dann bist Du eben nicht faul und machst alles richtig.

Zum Thema 'globale Variablen'. Meine Meinung: Einfach nicht verwenden. Wenn schon, dann in ein Singleton-Pattern packen. Und pro Singleton eine Kiste Bier/Brause für die Entwickler. Man muss das wirklich begründen und wenn alle einverstanden sind, dann ist die Welt in Ordnung.

sx2008 8. Apr 2013 12:35

AW: Programmierdogmata
 
Es gibt noch zwei Aspekte die hier noch nicht angesprochen wurden:

1.) Unit-Tests
Wenn man mit Software Geld verdienen möchte und Softwareentwicklung im grösserem Rahmen betreibt, dann braucht man Unit-Tests.
Das bedeutet aber auch dass die Software so geschrieben werden muss, dass sie sich überhaupt testen lässt.
Globale Variablen und Singletons wirken sich extrem störend auf die Testbarkeit von Klassen und Funktionen aus.
Das gleiche gilt auch wenn die Benutzeroberfläche und die tiefere Logik nicht getrennt sind.

2.) grosse Anwendungen (> 500 Delphi Units)
Bei grossen Anwendungen können kleine Änderungen in den Anforderungen grosse Probleme verursachen wenn die Architektur nicht sauber ist.
Kleines Beispiel aus der Praxis:
Eine Anwendung aus dem Bereich der Logistik soll "mandantenfähig" gemacht werden; d.h. es soll mit mehreren Mandanten statt bisher nur einem umgehen können.
Das Problem war aber dass die zum Mandanten gehörenden Daten in einem globalen Objekt gespeichert wurden
Delphi-Quellcode:
var
  AdrMandant : TAdresseMandant; // enthält Name, Anschrift, Tel, EMail, Fax, Kontoverbindung, Umsatzsteuernr,...
Auf diese globale Objekt greifen aber hunderte Units zu.
Wenn man die Mandantendaten ändert weil man z.B. eine Rechnung drucken möchte, dann hat das globale Auswirkungen auf die ganze Anwendung.
Letztendlich wurde die globale Variable vernichtet und vielen Klassen wird jetzt das Mandantenobjekt von Aussen übergeben.
Diese Umbauarbeiten haben hunderte Stunden an Arbeit gekostet und sich über ein dreivirtel Jahr hingezogen.

Beispiel 2:
Ein Kunde wollte den Rechnungsdruck nicht über die Benutzeroberfläche starten, sondern über TCP/IP aus einem anderen System anstossen.
Leider ist aber die Benutzeroberfläche, die Datenbankzugriffe und die Logik auf einem Formular so verzahnt, dass man den Rechnungsdruck nur per Mausklick starten kann.
Bis heute hat sich daran nicht geändert, weil sich niemand traut an dem komplexen Gebilde etwas zu ändern.

SubData 8. Apr 2013 12:45

AW: Programmierdogmata
 
Zitat:

Zitat von Sir Rufo (Beitrag 1210557)

[...]

Wie schon festgestellt wurde, gibt es aber durchaus die Anforderung nach einer einzigen globalen Instanz, die naturbedingt auch nur einmal pro Anwendung vorkommen kann (Application, Screen, etc.).

Nimmt man hier aber jetzt eine globale Variable, so kann diese Variable auch übereschrieben werden, ohne dass die abhängigen Teile darüber informiert werden.

[...]

Man kann theoretisch jeden Mist programmieren, man kann auch Konstanten überschreiben.
Aber wenn ein Entwickler auf die Idee kommt eine globale Variable wie Application zu überschreiben,
dann gehört er gehörig gesteinigt und daran ist nicht die globale Variable schuld.

Gerade Application sehe ich aber eher als gute globale Variable. Wie gesagt, wenn jemand anfängt
sowas zu überschreiben, dann ist nicht die Variable schuld.

Sir Rufo 8. Apr 2013 12:50

AW: Programmierdogmata
 
Zitat:

Zitat von SubData (Beitrag 1210563)
Zitat:

Zitat von Sir Rufo (Beitrag 1210557)

[...]

Wie schon festgestellt wurde, gibt es aber durchaus die Anforderung nach einer einzigen globalen Instanz, die naturbedingt auch nur einmal pro Anwendung vorkommen kann (Application, Screen, etc.).

Nimmt man hier aber jetzt eine globale Variable, so kann diese Variable auch übereschrieben werden, ohne dass die abhängigen Teile darüber informiert werden.

[...]

Man kann theoretisch jeden Mist programmieren, man kann auch Konstanten überschreiben.
Aber wenn ein Entwickler auf die Idee kommt eine globale Variable wie Application zu überschreiben,
dann gehört er gehörig gesteinigt und daran ist nicht die globale Variable schuld.

Gerade Application sehe ich aber eher als gute globale Variable. Wie gesagt, wenn jemand anfängt
sowas zu überschreiben, dann ist nicht die Variable schuld.

Weil es ja auch ach so schwer ist statt
Delphi-Quellcode:
var
  Application : TApplication;
einfach
Delphi-Quellcode:
function Application : TApplication;

implementation

var
  _Application : TApplication;

function Application : TApplication;
begin
  Result := _Application;
end;
zu schreiben. (Die Erzeugung von TApplication hab ich jetzt raus gelassen).

Das kann man aber auch wirklich keinem zumuten :roll:

Furtbichler 8. Apr 2013 13:07

AW: Programmierdogmata
 
Application ist ein ebenso zweifelhaftes 'gutes' Beispiel gegen die Verwendung von globalen Variablen. Im Kontext einer VCL-Anwendung ist das Application-Objekt existentiell, d.h. Abhängigkeiten eines VCL-Objektes vom Application-Objekt sind systemimmanent.

Nur die Umsetzung des globalen/singulären Zugriffs sollte eben -wie von Sir Rufo beschrieben- über ein Singleton-Pattern laufen.

Andere Beispiele für den globalen Kontext sind z.B. Benutzereinstellungen (die 'INI-Datei') oder auch der Bildschirm und generell die Hardware, wobei der globale und exklusive Zugriff nicht in allen Bereichen notwendig ist.

p80286 8. Apr 2013 14:22

AW: Programmierdogmata
 
Zitat:

Zitat von sx2008 (Beitrag 1210560)
Eine Anwendung aus dem Bereich der Logistik soll "mandantenfähig" gemacht werden; d.h. es soll mit mehreren Mandanten statt bisher nur einem umgehen können.
Das Problem war aber dass die zum Mandanten gehörenden Daten in einem globalen Objekt gespeichert wurden
Delphi-Quellcode:
var
  AdrMandant : TAdresseMandant; // enthält Name, Anschrift, Tel, EMail, Fax, Kontoverbindung, Umsatzsteuernr,...
Auf diese globale Objekt greifen aber hunderte Units zu.

Wenn man die Mandantendaten ändert weil man z.B. eine Rechnung drucken möchte, dann hat das globale Auswirkungen auf die ganze Anwendung.
Letztendlich wurde die globale Variable vernichtet und vielen Klassen wird jetzt das Mandantenobjekt von Aussen übergeben.

Auch wenn ich noch nicht restlos von der Überflüssigkeit globaler Variablen/Constanten.. überzeugt bin, so ###### kann doch kein Mensch/Programmierer sein?
Spätestens beim Einsatz der zweiten Unit, wird das doch so komplex, daß man eine saubere Schnittstelle braucht und sich nicht auf "das steht da irgendwo in der..." zurückziehen kann.

Eben darum sollten ja auch die Daten von der Oberfläche getrennt sein.

Ich bin viel zu faul (je weniger Aufwand für ein Ergebnis desto besser) als daß ich mir so etwas antuen würde.

Gruß
K-H

Uwe Raabe 8. Apr 2013 14:33

AW: Programmierdogmata
 
Zitat:

Zitat von p80286 (Beitrag 1210608)
Auch wenn ich noch nicht restlos von der Überflüssigkeit globaler Variablen/Constanten.. überzeugt bin, so ###### kann doch kein Mensch/Programmierer sein?

Meistens entsteht so etwas schleichend. Am Anfang waren die einzelnen Adressfelder vielleicht noch einzelne globale Variablen (das Programm stammt vielleicht noch aus Turbo Pascal 1.0 Zeiten). Dann fasst man das als Record zusammen, später als Klasse. Dann kommt eine Unit nach der anderen dazu und man hat gerade überhaupt keine Zeit das richtig umzubauen. Irgendwann ist dann der nötige Aufwand schon happig, weil man so viele Units anfassen muss.

Manchmal muss man sich einfach selbst zwingen, solche Dinge rechtzeitig zu bereinigen. Unterm Strich spart man dann doch wieder Zeit.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz