AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Programmierdogmata

Ein Thema von Delphi-Laie · begonnen am 7. Apr 2013 · letzter Beitrag vom 8. Apr 2013
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#21

AW: Programmierdogmata

  Alt 8. Apr 2013, 12:45
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.
Ronny
/(bb|[^b]{2})/

Geändert von SubData ( 8. Apr 2013 um 12:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#22

AW: Programmierdogmata

  Alt 8. Apr 2013, 13:03
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#23

AW: Programmierdogmata

  Alt 8. Apr 2013, 13:07
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#24

AW: Programmierdogmata

  Alt 8. Apr 2013, 13:12
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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#25

AW: Programmierdogmata

  Alt 8. Apr 2013, 13:25
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.
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#26

AW: Programmierdogmata

  Alt 8. Apr 2013, 13:28
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#27

AW: Programmierdogmata

  Alt 8. Apr 2013, 13:32
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.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#28

AW: Programmierdogmata

  Alt 8. Apr 2013, 13:35
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.

Geändert von sx2008 ( 8. Apr 2013 um 13:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#29

AW: Programmierdogmata

  Alt 8. Apr 2013, 13:45

[...]

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.
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#30

AW: Programmierdogmata

  Alt 8. Apr 2013, 13:50

[...]

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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz