前回書いた「適切に設計されたコードの作成 (Delphi/VCL ベース)」を読んだ後、多くの友人が、この本の視点は受け入れられるように感じた、と言いましたが、単純すぎて具体性が不十分なように思えました。一部の友人もそれについて疑問を表明しました。そこでこの記事です。
前回、私が示した例は次のとおりです。 どこかから文字列のリストを取得し、それを TListBox に表示したいとします。 私が推奨するコードは次のとおりです。
オブジェクトXXX := TObjectXXX.Create;
ListBox1.Items := ObjectXXX.GetStringList;
ObjectXXX.Free;
確かに、これら 3 行のコードだけから判断すると、「オブジェクトの悪用」の疑いがあると思われることは認めます。この例は単純すぎるため、TObjectXXX には GetStringList というパブリック メンバー関数しかないという印象を与えている可能性があります。これが本当であれば、それは実際には「オブジェクトの不正使用」です。クラスはオブジェクトの抽象化であり、オブジェクトは状態と操作 (つまり、データとデータに対する操作) のコレクションで構成されます。したがって、状態のないオブジェクトはオブジェクトではありません。プライベート データ メンバーのないクラスの設計は失敗した設計です (つまり、クラスではなくインターフェイスです)。
それでは、インターフェイス コードと関数コードを分離する方法を説明する詳細な例を示しましょう。
単純な個人アドレス帳管理ソフトウェアを作成したいとします。明らかに、ソフトウェア全体が 2 つの部分に分かれています。1 つはユーザー指向の部分で、いわゆるインターフェイス部分は 4 つのボタン (それぞれ「追加」) を提供します。 、「削除」、「変更」、「検索」) および編集ボックス (アドレス帳情報の表示とユーザー入力の受け入れ) は、ユーザーと対話するために使用されます。他の部分は機能的、つまり、ソフトウェア内のアドレス帳。
したがって、機能部分を抽象化した TAddrBook クラスがあります。
TAddrBook = クラス
プライベート
//一部のプライベートメンバー
公共
コンストラクター作成;
デストラクタ Destroy;override;
GetCount: 整数;
FindRecord(strString): 整数;
GetRecord(nIndex:Integer): 文字列;
SetRecord(nIndex:integer; strRec:String): ブール値;
AddRecord(strRec:String): ブール値;
DelRecord(nIndex): ブール値;
//その他の共有メンバー関数
終わり;
プライベート メンバーを決定できない理由は、主にこのクラスの実装に依存します。
このようにして、アドレス帳へのアクセス操作のロジックをカプセル化できます。インターフェイス部分のコードには、これらのアクセス ロジックは含まれません。インターフェイス部分のコードは次のとおりです。
変数
フォーム1: TForm1;
アドレスブック: Tアドレスブック;
nCurRec: 整数;
実装
プロシージャ TForm1.FormCreate(送信者: TObject);
始める
AddrBook := TAddrBook.Create;
nCurRec := AddrBook.GetCount;
終わり;
プロシージャ TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
始める
AddrBook.無料;
終わり;
//追加ボタン
プロシージャ TForm1.Button1Click(送信者: TObject);
始める
AddrBook.AddRecord(memo1.Text) ではない場合
ShowMessage("エラー");
終わり;
//削除ボタン
プロシージャ TForm1.Button2Click(送信者: TObject);
始める
AddrBook.DelRecord(nCurRec) ではない場合
ShowMessage("エラー");
終わり;
//変更ボタン
プロシージャ TForm1.Button3Click(送信者: TObject);
始める
AddrBook.SetRecord(nCurRec, memo1.Text) ではない場合
ShowMessage("エラー");
終わり;
//検索ボタン
プロシージャ TForm1.Button4Click(送信者: TObject);
始める
memo1.Text := AddrBook.GetRecord(AddrBook.FindRecord(memo1.Text));
終わり;
上記のインターフェイス部分のコードにはアクセス ロジックが含まれておらず、各モジュールのコードはシンプルで理解しやすく、保守も容易です。実際、インターフェイス コードは、アドレス帳がデータベースに保存されているか、テキスト ファイルに保存されているかを知りません。データベースが使用されている場合、データベースに ODBC、ADO、または BDE を介してアクセスするかどうかはわかりません。実際、これらのアクセス ロジックは TAddrBook クラスの実装に依存します。TAddrBook クラスの実装は、別の .pas ファイルに配置できます。TAddrBook クラスの実装を変更しても、インターフェイス部分には影響しません。コードを保守するときは、変更を 1 つのモジュールに限定することが賢明です。
ニクロソフト([email protected]) 2001.7.14