2012-10-13 15 views
6

Ich lerne C# und versuche, mich zu fragen, wann ich Klassen benutzen soll und wann nicht.C# -Bank-Beispiel - Klasse für Kunden - Was für Rückzüge, Einzahlungen, usw.

Wenn ich eine App für eine Bank geschrieben habe, weiß ich, dass ich Klassen für Kunden verwenden würde, die ihren Namen, Kontonummer, Kontostand usw. enthalten. Würde ich eine statische Klasse für die Methoden verwenden, die auf ihr Konto einzahlen würden , zurückziehen, ihre Adresse ändern usw., da ich sie nur einmal schreiben muss?

Auch, was würde ich verwenden, um jedes Kundenobjekt zu verfolgen? Mit 2.000 Kunden:

exampleName = new Customer(); 

in meinem Code scheint nicht richtig. Ich bin noch nicht am Lernen von Datenbanken und lerne gerade Klassen.

+0

@Slugster Messepunkt. – nickhar

+1

Liste und andere Arten von Sammlungen sind wichtig. Überprüfen Sie auch MSDN: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx – varg

Antwort

5

mit einer Datenbank wäre ideal, aber in der Zwischenzeit können Sie eine IEnumerable verwenden Ihre Kunden Gegenstände zu halten, wie folgt aus:

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

Dann können Sie einfach die Liste herumgehen, wo nötig.

der Regel werden Sie dann eine Eigenschaft auf der Customer Klasse, die die Konten gilt:

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

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

    private List<Account> _accounts; 
} 

Und so weiter. Beachten Sie, dass ich dies einfach halte und die Dinge auf eine langwierigere und beschreibendere Weise mache, als Sie Anfänger sind.

Verwenden von Listen von Elementen auf diese Weise ist eine gute Möglichkeit zu starten, weil Sie diese natürlich verwenden werden, wenn Sie eine Datenbank verwenden; Sie werden Ergebnismengen aus der Datenbank abrufen und diese Ergebnismengen in Listen von Geschäftsobjekten übersetzen.

Wie für die Verwendung von statischen Methoden, um Geschäftslogik wie Anpassen von Salden, Ändern von Adressen usw. für Sie in diesem Stadium ist es egal. Wenn Sie Tools wie Resharper verwenden, wird es Sie mit solchen Vorschlägen nerven, aber in Ihrem Fall können Sie dieses bestimmte ignorieren. Was Sie suchen sollten, ist, alles so eigenständig wie möglich zu halten, Datenlecks zu vermeiden und Verantwortlichkeiten zwischen Objekten zu leugnen - das ist nur eine gute Codierungsdisziplin und eine gute Möglichkeit, Bugs zu verhindern, die durch lockere Codierung verursacht werden.

Sobald Sie Ihre Funktionalität festgelegt haben und arbeiten, möchten Sie möglicherweise einige Funktionen in statische "Helfer" -Stilklassen verschieben. Das ist absolut in Ordnung, aber seien Sie vorsichtig - Hilfsklassen sind fantastisch und alles andere kann schnell zu einem Anti-Muster werden, wenn Sie diese Kodierungsdisziplin nicht aufrechterhalten.

3

Sie müssen keine statische Klasse oder statische Methoden verwenden, um die Methoden nur einmal zu schreiben. Es kann oder auch nicht sinnvoll, so zu tun, aber das ist eine absolut gültige Weise die Methoden without repeating yourself zu schreiben:

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

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

Dies auch Sie von polymorphism machen kann, z.B.

