6

私は C# を学んでおり、クラスをいつ使用し、いつ使用しないかについて頭を悩ませようとしています。

私が銀行向けのアプリを書いていたとしたら、名前、口座番号、残高などを含む顧客用のクラスを使用することはわかっています。顧客の口座に入金、引き出し、変更するメソッドに静的クラスを使用しますか?一度だけ書く必要があるので、彼らの住所など?

また、すべての顧客オブジェクトを追跡するには何を使用すればよいでしょうか? 2,000 人の顧客を持つ:

exampleName = new Customer();

私のコードでは正しくないようです。私はまだデータベースを学習する段階ではなく、クラスを学習しているだけです。

4

6 に答える 6

5

データベースを持つことが理想的ですが、それまでの間、次のように IEnumerable を使用して Customer オブジェクトを保持できます。

List<Customer> myCustomers = new List<Customer>();
myCustomers.Add(new Customer {Name = "Bob", Address = "123 Anywhere St." });  

次に、必要な場所にリストを渡すだけです。

通常Customer、アカウントを保持するクラスにプロパティがあります。

public class Customer
{
    public Customer()
    {
        _accounts = new List<Account>();
    }

    public List<Account> Accounts 
    {
        get { return _accounts; }
        set { _accounts = value; }
    }

    private List<Account> _accounts;
}

等々。あなたが初心者であるため、私はこれを単純に保ち、より長くて説明的な方法で物事を行っていることに注意してください.

このようにアイテムのリストを使用することは、データベースを使用するときに自然にこれらを使用するため、開始するのに適した方法です。データベースから結果セットを取得し、それらの結果セットをビジネス オブジェクトのリストに変換します。

残高の調整やアドレスの変更などのビジネス ロジックを実行するために静的メソッドを使用する場合は、この段階では問題ありません。Resharper のようなツールを使用している場合、そのような提案が表示されますが、あなたの場合は、その特定のものを安全に無視できます。あなたが探すべきことは、すべてを可能な限り自己完結型に保ち、データの漏洩やオブジェクト間の責任の漏洩を避けることです.

機能を配置して動作させると、一部の機能を静的な「ヘルパー」スタイル クラスに移動したい場合があります。これはまったく問題ありませんが、注意してください。ヘルパー クラスは素晴らしいものですが、コーディングの規律を維持しないと、すぐにアンチ パターンになってしまう可能性があります。

于 2012-10-13T02:38:24.440 に答える
3

メソッドを 1 回だけ記述するために、静的クラスまたは静的メソッドを使用する必要はありません。そうするのは理にかなっているかもしれませんし、そうでないかもしれませんが、これは自分自身を繰り返さずにメソッドを書くための完全に有効な方法です:

public class Customer
{
    //properties, constructors, etc.

    public virtual void Deposit(decimal amount) { }
    public virtual void Withdraw(decimal amount) { }
    //etc
}

これにより、ポリモーフィズムを利用することもできます。

public class BusinessCustomer : Customer
{
    public override void Deposit(decimal amount) { //some other implementation }
}
于 2012-10-13T02:42:08.697 に答える
1

静的クラスは、オブジェクトをインスタンス化しない場合に使用されます。そのクラスの「インスタンス」を 1 つ取得します。次のようなことはできません。

MyStaticClass m = new MyStaticClass();
m.SomeFunc();

静的クラスを取得したとき。代わりに、クラス名自体を使用して使用します。何かのようなもの:

MyStaticClass.SomeFunc();

すべての Customer オブジェクトを追跡するために何を使用しますか? これらを保持するために、ある種のコレクションを使用できます。確かに、実際のシステムでは、データを保持するためのある種の永続化要素 (おそらくデータベース) が存在します。しかし、次のようなものを作ることができます:

IEnumerable<Customer> Customers = new List<Customer>();

そして、そのリストに顧客を追加します

Customers.Add(new Customer() { ... });

静的メソッドに関する質問に戻ります...

したがって、ここでの取り決めは、静的メソッドでインスタンス メンバーを参照しないということです。そのため、静的メソッドを使用して特定の顧客の住所を更新することはありません。Customer クラスが次のようになっていると仮定します。

public class Customer
{
   public string Address { get; set; }
}

次のような静的メソッドを使用できませんでした

public static void SetAddress()

各顧客は (おそらく) 異なる住所を持っているためです。静的ではないため、顧客のアドレスにアクセスできませんでした。分かった?代わりに、インスタンス データを処理する必要のない何かを実行したい場合は、静的メソッドを使用します。ユーティリティ関数などには静的メソッドを使用します。

public static double ComputeSomething(double someVal) { ... }

ここで、ComputeSomething 関数は次のように誰でも呼び出すことができます。

var result = MyStaticClass.ComputeSomething(3.15);

ここで重要なのは、静的クラスはオブジェクトをインスタンス化するために使用されるのではなく、実際には関数を保持するための便利なコンテナーとして使用されるということです。静的関数は、非静的クラスに配置できる関数ですが、インスタンス データにはアクセスできません。

静的関数が使用される場所の 1 つは、Singleton パターンです。コンストラクターを非公開にして、人々がそれを呼び出せないようにし、代わりにクラスに静的メソッドを提供して、クラスの唯一のインスタンスを返します。何かのようなもの:

public class MySingleton
{
   private static MySingleton instance;

   private MySingleton() {}

   public static MySingleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new MySingleton();
         }
         return instance;
      }
   }
}
于 2012-10-13T02:46:08.900 に答える
0

すぐに実装の詳細に入る代わりに、銀行の例の簡単なユーザー ストーリーを書き留めておくことをお勧めします。例えば

  1. 顧客として、入金と出金ができるように新しい口座を開設したい

その要件だけで、いくつかのクラス (顧客とアカウント) を想定できます。そこから、顧客がすべきこととアカウントがすべきことを機能的に分解します。

「The Object Oriented Thought Process」という本は読みやすく、「いつこれを行うか、あれを行うか」に関するいくつかの質問に答えるのに役立つことがわかりました。

頑張って楽しんでね!

于 2012-10-13T10:27:42.413 に答える
0

引き出し、預金などについて

それらはTransactionsと呼ばれます。

于 2012-10-13T02:44:05.823 に答える
0

これは、他の回答に追加することを意図しています。これは、インターフェイスを使用したポリモーフィズムの例です。

public interface IDeposit {
    void Deposit(decimal amount);
}

public interface IWithdraw {
    void Withdraw(decimal amount);
}

public class Customer : IDeposit, IWithdraw {
    public void Deposit(decimal amount) { throw new NotImplementedException(); }
    public void Withdraw(decimal amount) { throw new NotImplementedException(); }
}

public class DepositOnlyATM : IDeposit {
    public void Deposit(decimal amount) { throw new NotImplementedException(); }
}

概念を分離し、複数のインターフェースを実装することも、1 つだけ実装することもできます。クラス継承アプローチでは、1 つだけを取得し、すべてを取得します。サブクラスは一部の動作を必要としますが、すべてではありません。

于 2012-10-13T02:52:10.860 に答える