![]() |
Delphi-Version: 5
Wie ist der Programmierstil "professionell"
Hallo Zusammen,
ich habe hier mal eine Grundsatzfrage zum Thema Programmieren in Delphi
Delphi-Quellcode:
Erklärung:
procedure TfrmXXX.ZeileDelExecute(Sender: TObject);
begin dmXXX.qGETFertigteileeingang.ParamByName('AZID').AsInteger := dmXXX.AZQ.fieldbyname('AZ.ID').asinteger; dmXXX.qGETFertigteileeingang.Open; if (dmXXX.qGETFertigteileeingang.FieldByName('Anzahl').AsInteger > 0) then begin MessageDlg('Löschen der Auftragszeile NICHT möglich, da bereits Fertigteile daraus eingebucht wurden!', mtError, [mbOK], 0); dmXXX.qGETFertigteileeingang.close; exit; end; dmXXX.qGETFertigteileeingang.close; . . . .. code hier noch nicht zu ende. Es geht hier um einen Rowcount mit anschließender Auswertung, wenn die Anzahl > 0 dann soll er nach Meldung direkt abbrechen und die Procedure verlassen. Die query möchte ich aber immer geschlossen wissen. Frage: Unter Berücksichtigung von gutem Programmierstyle, Codewartbarkeit u.a. : Ist es so korrekt wie oben dargestellt? Oder benutze ich eine Variable als Zwischenspeicher wie hier:
Delphi-Quellcode:
procedure TfrmAuftrag.ZeileDelExecute(Sender: TObject);
var azid:Integer; begin dmAuftrag.qGETFertigteileeingang.ParamByName('AZID').AsInteger := dmauftrag.AZQ.fieldbyname('AZ.ID').asinteger; dmAuftrag.qGETFertigteileeingang.Open; azid := dmAuftrag.qGETFertigteileeingang.FieldByName('Anzahl').AsInteger; dmAuftrag.qGETFertigteileeingang.close; if (azid > 0) then begin MessageDlg('Löschen der Auftragszeile NICHT möglich, da bereits Fertigteile daraus eingebucht wurden!', mtError, [mbOK], 0); exit; end; Oder gib es einen ganz anderen Ansatz dafür? Antworte bitte mit Begründung :-) danke euch grüße Coderi |
AW: Wie ist der Programmierstil "professionell"
Die Extravariable ist wohl eher Geschmackssache, aber Exit verwende ich persönlich nur nur, wenn es gar nicht anders geht, dafür aber öfter mal ein try .. finally.
Delphi-Quellcode:
dmXXX.qGETFertigteileeingang.ParamByName('AZID').AsInteger := dmXXX.AZQ.fieldbyname('AZ.ID').asinteger;
dmXXX.qGETFertigteileeingang.Open; try if (dmXXX.qGETFertigteileeingang.FieldByName('Anzahl').AsInteger > 0) then MessageDlg(' .. ', mtError, [mbOK], 0) else begin end; finally dmXXX.qGETFertigteileeingang.close; end; |
AW: Wie ist der Programmierstil "professionell"
Ob nun Variable, Exit oder nicht - mir fällt da was ganz anderes auf in Hinsicht auf Wartbarkeit. Es handelt um etwas, was mit dem Dataset gemacht wird. Dennoch ist diese Logik scheinbar in einem Form oder Frame implementiert - warum nicht im Datamodule?
In der jetzigen Form kannst du das Datamodule nicht separat einsetzen bzw testen, es funktioniert nur in Verbindung mit diesem Form/Frame. |
AW: Wie ist der Programmierstil "professionell"
Um Stevies Bemerkung aufzunehmen, besser wäre wohl so etwas:
Delphi-Quellcode:
Wenn du dich an dieses Prinzip hälst kannst Du Problemlos die DB-Schnittstelle austauschen, ohne am eigentlichen Programm eine Änderung durchzuführen.
------
Datamodule: function Isrecordused(recnr:integer):boolean; .... result:=dmAuftrag.qGETFertigteileeingang.FieldByName('Anzahl').AsInteger>0; ... end; function Delete(recnr); .... end; ----------------- Hauptprogramm: if not(IsrecordUsed(recnr) then delete(recnr); (Namen sind Schall und Rauch! das Delete ist nicht der Weisheit letzter Schluß!) Gruß K-H |
AW: Wie ist der Programmierstil "professionell"
Zitat:
Delphi-Quellcode:
procedure SomeStuff;
begin SomeData.Open; try // Wenn man hier drüber weg ist, dann ... ... if SomeThing then Exit; ... finally // ... wird dieser Block immer ausgeführt SomeData.Close; end; end; |
AW: Wie ist der Programmierstil "professionell"
Wenn's "professionell" sein soll, dann muss man die Businesslogik extrahieren und entsprechend abbilden.
Wenn man viele Anweisung hat, die mehr als einen Punkt enthalten, dann müssen die Alarmglocken klingeln:
Delphi-Quellcode:
Also es ist klar, der Code zum Auslesen der Anzahl der Fertigteile gehört in das Datenmodul
procedure TfrmXXX.ZeileDelExecute(Sender: TObject);
begin // wir befinden uns in der Klasse TfrmXXX // und trotzdem greifen wir immer wieder auf die internen Dinge des Datenmoduls // TdmXXX zu dmXXX.qGETFertigteileeingang.ParamByName('AZID').AsInteger := dmXXX.AZQ.fieldbyname('AZ.ID').asinteger; // und hier schon wieder - 2. Punkte in einer Anweisung // das "stinkt" dmXXX.qGETFertigteileeingang.Open;
Delphi-Quellcode:
Und jetzt zum 2. Problem:
function TdmXXX.GetFertigteileAnzahl(azid : Integer):integer;
begin qGETFertigteileeingang.ParamByName('AZID').AsInteger := azid; qGETFertigteileeingang.Open; result := qGETFertigteileeingang.FieldByName('Anzahl').AsInteger; qGETFertigteileeingang.close; end; Es wird MessageDlg() verwendet wo eigentlich eine Exception ausgelöst werden sollte:
Delphi-Quellcode:
procedure TfrmXXX.ZeileDelExecute(Sender: TObject);
var anzahl : Integer; azid : Integer; begin azid := dmXXX.AZQ.fieldbyname('AZ.ID').asinteger; anzahl := dmXXX.GetFertigteileAnzahl(azid); if (anzahl > 0) then // Exception auslösen und dem Benutzer möglichst genaue Info geben wo das Problem ist raise Exception.CreateFmt('Löschen der Auftragszeile NICHT möglich, da bereits %d Fertigteile daraus eingebucht wurden (azid=%d)', [anzahl, azid]); |
AW: Wie ist der Programmierstil "professionell"
Zitat:
|
AW: Wie ist der Programmierstil "professionell"
Und um nicht in Versuchung zu kommen, kann man dem DataModule auch ein Interface verpassen und der Form nur dieses Interface übergeben. Dann ist Schluss mit dem wilden Zugreifen auf die Komponenten ;)
|
AW: Wie ist der Programmierstil "professionell"
Zitat:
1.) mehr Sourcecode 2.) falls man eine Methode ändern möchte, muss man an mindestens 3 Stellen ändern im Interface, in der Datenmodul-Klasse und beim Aufrufer Durch den zusätzlichen Aufwand auch noch das Interface zu ändern, werden einige Programmierer notwendige Änderungen unterlassen und sich irgendwie durchmogeln. Vielleicht wird dann zum Teil über das Interface und daneben auch direkt auf das Datenmodul zugegriffen (was natürlich sehr schlecht wäre). Interfaces haben eben ihre Vor- und Nachteile. |
AW: Wie ist der Programmierstil "professionell"
Zitat:
Es KÖNNTE jedoch hilfreich sein, eine Variable mit einem starken Namen einzuführen, damit diese den Code besser dokumentiert als so ein Monsterausdruck. Alles in allem also eher eine Frage des Geschmacks, der Situation und der Begleitumstände. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:07 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 by Thomas Breitkreuz