佐々木屋

技術的なことから趣味まで色々書きます

クラスを考える④(静的クラス)

静的クラス(モジュール)のおさらい

静的クラス(VB.NETではモジュールと言います)は通常クラスと違い、インスタンスを作成しないクラスです。よって、newキーワードによる静的クラスの変数を作成することは出来ません。と言いつつ、実際には一つだけ実体が作成されており、これをプログラム内で共通して参照します。

初学者がクラスを作成しようとしたとき、静的クラス(モジュール)にするか、通常クラスにするかで迷うと思います。VB6時代の手続き型が染みついてる人だと、ほとんどクラスの意義や役割を理解せず作成する傾向にあります。結果、静的クラスと通常クラスがゴッチャになったものが出来上がります。酷いとすべて静的に且つPublicメンバーで作っちゃったり。C#VB.NETの世界ではオブジェクト指向が主流なので、しっかりそれぞれの役割を分けて考えるようにしましょう。

静的クラスの作り方

C#VB.NETで違います。

C#の場合は、アクセス修飾子の後に「static」を追加します。なお、静的クラスのメンバー、メソッドは全て静的(static)にしなければなりません。

VB.NETの場合は、冒頭のクラス名の部分の「Class」を「Module」で作成します。当然最後も「End Module」で閉じます。C#と違い、メンバー、プロパティ、メソッドに静的な言葉を入れる必要はありません。自動的に静的扱いとなります。

public static class 生地作り{
    public static bool hogeFlg = false;
    public static int HogeNumber { get; set; }
    
    public static bool CreateKiji() {
        //生地を作る処理
        return true;
    }
}
Public Module ValueFunction
    Public hogeFlg As Boolean = false;
    Public Property HogeNumber As Integer
    
    Public Function CreateKiji() As Boolean
        '生地を作る処理
        Return True
    End Function
End Module


静的クラスで作るかどうか

色々ありますが、私の場合は以下の区分けで静的を考えます。
インスタンスを作成する必要がない
・継承を使用しない
・オーバーライドしない
・動的なメンバーを持たない=静的メンバーのみで事足りる
・大量のリソース(マネージ、アンマネージ関係なく)を持ったり操作しない
・扱うメンバーのほとんどがプリミティブ型
・メソッドの戻り値が単純
・アンマネージリソースを利用しない


例えば、前回お話した、たい焼きを作るクラスの場合は、以下の構造です。
<変数>
・作る個数
・焼き時間
・あんの種類
<メソッド>
・焼く(引数はなし、戻り値は成功か失敗)

そうすると、メンバー変数をいくつかもつような構造で、且つ同時多発的にたい焼きを作る(インスタンスを作る)可能性があるので、これは静的クラスには向かないということにります。


それでは、たい焼きの生地だけを作るクラスを考えた場合どうでしょうか。
<変数>
・不要
<メソッド>
・生地を作る(分量を引数として、戻り値は成功か失敗)

この場合はメンバー変数がありませんし、複数からメソッドが実行されても特に競合することはありませんので、静的クラスで作成しても問題ありません。
但し、これはあくまで「できる」という話なだけで、実際通常クラスにするのかどうはプログラマに委ねられます。