Bài tập đa hình, kế thừa

Đây là một dạng bài tập mà em đã gặp nhiều lần nhưng chưa biết cách giải quyết hợp lý (do không biết từ khóa của nó), nên mong mọi người có thể bỏ một chút thời gian xem qua bài tập của em ạ.

Class TàiKhoản chứa thuộc tính số dư và danh sách các giao dịch.
Class GiaoDịch chứa thuộc tính số tiền giao dịch và 3 class con là 3 loại giao dịch:

  • Rút tiền
  • Nạp tiền
  • Chuyển khoản: trừ TK mình, cộng cho TK khác

Tuy nhiên các method giao dịch đều cần phải sửa số dư của class TàiKhoản.
Vậy theo mọi người em nên thiết kế như nào cho phù hợp ạ?

Mỗi GiaoDich gọi get set thôi.

5 Likes

Vậy làm sao để giao dịch biết nó phải get/set số dư của TàiKhoản nào ạ? (Mối quan hệ của TàiKhoản và GiaoDịch là: TàiKhoàn chứa thuộc tính mảng GiaoDịch)
Hay là cần thiết kế Command pattern ạ

Tại sao bạn lại chọn mối quan hệ như vầy? Như vầy thì đối với GiaoDich ChuyểnKhoản thì bạn sẽ lưu như thế nào?

Bạn vẫn nên xem kỹ command pattern kia xem có ứng dụng được gì không nhé.

3 Likes

Đây là đề nhập môn LT HĐT trường mình, nên mình nghĩ nó không phức tạp đến thế. Nhưng mình sẽ tham khảo command pattern, cảm ơn bạn nhé.

Chuyển khoản bào gồm 2 action

  • Rút tiền acount A roi luu history
  • Nạp tiền AccoutB roi luu history.
    Nếu bài tập thông thường thì ko cần pattern. tập trung làm sao có được tính đa hình.
4 Likes

bạn đang thiết kế object giao dịch (danh sách) nằm trong object tài khoản, là thuộc tính của tài khoản
bản thân object giao dịch không thể tồn tại khi không có tài khoản
như vậy, khi bạn tạo giao dịch mới, giao dịch đó phải luôn nằm trong danh sách giao dịch của một tài khoản nào đó (nạp & rút)
còn về chuyển khoản thì cái này là 2 giao dịch, cộng tiền tài khoản này, trừ tài khoản kia, bạn có thể chuyển nó thành 2 giao dịch và thêm nó vào danh sách của 2 tài khoản

bạn đang không phân biệt được database và data object
bạn không thể nào làm cái trò thiết kế mấy cái object và có thể biểu diễn như database được

3 Likes

Đề chi tiết đây ạ

Theo như bạn và bạn @nguyenhuuca, thì GiaoDịch chỉ có 2 class con là cộng và trừ tiền thôi phải không ạ?

Class là đối tượng, chủ thể của hành động.
Cộng và trừ tiền là hành động, hay nói cách khác là method chứ không phải class.
Để cho dễ hình dung thì thông tin nào có thể lưu trữ được, và cần được lưu trữ thì mới cho vô class.

4 Likes

Cái này mình hiểu, ý mình là chỉ còn 2 class con là Rút tiền và Nạp tiền ấy (nhưng vì mỗi loại giao dịch đều có biểu phí riêng nên mình sửa lại là cộng và trừ cho hợp lý thôi). Và bài này yêu cầu đa hình nên mình phải làm các class con.

Theo mình hiểu bài này là vận dụng kiến thức lập trình hướng đối tượng để giải quyết bài toán thực tế. Bạn có thể tạo class con như thế nào cho hợp lý, chứ không phải gượng ép tạo nhiều class con.

Mình nghĩ nếu ngay từ đầu bạn post rõ đề lên thì @nguyenhuuca sẽ có câu trả lời khác. Ở đây nên xem lại cách đặt vấn đề (câu hỏi) cho những lần sau.

Theo như đề của bạn thì cách chia class như bạn đặt ra ban đầu là cũng hợp lý rồi.

4 Likes

Cảm ơn bạn, lỗi mình ạ ^^

Này khác xa vơi yêu cầu lúc đầu đấy :v.

1 Like

Cái command pattern kia thì cũng có gì đâu mà lại bảo quá phức tạp nhỉ. Các class thì cứ thiết kế như vầy thôi.

class TaiKhoan{
  int so_du=0;
public:
  void update(int);
};

class GiaoDich{
public:
   virtual void execute()=0;
   virtual ~GiaoDich=default;
};

class RutTien: public GiaoDich{
public:
  RutTien(TaiKhoan* tk, int so_tien){...}
  void execute() override {this->tk->update(-so_tien);}
};

class NapTien: public GiaoDich{
public:
  NapTien(TaiKhoan* tk, int so_tien){...}
  void execute() override {this->tk->update(+so_tien);}
};

class ChuyenKhoan: public GiaoDich{
public:
  ChuyenKhoan(TaiKhoan* from, TaiKhoan* to, int so_tien){...}
  void execute() override {
    this->from->update(-so_tien);
    this->to->update(+so_tien);
  }
};

Rồi cứ tạo 1 danh sách tài khoản, 1 danh sách giao dịch là xong thôi. Cái yêu cầu kiểm lỗi gì gì đó thì hiện thực trong hàm update, lỗi thì quăng exception, rồi trong hàm execute sẽ try...catch để update giao dịch thành công/thất bại.

Bonus: 3 hàm execute trên kia code bị lặp lại khá nhiều, bạn có thể thiết kế lại sao cho ít code lặp nhất không?

5 Likes

Em làm xong sẽ up bài lên ạ

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?