public class BusinessCustomer : Customer 
{ 
    public override void Deposit(decimal amount) { //some other implementation } 
} 
0

was für withdrawls, Einlagen, etc

Das wären Transaktionen aufgerufen werden.

0

Statische Klassen werden verwendet, wenn Sie keine Objekte instanziieren. Sie erhalten eine "Instanz" dieser Klasse - Sie können keine Dinge wie:

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

wenn Sie eine statische Klasse haben. Stattdessen würden Sie es verwenden, indem Sie den Klassennamen selbst verwenden. Etwas wie:

MyStaticClass.SomeFunc(); 

Was würden Sie verwenden, um jedes Kundenobjekt zu verfolgen? Sie könnten eine Art Sammlung verwenden, um diese zu halten. Zugegeben, in einem echten System würde es eine Art Persistenzstück geben, wahrscheinlich eine Datenbank, um die Daten zu halten. Aber man konnte einfach machen so etwas wie:

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

Und dann Ihre Kunden hinzufügen zu dieser Liste

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

Zurück auf die Frage nach statischen Methoden ...

So, hier ist der Deal dass Sie keine Instanzelemente in einer statischen Methode referenzieren, also würden Sie keine statischen Methoden verwenden, um die Adresse eines bestimmten Kunden zu aktualisieren. Angenommen, Ihre Customer-Klasse sah aus wie:

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

Sie nicht eine statische Methode wie

public static void SetAddress() 

, weil jeder Kunde (vermutlich) eine andere Adresse verwenden könnte. Sie konnten dort nicht auf die Kundenadresse zugreifen, da diese nicht statisch ist. Hast du das? Stattdessen würden Sie eine statische Methode verwenden, wenn Sie etwas tun möchten, das nicht mit Instanzdaten umgehen muss. Ich verwende statische Methoden für Dinge wie Utility-Funktionen.

var result = MyStaticClass.ComputeSomething(3.15); 

Das Essen zum Mitnehmen ist hier, dass statische Klassen werden nicht verwendet, um Objekte zu instanziiert, sondern sie werden verwendet, wirklich als:

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

Hier kann die ComputeSomething Funktion von jedermann wie genannt werden praktischer Behälter, um Funktionen zu halten. Statisch Funktionen sind diejenigen, die in einer nicht statischen Klasse sein können, aber nicht auf alle Instanzdaten zugreifen können.

Eine Stelle, an der eine statische Funktion verwendet würde, wäre das Singleton-Muster. Sie machen den Konstruktor nicht öffentlich, so dass Leute ihn nicht aufrufen können, und stattdessen eine statische Methode für die Klasse bereitstellen, um die einzige Instanz der Klasse zurückzugeben. Etwas wie:

public class MySingleton 
{ 
    private static MySingleton instance; 

    private MySingleton() {} 

    public static MySingleton Instance 
    { 
     get 
     { 
     if (instance == null) 
     { 
      instance = new MySingleton(); 
     } 
     return instance; 
     } 
    } 
} 
0

Dies soll zu den anderen Antworten hinzugefügt werden. Dies ist ein Beispiel für Polymorphismus mit Schnittstellen.

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(); } 
} 

Hält Konzepte getrennt und ermöglicht die Implementierung mehrerer Schnittstellen oder nur einer. Mit Klassenvererbung nähert man sich nur einem, und man bekommt alles. Zwangsläufig enden Sie mit Spaghetti in meiner Erfahrung, weil Unterklassen etwas vom Verhalten wollen, aber nicht alles.

0

Ich würde empfehlen, anstatt in die Implementierungsdetails sofort zu kommen, dass Sie zuerst einige einfache Benutzergeschichten für Ihr Bankbeispiel aufschreiben. Zum Beispiel

  1. Als Kunde würde Ich mag ein neues Konto eröffnen, damit ich Ablagerungen machen und WITHDRAW

Gerade in dieser Anforderung können wir ein paar Klassen (Kunden und Konto) vorstellen . Von dort nur funktionell zerlegen was der Kunde tun soll und was der Account tun soll.

Ich habe festgestellt, dass das Buch "The Object Oriented Thought Process" eine gute Lektüre ist und helfen wird, einige der Fragen zu beantworten "wann mache ich das vs. das".

Viel Glück und viel Spaß!

Verwandte Themen