Mã hóa thực sự không khó lắm . Phần khó là viết mã có ý nghĩa, dễ đọc và dễ hiểu. Vì vậy, tôi muốn có được một nhà phát triển tốt hơn và tạo ra một số kiến trúc vững chắc.
Vì vậy, tôi muốn tạo một kiến trúc cho các NPC trong một trò chơi video. Đây là một trò chơi Chiến lược thời gian thực như Starcraft, Age of Empires, Command & Conquers, v.v. Vì vậy, tôi sẽ có các loại NPC khác nhau. Một NPC có thể có từ một đến nhiều khả năng (phương pháp) của các: Build()
, Farm()
và Attack()
.
Ví dụ:
Công nhân có thể Build()
và Farm()
Chiến binh có thể Attack()
Công dân có thể Build()
, Farm()
và Attack()
Ngư dân có thể Farm()
vàAttack()
Tôi hy vọng mọi thứ rõ ràng cho đến nay.
Vì vậy, bây giờ tôi có các loại NPC và khả năng của chúng. Nhưng chúng ta hãy đến với khía cạnh kỹ thuật / chương trình.
Điều gì sẽ là một kiến trúc lập trình tốt cho các loại NPC khác nhau của tôi?
Được rồi tôi có thể có một lớp cơ sở. Thật ra tôi nghĩ đây là một cách tốt để tuân thủ nguyên tắc DRY . Vì vậy, tôi có thể có các phương thức như WalkTo(x,y)
trong lớp cơ sở của mình vì mọi NPC sẽ có thể di chuyển. Nhưng bây giờ hãy đến với vấn đề thực sự. Tôi thực hiện khả năng của mình ở đâu? (hãy nhớ: Build()
, Farm()
và Attack()
)
Vì các khả năng sẽ bao gồm cùng một logic, sẽ gây khó chịu / phá vỡ nguyên tắc DRY để triển khai chúng cho từng NPC (Công nhân, Chiến binh, ..).
Được rồi tôi có thể thực hiện các khả năng trong lớp cơ sở. Điều này sẽ đòi hỏi một số loại logic thẩm tra nếu một NPC có thể sử dụng khả năng X. IsBuilder
, CanBuild
, .. Tôi nghĩ rằng đó là rõ ràng những gì tôi muốn bày tỏ.
Nhưng tôi không cảm thấy tốt với ý tưởng này. Điều này nghe có vẻ như một lớp cơ sở cồng kềnh với quá nhiều chức năng.
Tôi sử dụng C # làm ngôn ngữ lập trình. Vì vậy, nhiều kế thừa không phải là một lựa chọn ở đây. Phương tiện: Có thêm các lớp cơ sở như Fisherman : Farmer, Attacker
sẽ không hoạt động.