Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 安排这些课程的最佳方式是什么?_C++_Oop_Class_Refactoring - Fatal编程技术网

C++ 安排这些课程的最佳方式是什么?

C++ 安排这些课程的最佳方式是什么?,c++,oop,class,refactoring,C++,Oop,Class,Refactoring,我正在做一个简单的项目来管理桌面游戏的数据,但我主要是用它来获得正确编码的经验 我刚刚到达一个临界点,我有五个紧密耦合的类,我不确定是保持原样,还是重构 我基本上是这样的: 类>代码> StaseStuts< /C>:该类(与C++模板无关)具有所有成员,包含关于一类船舶的基本信息。 classTemplateSet:此类包含当前可用于生成的所有ShipTemplates,并且具有名称。它应该是独立的,因为它代表了每个玩家在任何时候都可以使用的技术,所以可以在不同的时间保存/加载不同的集合 类

我正在做一个简单的项目来管理桌面游戏的数据,但我主要是用它来获得正确编码的经验

我刚刚到达一个临界点,我有五个紧密耦合的类,我不确定是保持原样,还是重构

我基本上是这样的:

  • 类>代码> StaseStuts< /C>:该类(与C++模板无关)具有所有成员,包含关于一类船舶的基本信息。
  • class
    TemplateSet
    :此类包含当前可用于生成的所有ShipTemplates,并且具有名称。它应该是独立的,因为它代表了每个玩家在任何时候都可以使用的技术,所以可以在不同的时间保存/加载不同的集合
  • 船舶
    :该类代表一艘完整的船舶,包括装船、名称和其他内容。它包含对ShipTemplate的常量引用,该类不允许更改该引用,以引用其基本功能。它可以扩展ShipTemplate,但我想跟踪哪些船舶具有特定的底层ShipTemplate,这样做似乎更容易
  • class
    Fleet
    :该类包含一个船舶列表,它有一个名称并包含其他信息。它应该包含一个成本变量,该变量等于其中所有船舶的成本之和
  • class
    Deployment
    :该类包含指向玩家可用的所有船只、舰队和模板集的指针。它还需要跟踪不再可用但仍由已建造的船舶使用的船舶模板。它应该包含一个成本变量,等于玩家可以使用的所有船只的成本之和。它必须管理船只从一个舰队到另一个舰队的转移。它必须找出哪些船舶在给定的船队内,或者哪些船舶具有给定的船型
不幸的是,每一门课都和其他的课交织在一起。我考虑过不同的方法,但我不确定其中是否有一种是正确的

  • 到处使用
    friend
    语句,这样,如果一个类修改了某些内容,它就可以正确地更新所有其他类
  • 使用很长的名称,比如
    Deployment::modifyshipstrushtinfeet
    ,并允许仅通过Deployment类进行任何修改,这将解决所有问题
  • 删除模板集和震源组,并在部署中表示它们,以便它可以在不违反任何“正确性”规则的情况下正确更新成本值/指针。这也意味着对系统的每一次修改都必须经过部署
  • 在低级类中插入指向高级类的指针,这样,例如,当更改船上的某些内容时,它可以自动更新其部署和舰队的成本

有没有其他我没有看到的解决方案,或者可以重构成更多的类来帮助我实现可读、可维护的代码?

既然您已经描述了如何表示各种数据,在定义完整关系之前,请尝试通过定义“协议”来完成描述:

每个班级能对其他班级做些什么?实现目标需要哪些方法和方法之间的规则

一旦您定义了类如何相互作用,您将很可能发现什么是私有的,什么是公共的,以及双方之间必须存在何种程度的友谊

可能不是您的情况,但是-通常-当存在复杂关系时,一种可能的模式可以是使用“通信总线类”,它公开可以“发送”到各种对象的操作,每个对象都有一个私有接口,并且是。。。公共汽车本身(仅限于公共汽车)

编辑

以下是Svalorzen的评论:

这取决于你看它的那一面。 事实上,这将引入多个级别的“隐私”,允许在类本身所在的更广泛单元上实现封装。这是好是坏是上下文的问题,而不是习语

你有一个“胶囊”,它是一个“俱乐部”(“俱乐部中的俱乐部,以“巴士”为朋友”),一个“俱乐部经理”是真正的“面向公众的过滤器”(因此也是真正的OOP对象),允许某些需要同时与更多类和私有部分交互的方法只在俱乐部内部进行交互

“友谊”的否定仅仅是一种误解,它把技术和工具混淆,使OOP对象与C++类相同。一般来说,这是一个时髦的成语。C++类可以是比OOP对象更小的单位(想想piml习惯用法:什么是对象?)。 一个类可以是另一个类的朋友这一事实并不意味着它是任何人的朋友,因此私有部分不会公开。您只是定义了另一个隐私级别,其中封装应用与“private”相同。它只适用于更广泛的群体。就OOP而言,“更广泛的群体”扮演着与非好友类相同的角色

“朋友破坏封装”的误解与OOP的概念无关。它与OOP在java中实现的方式有关,这是C++语言完全不同的语言。在C++中,FuffSIP只是一个“组thimg”的结构,就像类、结构、模板、继承、成员资格等。

<> >什么OOP关系(构图、继承、链接…)必须映射到C++的构造,不像java语言语言定义为单向的,它不是由语言本身和它的标准库定义的。

映射“OOP对象=C++类”只是一个常见的文化错误概念,它继承了过去,当C++没有模板时,