その1ではOperatableNumberというオブジェクトを作成した。
thom.hateblo.jp
似たような内容になるが、今回はOperatableStringを作成してみようと思う。
※なお、サンプルなので変数の型などは一部省略している。
クラスモジュールを追加し、以下のコードを追加した後、OperatableStringという名称に変更する。
Dim s As String Property Let Value(x As String) s = x End Property Property Get Value() As String Value = s End Property Function Left(n) As OperatableString Dim tmpS As New OperatableString tmpS.Value = VBA.Left(s, n) Set Left = tmpS End Function Function Right(n) As OperatableString Dim tmpS As New OperatableString tmpS.Value = VBA.Right(s, n) Set Right = tmpS End Function Function Join(str) As OperatableString Dim tmpS As New OperatableString tmpS.Value = s & str Set Join = tmpS End Function
以下のテクニックを使用し、Valueをデフォルトプロパティにしておく。
thom.hateblo.jp
そしてこのオブジェクトを用いたコードがこちら。
Sub test() Dim s As New OperatableString s = "Hello, VBA!!" '普通に出力 Debug.Print s '従来通りのやり方 Debug.Print Left(Right(s, 5), 3) & " is easer than VB.NET" 'オブジェクトの機能を使ったやり方 Debug.Print s.Right(5).Left(3).Join(" is easer than VB.NET") '上記の操作を行っても、値に影響は与えない。 Debug.Print s End Sub
従来のやり方に比べるとカッコがネストせず左から順に適用されるので読みやすい。
※あくまでサンプルなので、Midでいいじゃないかというツッコミは無しで。
ところでVB.NETのString型は、オブジェクト型である。
VB.NETにもLeft, Right, Midは存在するようだがあまり使用されておらず、String型のメソッドであるSubstringを主に使用する。
IntegerやStringなどの基本型がメソッドを持っていると、記述がシンプルになって良い。
VB.NETのこの機能をうらやましいと思っていたが、クラスモジュールを使えば自分で実装できる。
余談であるが、Rubyという言語では面白いことにリテラルがメソッドを持つ。
リテラルというのはコード中に直接書かれている値のことである。
プログラミングの世界では変数を指して「値xを~」などという言い方もするので、直接書かれた値を「リテラル」という言葉で区別しているわけだ。
x = 10としたときの10はリテラルである。
MsgBox "Hello"としたときの"Hello"もリテラルである。
さて、リテラルがメソッドを持つとはどういうことか。
つまり、こう書けるのである。
"Hello, Ruby".slice(7,4)
sliceメソッドは、VBAでいうMid関数だと思えばよい。
上記は"Ruby"が帰ってくる。
文字列に命令を出せるなんて変な気はするが、優れたアプローチだと思う。
VBAもこれくらい進化してくれたら。。と時々思わなくもない。