一般に考えられているのとは逆に、オブジェクト指向プログラミングは、オブジェクト指向言語を必要としません。
あなたがオブジェクト指向言語で得るものは、オブジェクト指向でプログラムを書くのを助ける、1セットの内蔵の構造物です。しかし、多くの場合、それは不要です。そして、時々、それらは非生産的です。
とにかく、これは、オブジェクト指向言語に対して、暴言を吐いているのではありません。オブジェクト指向プログラムを書くために、特にオブジェクト指向言語が必要だという考えに、疑問を持たずに受け入れることに対して、警鐘を鳴らしているのです。
オブジェクト指向言語を持つ必要がないことを示すために、ここでは、通常、クラスにもとづくプログラミングの例として、紹介されるテクニックを、提示します。
そして、したがって、あなたはこの例で、word クラスを見つけないでしょう。
ほとんどの Basics で、多くの文字列を連結しようとすると、通常、それは、時間がかかる過程であることがわかります。
実際に、FreeBasic の文字列操作は、著しく迅速ですが、それでも、"string builder" を使うほうがよいでしょう。
StringBuilder は、単に、メモリ資源配分関数への、繰り返し呼び出しを避ける方法で、文字列バッファを維持するクラスです。これがかなりリソースを消費する操作だからです。
クラスのメソッドは、バッファを操って、バッファとネイティブ文字列型の間で変換する方法を、提供します。
トリックは、大きな文字列と、多数の文字列追加のために、構築された型より、速くします。
このトリックは、文字列を、文字列の実際の長さより常に大きい、一塊で割り当てられたバッファに、保持します。
これは、文字列の端に追加していく処理を、通常、単純に、新しい文字列の内容を、現在の文字列の最後の文字に続く記憶域の場所にコピーする処理に、代替することです。
この実現では、バッファが、ZString なので、バッファの内容を通常の動的な文字列に変換することは、簡単です。
FreeBasic のモジュールは、struct のために型定義をカプセル化します。
この struct のインスタンスは、オブジェクトの属性を保持します。
方法は、単純に通常の FreeBasic 公開の関数と、同じモジュール内で定義された sub です。
メソッドを呼ぶとき、あなたは、通常の FreeBasic 構文を使います:
s = StringB_ToString
(AStringBInstance)
慣例によって、すべてのメソッド名は、クラスとアンダーラインの名前で始まります。そして、最初の引数は、常に型のインスタンスです。
この引数は、状態への変化が永久であることを確実にして、そのうえ、不必要な、時間がかかるコピーを避けるために、常に参照渡しされなければなりません。
新しいメソッドを加えたいときは、単純に、新しい関数か sub を、それらの規則に従って、加えます。
あなたは、容易にオブジェクトの構成を実行できますが、通常、期待した方法では、継承ができません。
あなたは、単純に、ほかの場所で、クラス型の引数を取る新しい関数を定義することによって、クラスを拡張することができます。
元のクラスが、全てのメソッドを、多重定義できるように定義するなら、あなたは同じ名前の新しいメソッドを作ることさえできます。それらに異なった署名がある前提ですが。
ここに、コードの例があります:
'
-----------------------------------------------------------------------------
' 内蔵 oop のないクラス
' 特性のための struct と、それぞれのメソッドのための sub か 関数を定義します。
' すべての呼びで、最初の引数として、struct を渡します。
' 慣例によって、引数は、VB Classic の中のように、Me にります。
' FB の文字列操作は、とても速いので、string builder class は、多くの時間を必要としません。
' しかし、たとえば、ウェブ・ページを作るために、何千もの文字列を連結したいときには、
' これは役に立つかもしれません。
' 継承の欠落に関しては、不平を言わないでください。
' 継承はオブジェクト使用の必要条件ではありません。
' オブジェクト指向プログラミングの法的定義は、ありません。
' しかし、どんな定義ででも、最も重要な部分は、
' データと、それを操作するコードの間の、緊密な関係です。
'より多くのメソッドを提供するために、容易にこのクラスを拡張することができます。
'
-----------------------------------------------------------------------------
Type StringB
Len As Integer ' 長さとして使う
allocated As Integer
s As ZString Ptr ' 少なくとも len 文字の、バッファ
End Type
'
-----------------------------------------------------------------------------
' これらの構築子のひとつを呼んで、新しい StringB を作成します
'
-----------------------------------------------------------------------------
Public Function StringB_New Overload (ByVal InitialSize As Integer) As StringB
Dim sb As StringB
sb.allocated = InitialSize
sb.s = Allocate
(InitialSize)
*sb.s = ""
StringB_New = sb
End Function
Public Function StringB_New(ByRef InitialValue As String) As StringB
Dim sb As StringB
sb = StringB_New
(Len(InitialValue))
*sb.s = InitialValue
sb.len = Len
(InitialValue)
StringB_New = sb
End Function
Public Sub StringB_Dispose
(ByRef Me As StringB)
Deallocate Me.s
End Sub
Public Function StringB_ToString(ByRef Me As StringB) As String
StringB_ToString = *Me.s
End Function
Sub StringB_Append Overload
(ByRef Me As StringB, ByRef s As String)
Dim i As Integer = Me.len
Me.len += Len
(s)
If Me.len >= Me.allocated Then
Me.allocated = 2*Me.len
Dim As ZString Ptr p = Reallocate
(Me.s, Me.allocated )
If p=0 Then
' 再割当てに、失敗します
Print "StringB_Append failed to reallocate", Me.allocated
Return
End If
Me.s = p
End If
*(Me.s + i)
= s
End Sub
Sub StringB_Append
(ByRef Me As StringB, ByRef other As StringB)
StringB_Append Me, StringB_ToString
(other)
End Sub