2012-10-13 26 views
6

Tôi đang học C# và đang cố gắng xoay sở khi sử dụng lớp học và khi không đến.Ví dụ về ngân hàng C# - lớp dành cho khách hàng - những gì để rút tiền, gửi tiền, v.v.

Nếu tôi viết ứng dụng cho ngân hàng, tôi biết tôi sẽ sử dụng các lớp cho khách hàng bao gồm tên, số tài khoản, số dư, v.v. Tôi có sử dụng lớp tĩnh cho các phương thức sẽ gửi vào tài khoản của họ không , rút ​​tiền, thay đổi địa chỉ của họ, vv vì tôi chỉ cần viết chúng một lần?

Ngoài ra, tôi sẽ sử dụng những gì để theo dõi mọi đối tượng khách hàng? Có 2.000 Khách hàng:

exampleName = new Customer(); 

trong mã của tôi có vẻ không đúng. Tôi không phải ở điểm học tập của cơ sở dữ liệu chưa và đang học các lớp học.

+0

@slugster Điểm công bằng. – nickhar

+1

Danh sách và các loại bộ sưu tập khác là quan trọng. Kiểm tra MSDN, quá: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx – varg

Trả lời

5

Có một cơ sở dữ liệu sẽ là lý tưởng, nhưng trong thời gian trung bình bạn có thể sử dụng một IEnumerable để giữ các đối tượng khách hàng của bạn, như thế này:

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

Sau đó, bạn chỉ có thể vượt qua danh sách xung quanh khi cần thiết.

Thông thường sau đó bạn sẽ có một tài sản trên lớp Customer chứa các tài khoản:

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

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

    private List<Account> _accounts; 
} 

Và vân vân. Lưu ý rằng tôi đang giữ điều này đơn giản và làm những điều dài hơn và mô tả như bạn là một người mới bắt đầu.

Sử dụng danh sách các mục theo cách này là một cách hay để bắt đầu vì bạn sẽ sử dụng chúng một cách tự nhiên khi bạn sử dụng cơ sở dữ liệu; bạn sẽ lấy các tập kết quả từ cơ sở dữ liệu và sau đó dịch các tập kết quả đó thành các danh sách các đối tượng nghiệp vụ.

Đối với việc sử dụng các phương pháp tĩnh để thực hiện logic nghiệp vụ như điều chỉnh số dư, thay đổi địa chỉ, v.v., cho bạn ở giai đoạn này không quan trọng. Nếu bạn đang sử dụng các công cụ như Resharper nó sẽ nag bạn với những gợi ý như thế, nhưng trong trường hợp của bạn, bạn có thể bỏ qua một cách cụ thể. Những gì bạn nên tìm là giữ mọi thứ càng khép kín càng tốt, tránh rò rỉ dữ liệu và rò rỉ trách nhiệm giữa các đối tượng - đây chỉ là kỷ luật mã hóa tốt và cách tốt để ngăn chặn các lỗi do mã hóa lỏng lẻo gây ra.

Khi bạn đã đặt chức năng của mình xuống và đang hoạt động, bạn có thể có một mong muốn di chuyển một số chức năng vào các lớp kiểu "trợ giúp" tĩnh. Điều này là hoàn toàn tốt đẹp, nhưng hãy cẩn thận - các lớp helper là tuyệt vời và tất cả mọi thứ nhưng có thể nhanh chóng biến thành một anti-pattern nếu bạn không duy trì kỷ luật mã hóa đó.

3

Bạn không cần sử dụng lớp tĩnh hoặc phương pháp tĩnh để chỉ viết các phương thức một lần. Nó có thể hoặc không thể làm cho tinh thần để làm như vậy, nhưng đây là một cách hoàn toàn hợp lệ để viết các phương pháp without repeating yourself:

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

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

này cũng cho phép bạn tận dụng polymorphism, ví dụ

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

gì cho withdrawls, tiền gửi, vv

Những sẽ được gọi là Giao dịch.

0

Các lớp tĩnh được sử dụng khi bạn không định tạo đối tượng. Bạn nhận được một "trường hợp" của lớp đó - bạn không thể làm những việc như:

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

