Đây là mã của tôi:Object thiết kế theo định hướng đề nghị
class Soldier {
public:
Soldier(const string &name, const Gun &gun);
string getName();
private:
Gun gun;
string name;
};
class Gun {
public:
void fire();
void load(int bullets);
int getBullets();
private:
int bullets;
}
tôi cần phải gọi tất cả các chức năng thành viên của Gun qua một đối tượng Soldier. Một cái gì đó như:
soldier.gun.fire();
hoặc
soldier.getGun().load(15);
Vì vậy, cái nào là một thiết kế tốt hơn? Ẩn đối tượng súng làm thành viên riêng và truy cập nó bằng hàm getGun(). Hay biến nó thành một thành viên công cộng? Hoặc tôi có thể đóng gói tất cả các chức năng này sẽ làm cho việc triển khai khó khăn hơn:
soldier.loadGun(15); // calls Gun.load()
soldier.fire(); // calls Gun.fire()
Vậy bạn nghĩ điều gì là tốt nhất?
Kết hợp câu trả lời từ Stephen và Thất vọng. Có một 'get_gun()' riêng có thể hoạt động cần thiết cho người lính để lấy khẩu súng, như Stephen cho thấy, nhưng nói với * người lính * phải làm gì, không phải khẩu súng, như Frustrated cho thấy. – GManNickG
@GMan - Cảm ơn, tôi đồng ý. Tuy nhiên, thay vì cách tiếp cận @ Frustrated, nói với người lính phải làm gì sẽ là phương pháp tiếp cận của @ Austin? ví dụ. soldier.Attack() thay vì "soldier.loadGun()". – Stephen
@Stephen: Vâng, bạn có thể làm cho đóng gói sâu hơn như bạn muốn. Câu hỏi của tôi chỉ là về phần này. Tất nhiên bạn có thể nói soldier.Attack() và bên trong chức năng này bạn có thể kiểm tra nếu (! Gun.getBullets()) trả lại hoặc các công cụ như thế. – pocoa