メソッドとオブジェクト指向について?

タグの編集
投稿者 実年  (社会人) 投稿日時 2009/2/12 05:28:50
開発環境はVB2008です
メソッドの作り方で、実引数と仮引数の考え方がわかりかねます
なにかめちゃくちゃなプログラムですが、ご指導お願いします。

(1)ボタンをクリックすると車が移動するという極めて簡単なプログラムです


Public Class Form1    

Dim s As Integer      

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click     
 
  idou(s, PictureBox1)    
End Sub    

Sub idou(ByVal x As Integer, ByVal pb As PictureBox)   ’移動メソッド 

    x = 20     
   pb.Left -= x   

 End SubEnd Class


(2)上記のプログラムをオブジェクト指向的に書くと下記のようになりますか?   


それと※の部分がコンストラクタでよろしのでしょうか?

Public Class Form1    
   Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click       

Dim s As Integer = 0        
Dim idou1 As idou = New idou(s, PictureBox1)  

  End Sub
End  Class

Class idou    

  ※  Public Sub New(ByVal x As Integer, ByVal pb As PictureBox)      
  x = 20        pb.Left -= x    
End Sub


End Class
投稿者 るきお  (社会人) 投稿日時 2009/2/12 05:55:01
オブジェクト指向の考え方の根本はプログラムの一連の動作を現実世界に存在するような「もの」(オブジェクト)に見立てて、その「もの」のふるまい(=メソッド)の組み合わせとして処理を記述することです。
ですから、なにをオブジェクトと考えるかがもっとも重要です。

このために本格的なシステムであれば、プログラムによって実現したいことをあらかじめよく分析・設計してなにをオブジェクトするか、どういうふるまいをもたせるかを決定します。この過程がオブジェクト指向分析やオブジェクト指向設計です。

今回のプログラムでは「車が移動する」のですから、「車」がオブジェクトで、その車オブジェクトには「移動する」というふるまいがあることになります。この時点で車オブジェクトをプログラムに落とすと次のようになります。
   
Publi Class Kuruma
    Public Sub Idou
    End Sub
End Class


ただし、今回「車」と呼んでいるものはPictureBoxのようですので、私は「移動可能なPictureBox」MovablePictureBoxというオブジェクトを考えて次のようにしてみました。
   
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click

        MovablePictureBox1.idou(20)

    End Sub

End Class

Public Class MovablePictureBox

    Inherits PictureBox

    Public Sub idou(ByVal x As Integer)
        Me.Left -= x
    End Sub
End Class

このプログラムをビルドするとツールボックスにMovablePictureBoxが自動的に作成され、TextBoxやButtonのようにマウスでフォームに貼り付けることができます

実年さんのプログラムではidouがクラスになっています。これは「移動」という抽象的なものがオブジェクトになっており、現実世界に存在するようなものをオブジェクトととらえていません。
もちろん、ちゃんとしたオブジェクト指向の中でもおよそ現実には存在しないようなものをオブジェクトと認定することは多々ありますが、この小さなプログラムではその必要はないでしょう。
多くの場合オブジェクトになるものは名詞で表現されます。「移動」のように動詞で表現されるものはふるまい(=メソッド)になります。

なお、私としてはオブジェクト指向は重要ではありますが、単なる考え方であってなにかの研究でもしているのでなければあまりこだわらなくていいのではないかと思っています。VBを使ってできるだけ少ない労力でよいものをつくろうとあがいていると自然とできあがるものはオブジェクト指向的なものになります。

>メソッドの作り方で、実引数と仮引数の考え方がわかりかねます
私は実引数と仮引数を特に区別して考えるメリットはほとんど感じていません。実引数と仮引数についてどの点がわかりませんか?
実年さんのプログラムで(1)を例にとると、idouメソッドの仮引数はxとpbで、実引数はsとPictureBox1になっています。

>それと※の部分がコンストラクタでよろしのでしょうか?
はい。
VBでは名前がNewであるメソッドはすべてコンストラクタで、これ以外にコンストラクタはありません。

※今回投稿の都合上Form1とMovablePictureBoxを続けて書きましたが、本来は1つのクラスは1つのファイルに書くことが推奨されており、私も実際であればMovablePictureBoxは別のファイルに書きます。
投稿者 実年  (社会人) 投稿日時 2009/2/12 20:07:40
るきお様
私ごときのために貴重な時間を使って丁寧にご説明いただき感謝申し上げます。
愚鈍な頭のために、短い時間で咀嚼できないのがつらいところです。

もう少し勉強してから、また質問させていただきます。
有り難うございました。