2011-08-09 12 views
0

Pro & VB.NetのクラスのShared(Static)メンバーに対して、Singletonクラスを介して一般的に使用されるメソッドを使用することについての短所。それは、時間、空間の複雑さ、またはベストプラクティスの観点からの可能性があります。どちらが良いですかSingletonクラスまたはShared(静的)メンバー関数

私は、ビジネスロジックを実行するメソッドを持つBankAccountクラスを持っています。

GetBalance() 
GetLast5Credits() 
GetMiniStatement() 

などの書き込み操作もあります。

このシナリオでは、メンバー関数にアクセスする方法はどれですか?共有またはシングルトン?

+0

これは確かに重複していますが、私は検索するのが面倒です。 – CodesInChaos

答えて

1

これは、アプリケーションで複数のBankAccountを使用するかどうかによって異なります。 基本的には、StaticまたはSingletonは、問題のオブジェクトのインスタンスを1つしか持てないことを意味します。この場合、BankAccountです。あなたが私に尋ねるならば、ただ1つのBankAccountを持つ銀行はかなり貧しい銀行です。 :) Hereはかなりまともな説明ですが、サンプルコードはC#

4

でもありません。依存関係が注入されたインスタンスを使用する必要があります。つまり、コードにインスタンスが1つしかないという前提を構築しないでください。ただ1つのインスタンスを作成するだけです。そうすれば、複数のインスタンスを簡単に使用できるようにソフトウェアを変更できます。

ここでの基本的な考え方は、あなたがあなたのクラスのコンストラクタにパラメータとして銀行口座を取るということです。

class MyClass 
{ 
    private readonly IBankAccount bankAccount; 

    public MyClass(IBankAccount bankAccount) 
    { 
    this.bankAccount=bankAccount; 
    } 
} 

あなたはたくさんのに渡す必要がある場合は、手動でそのようなクラスを作成することがいらいらすることができますので、あなたは通常、あなたのためにそれを行うために依存性インジェクタ/ IoCコンテナを使用します。


ステートレスな副作用のないヘルパー機能には、静的メソッドを使用する必要があります。 MathおよびEnumerableには静的メソッドの良い例があります。

一般に、グローバル可変状態を避ける必要があります。そして銀行口座は明らかに変更可能です。ここで古典的なシングルトンは悪いことではありません(テスト目的の実装に置き換えることができます)が、それでもやはり悪い選択です。

+0

+1ですが、例または少なくともリンクは、 '依存性が注入されたインスタンス 'の意味を理解するのに役立ちます。 –

0

個人的には、私は単体テストのためにシングルトンクラスを好みます。インスタンスクラスをモックすることはできますが、静的クラスをモックすることはできません。

1

私は...あなたがここでもしたい

を信じていませんが、今後の参考のために、共有クラスを使用すると、それが状態を維持するとは何かを持つべきではありません置くとして - 各静的メソッドは、のみで動作するはずですこれにより、このタイプのクラスはユーティリティー関数のためだけに役立ちます。

シングルトンは、アカウントに関連するデータをメモリに保存していた場合にのみ有効です。次には、銀行口座レコードのコレクションを含むインデクサーとしてシングルトンを実装できますが、競合条件に注意する必要があります。

関連する問題