首页 / 知识
关于不可知的语言:OO设计,开放/封闭原则问题
2023-04-17 01:32:00

OO Design, open/closed principle question我已经思考了这个面向对象的设计问题已有一段时间了,并且无法提出令人满意的解决方案,因此我想将其向此处的人群开放以征求一些意见。
我有一个Game类,它代表一个基于回合的棋盘游戏,对于这个问题,我们可以假定它类似于Monopoly。
游戏遍历所有玩家,并调用TakeTurn方法执行所有必要的操作以完成转弯。
游戏仅知道Player类,并且仅依次依次对每个Player调用TakeTurn方法。
在没有让Game类明确知道各种Player类的实际实现的情况下,我无法提出一个很好的解决方案。 任何意见,将不胜感激。
我认为您不应该让Game类处理IO。 游戏类应该关心的只是棋盘的状态和转弯。所有玩家都应实现一个Player界面,并从游戏中隐藏所有实现。
我可能没有两个 玩家获取信息以决定其在下一轮游戏中的动作的方式是唯一变化的(至少与原始问题描述不同),因此只需将其封装在单独的抽象中即可。
无论设置游戏的任何高级班级,都应该创建两组玩家(一个人,另一台计算机模拟的),并为每个玩家提供适当的输入策略,然后将这些玩家对象简单地赋予游戏对象。然后,对于每个新回合,Game类将仅在给定的玩家列表上调用 如果游戏正在管理游戏状态并进行I / O,则游戏做得太多。
您希望Game严格专注于规则和转弯以及状态更改。 您希望玩家检查游戏状态并在回合期间执行法律诉讼。 人类玩家和整个游戏都共享一个通用的I / O程序包,该程序包可显示游戏状态并提示人类输入。
通过将I / O包作为游戏的 Player提供给Game的接口与派生的Player类的行为正交。 TakeTurn的实现根据Player对象的具体类型而变化的事实不应引起关注。 与其告诉游戏类只有一个人,为什么不让它在游戏的菜单/初始化过程中得到输入呢?如果还有更多玩家,可以在游戏类初始化之前通过某种形式的输入(在菜单中选择玩家)来 代替游戏类在所有玩家上调用TakeTurn,玩家应在游戏类上调用TakeTurn,并且游戏类应验证是否合适的玩家轮到他。 这应该有助于解决用户和计算机播放器问题。 我会说,Game类应该不在乎这是计算机玩家还是人类玩家。它应该始终在下一个玩家类上调用TakeTurn。如果这是人类玩家,则Player类的职责是与用户交流并询问用户该怎么做。这意味着它将一直阻塞直到用户下定决心。由于通常UI交互是在应用程序的主线程中发生的,因此仅重要的一点是,阻塞的TakeTurn不会阻塞整个应用程序,否则在Game等待TakeTurn时无法处理用户输入。 我不确定这是否是您想要的
我认为
任何用户输入都需要由 |
最新内容
相关内容
linux常用命令c语言?
linux常用命令c语言?,系统,工作,信息,管理,基础,命令,地址,目录,简介,时间,linux常用的20个命令?系统管理相关命令:df、top、free、quota、at、linux命令行设置语言?
linux命令行设置语言?,系统,管理,环境,国家,工具,电脑,软件,文化,底部,语言,linux命令行下怎样改变语言1、将内容改为:LANG=zh_CN.UTF-8LANGUAGlinux使用命令改语言?
linux使用命令改语言?,系统,工作,管理,电脑,设备,字符集,中文,命令,语言,虚拟机,请问linux虚拟机装好以后怎么把英文改成中文?1、vmware设置中linux命令解决方案?
linux命令解决方案?,系统,管理,数据,电子,工作,电脑,软件,情况,不了,档案,linux处理/tmp文件空间不足1、删除缓存文件 缓存文件是临时存储在磁c语言写linux命令?
c语言写linux命令?,系统,工具,代码,智能,工作,环境,情况,位置,命令,文件,如何在C语言编程中调用linux系统终端下的命令1、C语言有一个system函linux汇编语言命令?
linux汇编语言命令?,系统,地址,代码,数据,网络,平台,平均,位置,灵活,工作,汇编语言指令的基本格式是什么1、有以下几种基本格式:标号,又称为指令linux汇编语言命令?
linux汇编语言命令?,系统,地址,代码,数据,网络,平台,平均,位置,灵活,工作,汇编语言指令的基本格式是什么1、有以下几种基本格式:标号,又称为指令linux命令是什么语言?
linux命令是什么语言?,系统,环境,代码,传播,管理,语言,操作系统,源码,自由,部分,dos和linux的命令行里面用的是什么语言?1、DOS/Windows/Linuxlinux改语言命令行?
linux改语言命令行?,系统,环境,工具,密码,概念,地方,软件,通信,管理,国际,linux命令行下怎样改变语言将内容改为:LANG=zh_CN.UTF-8LANGUAGE=zh_linux命令行c语言?
linux命令行c语言?,代码,系统,工具,环境,工作,保险,发行,命令,文件,终端,linux终端下如何进行C语言编译1、在Linux下面,如果要编译一个C语言源c语言在linux命令?
c语言在linux命令?,系统,工作,管理,命令,保险,基础,环境,信息,文件,语言,linux系统的命令是什么linux常用命令有pwd命令、cd命令、ls命令、catlinux编写c语言命令?
linux编写c语言命令?,系统,基础,环境,代码,盘面,保险,百度,情况,数据,工具,在Linux系统中,如何运行一个C语言程序?编译。由.c文件生成.o文件,写