Unity库存系统Slot与SlotsController职责划分设计是否合理?
Unity库存系统架构评估与优化建议
你当前的设计是合理的,不属于被诟病的上帝类Manager范畴,核心逻辑拆分符合面向对象设计原则。
现有架构的合理性说明
- 职责边界清晰:Slot类封装单个槽位的自身状态与原子操作(锁定、
Fill()填充、Free()释放、Stack()堆叠等),不需要感知其他槽位的存在,可复用性极强,后续如果要扩展快捷栏、仓库、商店槽位,只需继承Slot做少量定制即可。 - SlotsController仅承担全局交互调度职责,没有越权修改Slot的内部状态,所有对Slot的操作都通过其公开方法执行,和什么逻辑都往里塞的上帝类Manager有本质区别:你当前的SlotsController只做「什么时候调用哪个槽位的什么方法」的决策,不干涉每个方法内部的具体实现。
疑问解答
你提出的「将Slot的所有自有逻辑都封装在Slot类内部,仅通过SlotsController调用其公开方法」的思路完全正确,符合开闭原则:后续如果要调整槽位的堆叠规则(比如增加物品类型匹配校验、堆叠上限校验),只需要修改Slot的Stack()方法内部逻辑即可,不需要改动SlotsController的调度代码。
避免SlotsController臃肿的优化方案
如果担心后续迭代中SlotsController代码越来越膨胀,可以做如下优化:
- 拆分交互策略:将多选、堆叠、拖拽转移等不同交互逻辑抽成独立的策略类,比如
SlotStackStrategy、SlotMultiSelectStrategy,SlotsController仅持有这些策略实例,调度时调用对应策略的方法即可。 - 事件解耦:Slot触发点击等交互时,通过事件通知订阅者,不需要直接持有SlotsController的引用,进一步降低两个类的耦合度。
- 抽象公共逻辑:如果后续有背包、快捷栏、仓库等多个不同的槽位容器,可以将通用的调度逻辑抽成抽象基类
SlotsControllerBase,不同容器的控制器继承基类做自定义扩展,避免重复代码。
内容的提问来源于stack exchange,提问作者John W
相关产品推荐
相关产品推荐

