Delphiプログラミングについて
?オブジェクト・プログラミングについては、何冊かDelphi本を読んだだけでまだ、手を動かしての実践はまだの状態です。
fdelの次期バージョン作成に伴い、時間がかかるかもしれないけど、Delphiでのクラスを使ったプログラミングをマスターしたいと
思っています。
作業を進めるにあたり疑問に思ったことや、新たな発見などを、書き留めていきます。
◆疑問点(Q)
1)クラスをインスタンス化する際に、単に変数を定義しただけで使う場合と、Createまで行う場合が有るけど、 どう違うのだろう?(初歩的疑問) 2)不要なメモリを解放してやりたいけど、メモリから解放する方法は? また、メモリの使用状況をモニタする方法は あるか? 3)クラス内の変数と、クラス外の変数の使い分ける意味はあるか? 4)作成した一つのクラスを、効率良くテストする方法は? IDEでそのような機能があるか調べてみる。IDEになければ、テスト用のソースの書き方を試行錯誤してみる。 5)配列を使った処理をクラスに移行するには? 現バージョンは「レコード型」を定義して「動的配列」を使ってメモリを確保してるけど、 クラスではどのように書いたらいいか? 但し、なるべく元のソースは修正したくない...
◆やること、やったこと(Y)
・手続き、関数、クラスの文法を確認する ・簡単なクラスを作って、コンパイル&実行させてみる IDEの動きや取得できる情報を確認してみる ・TListを使ってリストの動作を確認する
◆わかったこと(W)
1)クラスをインスタンス化する際に、単に変数を定義しただけで使う場合と、Createまで行う場合が有るけど、どう違うのだろう?
→クラスをインスタンス化するにはCreateが必要であった。 →あるソースを見たときに、レコード型(先頭文字がTでクラスと同じ)の変数をCretae無しで使っているのを見て、クラス はCreateしないで使えるのかと見間違えていたようだ。 →クラスをCreateしないで変数のみ定義して使うとどうなるか実験してみた。 結果は、①フィールドへのアクセスが出来ない ②メソッドは使用可能(もちろんフィールドを使用したメソッドは異常終了する) クラスの変数を定義した時点では、メソッドの実行アドレスはセットされているようだ。 なので、メソッドは使用可能。 フィールド部分については、Createしてはじめてフィールド部分のメモリ領域が取得され、変数に取得したメモリ領域のアドレ スがセットされているようだ。 で、Createしないとフィールドは使えない。
2)不要なメモリを解放してやりたいけど、メモリから解放する方法は? また、メモリの使用状況をモニタする方法はあるか?
→メモリの解放は「Free」「Destroy」「Dispose」などのメソッドがあるが、どんな場面でどのメソッドを使えばよいか、 まだピンときていない。 →メモリの使用状況をモニタする方法については、見つけられなかった。 適切にメモリを開放しないと「メモリーリーク」になるとどこかで読んだけど、よく理解できなかった。 メインフレームならば、ユーザがメモリを解放しなかったり、実行中に異常終了しても、OSがユーザに代わって確実にメモリ を解放してくれる。 PCの場合、どのような管理をしているのか...
3)クラス内の変数と、クラス外の変数の使い分ける意味はあるか?
→今のところ、全ての変数はどこかのクラスに属しているようにコーディングしても問題なさそう... 試行錯誤してみよう
4)作成した一つのクラスを、効率良くテストする方法は?
IDEでそのような機能があるか調べてみる。IDEになければ、テスト用のソースの書き方を試行錯誤してみる。
→IDEでは便利な機能は見つけられなかった。 当面、テスト用のユニットを用意して、テストしながら試行錯誤してみるつもり...
5)配列を使った処理をクラスに移行するには?
現バージョンは「レコード型」を定義して「動的配列」を使ってメモリを確保してるけど、
クラスではどのように書いたらいいか? 但し、なるべく元のソースは修正したくない...
→クラスの外でレコード型を定義して、クラス内でその型を使用するのは問題なくできた。
<まとめ>
大まかなクラスの使用方法は確認できたと思うが、自分なりのプログラミング作法みたいなものが、見つけられなかった。 仕事でDelphiを使うときは、SQL Server相手のDBプログラミングがほとんどで、めんどくさい処理はストアド で作成していたし、表示はDBGridを使っていたため、Delphiではほとんどコーディングしないで済んできた。 ある意味、「DB」と「ストアドプロシージャ」を作成することは、「クラス」で「フィールド、メソッド」 を作成するのと同じかも... 今回はDBを使っていないため、細かいところまでコーディングが必要となる。 fdelの新バージョンを作りながら、クラス化の試行錯誤をしようと思う。
◆つぎにやること(T)
1)fdelの内部の「データ項目」や「機能」を分類して、「クラス」を抽出してみる 2)それぞれのクラスの「依存関係」と、必要な「メソッド」を明確にしてみる 3)「メソッド」の「引数」を明確にしながら、「クラス」の構成を見直す 4)「インターフェース」部をコーディングして、「インプリメント」部に現バージョンのソースを移行してみる 5)新規のメソッドは新たにコーディングし、テスト...
うまくいけば、完成のはず... GWのお楽しみ!
◆追記 2010/05/10
どうもこのまま進めるのに不安を感じ、図書館でUML本を読み漁ってみた。
多分10冊ほどのUML本を斜め読みしてたと思うが...
オブジェクト指向やモデリングについて、まだまだ理解出来ていないことがわかった。
遠回りかもしれないが、UML、モデリングについてお勉強しようと思う。
で、とりあえず、UML本(「モデリングの本質」児玉公信著)を読んでみることと、
有料版のUMLツール(Enterprise Architect PRO)入手したのでこれを使って試行錯誤してみるつもり。