Tôi có nền C và là một newb trên C++. Tôi có một câu hỏi thiết kế cơ bản. Tôi có một lớp (Tôi sẽ gọi nó là "đầu bếp" b/c vấn đề tôi có vẻ rất tương tự như này, cả về độ phức tạp và các vấn đề) mà về cơ bản các công trình như thế nàyC++ Trợ giúp về tái cấu trúc lớp quái vật
class chef
{
public:
void prep();
void cook();
void plate();
private:
char name;
char dish_responsible_for;
int shift_working;
etc...
}
trong mã giả, điều này được triển khai dọc theo các dòng:
int main{
chef my_chef;
kitchen_class kitchen;
for (day=0; day < 365; day++)
{
kitchen.opens();
....
my_chef.prep();
my_chef.cook();
my_chef.plate();
....
kitchen.closes();
}
}
Lớp đầu bếp ở đây có vẻ là lớp quái vật và có tiềm năng trở thành một lớp. đầu bếp cũng dường như vi phạm các nguyên tắc trách nhiệm duy nhất, vì vậy thay vì chúng ta nên có cái gì đó như:
class employee
{
protected:
char name;
int shift_working;
}
class kitchen_worker : employee
{
protected:
dish_responsible_for;
}
class cook_food : kitchen_worker
{
public:
void cook();
etc...
}
class prep_food : kitchen_worker
{
public:
void prep();
etc...
}
và
class plater : kitchen_worker
{
public:
void plate();
}
vv ...
Tôi phải thừa nhận là vẫn phải vật lộn với cách thực hiện nó trong thời gian chạy để, nếu ví dụ plater (hoặc "đầu bếp trong khả năng của mình như plater") quyết định về nhà giữa dịch vụ ăn tối, sau đó các đầu bếp đã làm việc một sự thay đổi mới.
Điều này dường như liên quan đến một câu hỏi rộng hơn, nếu cùng một người làm việc chuẩn bị, nấu ăn và mạ trong ví dụ này, lợi thế thực tế thực tế của việc phân cấp lớp này là gì làm? Tôi đoán điều đó xảy ra với điều "sợ thêm lớp học", nhưng đồng thời, ngay bây giờ hoặc trong tương lai gần, tôi không nghĩ việc duy trì lớp học đầu bếp trong toàn bộ nó là khủng khiếp rườm rà. Tôi cũng nghĩ rằng đó là một cảm giác thật sự dễ dàng hơn cho người đọc ngây thơ của mã để xem ba phương pháp khác nhau trong đối tượng đầu bếp và tiếp tục.
Tôi hiểu rằng nó có thể đe dọa trở nên khó sử dụng khi chúng ta thêm các phương thức như "cut_onions()", "cut_carrots()", v.v ..., có lẽ mỗi dữ liệu của riêng họ bằng cách làm cho hàm prep(), nói, mô đun hơn. Hơn nữa, có vẻ như SRP đưa đến kết luận hợp lý của nó sẽ tạo ra một lớp "onion_cutters" "carrot_cutters" vv ... và tôi vẫn gặp khó khăn khi nhìn thấy giá trị của điều đó, bởi vì bằng cách nào đó chương trình phải đảm bảo rằng cùng một nhân viên cắt hành và cà rốt giúp giữ biến trạng thái giống nhau trên các phương pháp (ví dụ, nếu nhân viên cắt hành ngón tay của mình thì anh ta không còn đủ điều kiện để cắt cà rốt nữa), trong khi ở lớp đầu bếp đối tượng quái vật thì có vẻ như tất cả đều được chăm sóc. Tất nhiên, tôi hiểu rằng điều này sau đó trở nên ít hơn về việc có một "thiết kế hướng đối tượng" có ý nghĩa, nhưng dường như tôi phải có các đối tượng riêng biệt cho mỗi nhiệm vụ của đầu bếp (có vẻ không tự nhiên, cho rằng cùng một người đang làm cả ba chức năng) thì dường như ưu tiên thiết kế phần mềm trên mô hình khái niệm. Tôi cảm thấy một thiết kế hướng đối tượng là hữu ích ở đây nếu chúng ta muốn có, nói, "thịt_chef" "sous_chef" "three_star_chef" có khả năng những người khác nhau. Hơn nữa, liên quan đến vấn đề thời gian chạy là có một chi phí phức tạp, theo ứng dụng nghiêm ngặt của nguyên tắc trách nhiệm duy nhất, phải đảm bảo dữ liệu cơ bản tạo nên nhân viên của lớp cơ sở thay đổi và thay đổi này là được phản ánh trong các bước thời gian tiếp theo.
Do đó, tôi rất muốn từ bỏ nó nhiều hơn hoặc ít hơn. Nếu ai đó có thể làm rõ lý do tại sao điều này sẽ là một ý tưởng tồi (và nếu bạn có đề xuất về cách tốt nhất để tiến hành) tôi sẽ có nghĩa vụ nhất.
Đôi khi lập bản đồ thực vai trò thế giới/trách nhiệm/nhiệm vụ cho các đối tượng trong mã chỉ không hoạt động. Có lẽ bạn cần một số chức năng chung mà có một người và một hành động. Chức năng đó sẽ giúp người đó áp dụng hành động. –
mô-đun trên mỗi giao diện lớp học có thể cung cấp cho bạn nhiều manh mối hơn? giống như những gì một plater có thể làm gì? cook_food có thể làm gì? họ có cần phải kế thừa hay chỉ là một kỹ năng (gọi hàm)? – billz
Nhìn vào phương pháp bố cục. Hoặc có thể bạn cần một mô hình nhà nước ở đây? –