FreeBASIC マニュアルのトップに戻る

FreeBASIC 非OOP言語でのOOP

目次→教本→いっしょに学ぼうOOP In Non-OOP Languages←オリジナル・サイト

非OOP言語でのOOP 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る


一般に考えられているのとは逆に、オブジェクト指向プログラミングは、オブジェクト指向言語を必要としません。

あなたがオブジェクト指向言語で得るものは、オブジェクト指向でプログラムを書くのを助ける、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


いっしょに学ぼう に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2019-03-11 08:21:33
日本語翻訳:WATANABE Makoto、原文著作者:KevinWhitefoot

ホームページのトップに戻る

表示-非営利-継承