khi bạn có một lớp tĩnh. Thay vào đó bạn sẽ sử dụng nó bằng cách sử dụng tên lớp. Một cái gì đó như:

MyStaticClass.SomeFunc(); 

Bạn sẽ sử dụng cái gì để theo dõi mọi đối tượng Khách hàng? Bạn có thể sử dụng một số loại bộ sưu tập để giữ chúng. Cấp, trong một hệ thống thực sự sẽ có một số loại bền bỉ, có thể là một cơ sở dữ liệu, để giữ dữ liệu. Nhưng bạn chỉ có thể làm một cái gì đó như:

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

Và sau đó thêm khách hàng của bạn vào danh sách đó

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

Quay lại câu hỏi về phương pháp tĩnh ...

Vì vậy, thỏa thuận ở đây là bạn sẽ không tham chiếu đến các thành viên trong một phương thức tĩnh, vì vậy bạn sẽ không sử dụng các phương thức tĩnh để cập nhật địa chỉ của một Khách hàng cụ thể. Giả sử lớp khách hàng của bạn trông giống như:

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

Bạn không thể sử dụng một phương pháp tĩnh như

public static void SetAddress() 

vì mỗi khách hàng (có lẽ) có một địa chỉ khác. Bạn không thể truy cập địa chỉ của khách hàng ở đó bởi vì địa chỉ đó không tĩnh. Nhận được rằng? Thay vào đó, bạn sẽ sử dụng một phương thức tĩnh nếu bạn muốn làm điều gì đó không cần phải xử lý dữ liệu cá thể. Tôi sử dụng phương pháp tĩnh cho những thứ như chức năng tiện ích.

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

Ở đây, hàm ComputeSomething có thể được gọi bởi bất cứ ai như:

var result = MyStaticClass.ComputeSomething(3.15); 

Các takeaway ở đây là tĩnh lớp không được sử dụng để nhanh chóng đối tượng, thay vì chúng được sử dụng thực sự như một container thuận tiện để giữ chức năng. Các hàm tĩnhcó thể nằm trên lớp không tĩnh nhưng không thể truy cập bất kỳ dữ liệu cá thể nào.

Một nơi có chức năng tĩnh sẽ được sử dụng cho mẫu Singleton. Bạn làm cho hàm tạo không công khai để mọi người không thể gọi nó, và thay vào đó cung cấp một phương thức tĩnh trên lớp để trả về cá thể duy nhất của lớp đó. Một cái gì đó như:

public class MySingleton 
{ 
    private static MySingleton instance; 

    private MySingleton() {} 

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

Điều này có nghĩa là ngoài các câu trả lời khác. Đây là ví dụ về đa hình với giao diện.

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

Giữ khái niệm tách biệt và cho phép triển khai nhiều giao diện hoặc chỉ một giao diện. Với cách tiếp cận kế thừa lớp bạn chỉ nhận được một, và bạn nhận được tất cả của nó. Chắc chắn bạn kết thúc với spaghetti trong kinh nghiệm của tôi bởi vì các lớp phụ muốn một số hành vi, nhưng không phải tất cả.

0

Tôi khuyên bạn nên thay vì đi vào chi tiết triển khai ngay lập tức trước tiên bạn viết một số câu chuyện người dùng đơn giản cho ví dụ ngân hàng của mình. Ví dụ

  1. Là một khách hàng tôi muốn mở một tài khoản mới để tôi có thể làm cho tiền gửi và withdrawls

Chỉ trong yêu cầu đó, chúng ta có thể hình dung một vài lớp học (khách hàng và tài khoản) . Từ đó chỉ có chức năng phân hủy những gì khách hàng nên làm và những gì tài khoản nên làm.

Tôi đã tìm thấy cuốn sách "Quy trình suy nghĩ hướng đối tượng" là một đọc tốt và sẽ giúp trả lời một số câu hỏi là "khi nào tôi làm điều này so với điều đó".

Chúc may mắn và vui chơi!

Các vấn đề liên quan