gpt4 book ai didi

c++ - 安排这门课的最佳方式是什么?

转载 作者:太空狗 更新时间:2023-10-29 21:25:37 25 4
gpt4 key购买 nike

关闭。这个问题是off-topic .它目前不接受答案。












想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。

9年前关闭。




Improve this question




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

我刚刚达到了我有五个紧密耦合的类的地步,我不确定是保持原样还是重构。

我所拥有的基本上是这样的:

  • 类(class)ShipTemplate :这个类(与 c++ 模板无关)具有所有常量成员,并包含有关船舶类别的基本信息。
  • 类(class)TemplateSet :这个类包含当前可以构建的所有 ShipTemplates,并且它有一个名称。它应该是独立的,因为它代表了每个玩家随时可用的技术,因此可以在不同时间保存/加载不同的套装。
  • 类(class)Ship :这个类代表一艘完整的船,带有装载、名称和其他东西。它包含对 ShipTemplate 的 const 引用,该类不允许更改,以引用其基本功能。它可以扩展 ShipTemplate,但我想跟踪哪些 Ships 具有特定的底层 ShipTemplate,这样做似乎更容易。
  • 类(class)Fleet :这个类包含一个船舶列表,它有一个名称并包含其他信息。它应该包含一个成本变量,等于其中所有船舶的成本总和。
  • 类(class)Deployment :此类包含指向玩家可用的所有船舶、舰队和模板集的指针。它还需要跟踪不再可用但仍被已构建的船舶使用的 ShipTemplates。它应该包含一个成本变量,它等于玩家可用的所有船舶的成本总和。它必须管理船舶从一个舰队到另一个舰队的转移。它必须找出给定舰队中的哪些船舶,或者哪些船舶具有给定的 ShipTemplate。

  • 不幸的是,每个类(class)都与其他类(class)交织在一起。我考虑了不同的方法,但我不确定其中一种是否正确。
  • 使用 friend到处都是语句,这样如果一个类修改了某些东西,它就可以正确地更新所有其他类。
  • 使用很长的名字,比如 Deployment::modifyShipThrustInFleet ,并允许仅通过 Deployment 类进行任何修改,这将处理一切。
  • 移除 TemplateSet 和 Fleet 并在 Deployment 中表示它们,以便它可以正确更新成本值/指针,而不会破坏任何“正确性”规则。这也意味着对系统的每一次修改都必须通过部署。
  • 将指向上层类的指针插入到下层类中,因此例如在更改 Ship 中的某些内容时,它可以自动更新其部署和舰队的成本。

  • 是否有其他一些我没有看到的解决方案,或者可能重构为更多的类来帮助我实现可读的、可维护的代码?

    最佳答案

    只是一些想法。

    当以面向对象的方式思考时,思考现实生活中的对象会展示你应该在程序中描述的 View 。什么是现实生活中的对象?它是一个“事物”,具有某些特征并公开某些功能。

    例如 ShipTemplate 是船舶的蓝图。它应该定义大小、布局、部分 类型 和数量(DieselEngine、SteamEngine、AntiAircraftGun、UnderwaterMines 等),以及它们如何相互关联。

    另一艘船是根据蓝图 build 的 - 它应该具有所有部件 实例 .例如,它可能有两个 DieselEngines 和三个 AntiAircraftGuns。没错,那艘船不是从蓝图继承的。蓝图只是船的描述,而不是它的父级。

    现在,每种类型的对象(蓝图、零件、船)都有自己的属性和功能。例如,每个发动机都会消耗一定量的燃料,并且可以将船的速度提高到某个值。为什么没有具有这些功能的 Engine 的基类? (遗产)。枪支也是如此(我们称之为 ShipWeapon)。水雷枪和高射炮当然有很大的区别,但它们都是枪,它们都可以安装在船上,它们都有重量,弹药类型,装填时间,弹药容量,炮是否在工作。

    所以这些是对象的一些属性。功能呢? OO 设计的另一个重要概念是每个对象都有(封装)一些可以用它完成的功能(它可能会也可能不会改变对象状态)。例如 ShipWeapon 应该有方法 Fire(),它可能应该规定其中的弹药量。或者尝试首先使用 Aim(sometarget) 进行瞄准。另一方面,引擎将具有 Start()、Stop()、SetSpeed(speed)。请注意,这些将在对象及其状态内部工作。 Ship 可能有 SetCourse(direction, speed),它将以所需的功率启动发动机并调整方向 Helm 。船舶也可能有 Colide(ship)。还有 Hit(typeofattackinggun),它会遍历船的所有部分并随机损坏一些(并为枪设置 IsOperating,或关闭其中一个引擎等)

    如您所见,您可以在设计面向对象方法时深入了解很多细节。知道何时停止也很好 - 程序运行真正需要多少细节(或准确性)。

    此外,可能会有一个全局性的世界,可以容纳所有船只。等等..

    还有程序的其他部分,即基础设施。您如何管理数据对象(飞船、世界、玩家),它们如何相互了解和交互。例如,每艘船都可以作为一个对象被全局 map 观察,每艘船都会通知它运动(观察者模式)。或者全局世界会根据全局时钟在某个时间间隔查询每艘船的状态。或者...

    我想我想说的是坚持主要的面向对象原则——封装、继承、多态。并且有很多关于面向对象设计、设计模式等的文献,这很有用。 Wiki entry有点“学术”,但有主要定义,让你思考:) 另请查看 SOLID

    附注。在一个类中完成所有事情通常是糟糕设计的标志。

    关于c++ - 安排这门课的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13689684/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com