Linux(mono)でVB、プロパティ(その4)

またmonoのvbncに戻ります。
プロパティを使ったAnimalクラスはこうなってました。

  3 Public Class Animal
  4         Private _classname As String = "哺乳類"
  5         Public ReadOnly Property Classname() As String
  6                 Get
  7                         Return _classname
  8                 End Get
  9         End Property
 10         Private _myname As String
 11         Public Property Myname() As String
 12                 Get
 13                         Return _myname
 14                 End Get
 15                 Set(ByVal value As String)
 16                         _myname = value
 17                 End Set
 18         End Property
 19
 20         Sub Tell()
 21                 WriteLine( classname & "です")
 22         End Sub
 23 End Class

ReadOnlyはともかく、GetとSetがあるPropertyってただの変数と何が違うのでしょう。
MynameについてPublicの変数にしたクラスと比べてみます。

  3 Public Class Animal
  4         Private _classname As String = "哺乳類"
  5         Public ReadOnly Property Classname() As String
  6                 Get
  7                         Return _classname
  8                 End Get
  9         End Property
 10         Public Myname As String
 11
 12         Sub Tell()
 13                 WriteLine( classname & "です")
 14         End Sub
 15 End Class

正直違いがわかりません。変数に直接アクセスするか、しないかの違いだけのように思えます。まあ、それが大きいのでしょうけど。

オブジェクト指向だから、データに直接アクセスはおかしい、と考えるなら、オブジェクト指向らしく、名前を付けるふるまいとしてName()というメソッドで実装する方が、SetやGetよりも分かりやすい気もします。AnimalにSetするって表現がおかしいですし。
AnimalにNameする形でクラスを書き直してみました。

  3 Public Class Animal
  4         Private _classname As String = "哺乳類"
  5         Public ReadOnly Property Classname() As String
  6                 Get
  7                         Return _classname
  8                 End Get
  9         End Property
 10         Private _myname As String = ""
 11         Public Sub Name(v As String)
 12                 _myname = v
 13         End Sub
 14
 15         Sub Tell()
 16                 WriteLine( _classname & "です")
 17         End Sub
 18 End Class

オブジェクト指向らしく、って考えていると要らないことばかり考えて、クラスが書けなくなるんですよねえ。
たとえば、動物に名前を付けるのって、つける側で認識しているだけだから、動物側って自分の名前を知らないんだよなあ・・・そうなると、Animalクラスに名前の変数は存在しなくなり・・・となって、こうなってしまいます。

  3 Public Class Animal
  4         Private _classname As String = "哺乳類"
  5         Public ReadOnly Property Classname() As String
  6                 Get
  7                         Return _classname
  8                 End Get
  9         End Property
 10         Public Sub Name(v As String)
 11         End Sub
 12
 13         Sub Tell()
 14                 WriteLine( _classname & "です")
 15         End Sub
 16 End Class

Nameメソッドは呼び出しされますが、当のAnimal君は、自分が名前を付けられたことを知らないので、何もしません。
なんじゃこりゃあ。

と、オブジェクト指向らしく、と考えていくと設計が固まりません。
別に、オブジェクト指向脱線してもよいのでは、と日々思います。

コメント

タイトルとURLをコピーしました