Einzelnen Beitrag anzeigen

TPok

Registriert seit: 19. Jul 2004
Ort: Eisenach
25 Beiträge
 
Delphi 2005 Professional
 
#1

Guter Stil oder 'Wie programmiere ich vernünftig?'

  Alt 18. Apr 2006, 23:19
Hallo,

leider ist mir kein besserer Threadtitel eingefallen.
In letzter Zeit bin ich beim Programmieren immer wieder auf Konstrukte gestoßen, bei denen ich mir unsicher bin, wie ich sie in sauberen Quellcode presse. Natürlich habe ich mir dazu Gedanken gemacht und werde diese hier darstellen. Ich bitte euch, meine Gedanken zu kommentieren und mir ggf. einen besseren Weg vorzuschlagen.

Ich verwende in meinen Beispielen hier aufgrund meines aktuellen Projektes .Net-Code. Die Probleme lassen sich aber ebenso in Win32-Code darstellen.

Fall 1:
Ich führe eine Prozedur aus, die auf verschiedene Werte aus einer Ini-Datei angewiesen ist. Fehlt einer der Werte, kann die Aufgabe nicht erfüllt werden. Es soll dann eine Fehlermeldung ausgegeben und die Verarbeitung abgebrochen werden. Prinzipiell läßt sich dieses Problem auf jeden Programmteil verallgemeinern, der linear abgearbeitet und im Fehlerfall unterbrochen werden soll.

Lösungsidee:
Einlesen aller Werte nacheinander. Falls ein Wert fehlt -> Ausgabe einer Meldung und Prozedurabbruch per exit
Beispiel:
Delphi-Quellcode:
If not ReportDoc.GetLogOnData(ReportDoc.GetIniValue('AutoDB'), loServer,
  loDB, loUser, loPass) then
begin
  MessageBox.Show('Es konnten keine Logindaten für die Datenbank ' +
    'gefunden werden.' + #13#10 + 'Ini-Datei, Key: AutoDB',
    'Fehler', MessageboxButtons.OK, MessageBoxIcon.Error);
  exit
end;

If Directory.Exists(OutputPath) then
begin
  MessageBox.Show('Das Ausgabeverzeichnis existiert bereits.',
   'Fehler', MessageboxButtons.OK, MessageBoxIcon.Error);
  exit
end
else
  try
    Directory.CreateDirectory(OutputPath)
  except
    MessageBox.Show('Fehler beim Erstellen des Ausgabeverzeichnisses.' +
      Environment.NewLine + '(' + OutputPath + ')',
      'Fehler', MessageboxButtons.OK, MessageBoxIcon.Error);
    exit
  end;
Kann man das so machen?
Ein Problem fällt mir dabei sofort auf. Diesen handle ich mir durch das exit ein. Falls ich vor diesem Abschnitt z.B. einen Button deaktiviere und danach wieder aktivieren will, wird dies im Fehlerfall nicht ausgeführt, da die Prozedur einfach abgebrochen wird.

Fall 2:
Es ist ja hinlänglich bekannt, dass man zum Ressourcenschutz try..finally..end-Blöcke verwendet. Was mache ich aber, wenn ich gleich mehrere Objekte zur Laufzeit erstellen muß? Es kann ja prinzipiell überall ein Fehler auftreten. Das einzige, was mir einfällt, wäre ein Schachteln der Blöcke.

Hier ein Beispiel:
Delphi-Quellcode:
SqlConn := SqlConnection.Create;
try
  SqlConn.ConnectionString := 'Application Name=' + self.Text + ';' +
    'Persist Security Info=True;' +
    'Data Source=' + loServer + ';' +
    'Initial Catalog=' + loDB + ';' +
    'User Id=' + loUser + ';' +
    'Password=' + loPass + ';';

  SqlComm := SqlCommand.Create(SqlAbfrage, SqlConn);
  try
    LogLines := StringCollection.Create;
    try
      try
        SqlConn.Open;
      except
        MessageBox.Show('Fehler bei der Anmeldung an der Datenbank.', 'Fehler',
        MessageboxButtons.OK, MessageBoxIcon.Error);
        exit
      end;

      try
        SqlDR := SqlComm.ExecuteReader;
      except
        // Fehlermeldung ausgeben...
      end;
        
      try
        // Daten hier verarbeiten
      finally
        SqlDR.Free
      end;
    finally
      LogLines.Free
    end;
  finally
    SQLComm.Free
  end:;
finally
  SQLConn.Free
end;
Also wenn das nich grausam aussieht... Geht sowas nicht hübscher?

Das waren jetzt erstmal die 2 Fälle, die mir besonders auf dem Herzen lagen. Ich hoffe, ihr könnt mir weiterhelfen, damit sich mein Programmierstil wieder ein Stück verbessern kann. Falls mir noch etwas einfällt, weiß ich ja, wo ich Hilfe bekomme.

Danke für eure Hilfe,
Stephan
Stephan Fietzek
  Mit Zitat antworten Zitat