Nachdem ich den Artikel „Gut gestalteten Code erstellen (basierend auf Delphi/VCL)“ gelesen hatte, den ich das letzte Mal geschrieben hatte, sagten mir viele Freunde, dass ich das Gefühl habe, dass ich die darin enthaltenen Standpunkte akzeptieren könne, aber er schien zu einfach und nicht spezifisch genug zu sein; Einige Freunde äußerten auch Zweifel daran. Ein kleines Beispiel für einige Einwände. Daher dieser Artikel.
Das letzte Mal war das Beispiel, das ich gegeben habe: Angenommen, Sie möchten eine Liste von Zeichenfolgen von irgendwoher abrufen und diese dann in einer TListBox anzeigen. Der Code, den ich empfehle, ist:
ObjectXXX := TObjectXXX.Create;
ListBox1.Items := ObjectXXX.GetStringList;
ObjectXXX.Free;
Tatsächlich gebe ich zu, dass allein aufgrund dieser drei Codezeilen der Verdacht auf „Objektmissbrauch“ besteht. Vielleicht ist das Beispiel zu einfach und erweckt den Eindruck, dass TObjectXXX nur eine öffentliche Mitgliedsfunktion hat, GetStringList. Wenn dies zutrifft, handelt es sich tatsächlich um „Objektmissbrauch“. Eine Klasse ist eine Abstraktion eines Objekts, und ein Objekt besteht aus einer Sammlung von Zuständen und Operationen (d. h. Daten und Operationen auf Daten). Daher ist ein Objekt ohne Zustand kein Objekt! Der Entwurf einer Klasse ohne private Datenelemente ist ein fehlgeschlagener Entwurf (d. h. keine Klasse, sondern eine Schnittstelle).
Okay, lassen Sie mich Ihnen ein detailliertes Beispiel geben, um zu veranschaulichen, wie Sie Schnittstellencode und Funktionscode trennen.
Angenommen, ich möchte eine einfache Software zur Verwaltung persönlicher Adressbücher erstellen. Offensichtlich ist die gesamte Software in zwei Teile unterteilt: Ein Teil ist benutzerorientiert, der sogenannte Schnittstellenteil, den ich bereitstellen kann. , „Löschen“, „Ändern“, „Suchen“) und ein Bearbeitungsfeld (Anzeige von Adressbuchinformationen und Akzeptieren von Benutzereingaben) dienen der Interaktion mit dem Benutzer; der andere Teil ist funktional, d. h. der Zugriffsvorgang des Adressbuch innerhalb der Software.
Es gibt also eine TAddrBook-Klasse, die eine Abstraktion des funktionalen Teils darstellt.
TAddrBook = Klasse
Privat
//Einige private Mitglieder
öffentlich
Konstruktor Erstellen;
Destruktor Destroy;override;
GetCount: Integer;
FindRecord(strString): Integer;
GetRecord(nIndex:Integer): String;
SetRecord(nIndex:integer; strRec:String): Boolean;
AddRecord(strRec:String): Boolean;
DelRecord(nIndex): Boolean;
//Andere gemeinsam genutzte Memberfunktionen
Ende;
Der Grund, warum private Mitglieder nicht ermittelt werden können, hängt hauptsächlich von der Implementierung dieser Klasse ab.
Auf diese Weise kann die Logik von Zugriffsvorgängen auf das Adressbuch gekapselt werden. Der Code im Schnittstellenteil umfasst diese Zugriffslogiken nicht. Der Schnittstellen-Teilecode lautet wie folgt:
var
Form1: TForm1;
AddrBook: TAddrBook;
nCurRec: Ganzzahl;
Durchführung
procedure TForm1.FormCreate(Sender: TObject);
beginnen
AddrBook := TAddrBook.Create;
nCurRec := AddrBook.GetCount;
Ende;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
beginnen
AddrBook.Free;
Ende;
//Schaltfläche hinzufügen
procedure TForm1.Button1Click(Sender: TObject);
beginnen
Wenn nicht AddrBook.AddRecord(memo1.Text), dann
ShowMessage("error");
Ende;
//Schaltfläche „Löschen“.
procedure TForm1.Button2Click(Sender: TObject);
beginnen
Wenn nicht AddrBook.DelRecord(nCurRec), dann
ShowMessage("error");
Ende;
//Schaltfläche „Ändern“.
procedure TForm1.Button3Click(Sender: TObject);
beginnen
Wenn nicht AddrBook.SetRecord(nCurRec, memo1.Text), dann
ShowMessage("error");
Ende;
//Schaltfläche „Suchen“.
procedure TForm1.Button4Click(Sender: TObject);
beginnen
memo1.Text := AddrBook.GetRecord(AddrBook.FindRecord(memo1.Text));
Ende;
Der Code im obigen Schnittstellenteil beinhaltet keine Zugriffslogik. Der Code jedes Moduls ist einfach, leicht zu verstehen und leicht zu warten. Tatsächlich weiß der Schnittstellencode nicht, ob das Adressbuch in einer Datenbank oder einer Textdatei gespeichert ist. Wenn eine Datenbank verwendet wird, weiß der Schnittstellencode nicht, ob auf die Datenbank über ODBC, ADO oder BDE zugegriffen wird. Tatsächlich hängen diese Zugriffslogiken von der Implementierung der TAddrBook-Klasse ab. Die Implementierung der TAddrBook-Klasse kann in einer separaten .pas-Datei abgelegt werden. Änderungen an der Implementierung der TAddrBook-Klasse haben keine Auswirkungen auf den Schnittstellenteil. Bei der Codepflege ist es ratsam, Änderungen auf ein einzelnes Modul zu beschränken.
Nicrosoft ([email protected]) am 14.7.2001