Hỏi về thiết kế class cho cửa hàng quần áo theo hướng đối tượng

Chào anh chị, em đang làm bài tập về xây dựng hệ thống bán quần áo theo hướng đối tượng! Bước đầu thì em định cho các class Jean, Kaki, Hoodie, Sweater kế thừa class Product. Anh chị cho em hỏi là nếu em thiết kế như vậy có được không ạ, nếu được thì mình sẽ đếm số lượng của 1 sản phẩm cụ thể sẽ như thế nào ạ!
Ví dụ em khởi tạo 3 đối tượng Jean
new(“Quần jean nam 2022”, “Việt Nam”, 26)
new(“Quần jean nam 2022”, “Việt Nam”, 28)
new(“Quần jean nữ 2022”, “Việt Nam”, 28)
đầu ra mong muốn là sẽ có 2 sản phẩm là
“Quần jean nam 2022” : số lượng 2;
“Quần jean nữ 2022” : số lượng 1;
Em nghĩ phải tạo một cái class riêng để đếm nhưng chưa biết nó có quan hệ với các class kia như nào ạ. Rất mong được anh chị giúp đỡ, em cảm ơn ạ!

Không. Phương thức đếm sẽ là static.

4 Likes

Vâng ạ, vậy bác có thể cho e hỏi cái phương thức đó nên nằm trong class nào ko ạ, em thấy nó mà nằm trong class Product thì cũng không hợp lý lắm. Ý của em thì định tạo 1 Class khác và nó chứa cái phương thức này ạ!

Đây là bài tập lớn môn OOP, hay chỉ là câu hỏi vẽ biểu đồ class cho cửa hàng quần áo thôi hả cậu?

3 Likes

Dạ đây là bài tập lớn ạ, nhưng em đang vẽ biểu đồ class trước ạ. Em mới bắt đầu làm thôi

Oh, vậy thì design cậu đưa ra không hợp lý đâu.
Tớ nghĩ cậu học qua môn database rồi. Hệ thống bán quần áo thường sẽ cần database, vậy sao cậu không thử design từ database schema (hoặc chí ít, design dùng sơ đồ thực thể liên kết ER) trước? :smile: Trừ khi có yêu cầu rõ ràng rằng cậu không cần dùng database, nếu không cậu nên thiết kế như bình thường thôi.

Hiện tại như cậu làm, cậu đang cố gắng sử dụng kế thừa với các concept OOP khác.
Dưới đây là vấn đề của thiết kế này, mà cậu không nên cố gắng theo cách thiết kế này để làm nữa.

  • Kế thừa mà cậu đang sử dụng không ổn lắm, “Product” rất trừu tượng (cái gì bán được cũng là product mà :smile:), các sub class của product không có sự khác biệt về mặt thuộc tính lẫn hành vi với “product”, vậy nên cậu thực ra chẳng cần bất cứ sub class nào của Product cả.
  • Inventory không phải thuộc tính của product, mà là thực thể riêng (a.k.a cậu sẽ cần 1 đối tượng inventory riêng để quản lý hàng tồn).
  • Product của cậu hiện giờ không có identity (tên sản phẩm không phải identity), nên cậu cần nó để cho inventory.
  • Cậu deal thế nào với product varient? (Áo với màu sắc khác nhau chẳng hạn? Cậu mới có size thôi). Cái cậu bán và quản lý tồn kho là product varient, không phải là product (cậu bán áo Mickey màu đỏ cỡ S, không phải bán áo Mickey thôi).

Với các vấn đề trên, hẳn nhiên việc tạo ra class cho từng sản phẩm là bất khả thi (trừ khi cậu định cứ mỗi khi đăng ký sản phẩm mới, cậu thay đổi source code, rebuild/redeploy hệ thống của cậu - bất tiện đúng không?). Vậy nên, đi từ dữ liệu (hoặc ER) trước sẽ giúp cậu design tốt hơn.

Thử xem nhé!

5 Likes

vâng ạ em cảm ơn
Nhưng mà anh ơi

Việc tạo ra class cho từng sản phẩm như vậy thì có hẳn là sai không ạ, trước em nghe thầy nói trong lập trình oop có thể phải tạo ra hàng nghìn class và đó cũng là 1 nhược điểm của oop(vì vậy nên em mới thử tạo ra class cho từng sản phẩm ạ)

1 Like

Việc tạo ra class cho từng sản phẩm như vậy thì có hẳn là sai không ạ

Ohm, tạo nhiều class chạy được, cơ mà:

  • Như tớ đề cập ở trước, cậu sẽ phải sửa mã nguồn mỗi khi có sản phẩm mới/loại sản phẩm mới.
    Nội việc đấy thôi cũng đủ khiến hệ thống của cậu rất khó maintain, khi cậu phải rebuild và redeploy liên tục.
  • Cậu có cách dễ hơn để thiết kế mà :smile:

Thiết kế tốt là thiết kế không giới thiệu thêm vấn đề mới trong tương lai :smile: Tớ nghĩ cậu dễ dàng chọn cách tốt hơn rồi, phải không?

trước em nghe thầy nói trong lập trình oop có thể phải tạo ra hàng nghìn class và đó cũng là 1 nhược điểm của oop(vì vậy nên em mới thử tạo ra class cho từng sản phẩm ạ)

Tớ không rõ thầy cậu nói câu đó trong context nào, cơ mà “hàng nghìn class” là khối lượng của 1 project cỡ lớn. Cậu không thể làm tốt hơn việc sử dụng OOP để cấu trúc hóa 1 hệ thống lớn đâu.
Có vẻ lời của thầy ấy khiến cậu hiểu nhầm và nghĩ nó là bình thường. Cơ mà, cậu cần hiểu, kỹ sư nên lười biếng về mặt cơ bắp, để từ đó thiết kế ra giải pháp không phải dùng nhiều cơ bắp quá.

Hope it helps!

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