Delphiプログラミングについて

30 4月, 2010 (12:41) | Delphi, fdel | By: ohishi

 オブジェクト・プログラミングについては、何冊か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)入手したのでこれを使って試行錯誤してみるつもり。

 

Write a comment