gpt4 book ai didi

c++ - GET GET GET GET GET DO - 过度设计?效率与一致性

转载 作者:行者123 更新时间:2023-11-30 02:42:00 26 4
gpt4 key购买 nike

我知道使用 GET 和 SET 函数的公共(public)变量的缺点/私有(private)变量的优点,但目前我正在使用 Ogre3D 开发自己的第一个“真实”游戏(C++)..同时,我有时需要 6-7 getFunctions() 来访问我需要对其执行单个操作的数据。所以,我想知道这是否不是矫枉过正/过度设计,以及何时将新的直接指针存储到其他类/函数中的某些对象可能有用。但这听起来不像良好的一致性、良好的编程风格和/或可读性。 (我来自德国,实际上并不知道“一致性”这个词是否合适,如果不合适请纠正我。我指的是代码结构的同质性,例如整个代码遵循严格的编程风格)

那么,一个GetFunction(返回指向对象的指针)需要多少时间?拥有大约 5-7 个 Get 是否过度设计?

或者:对于|R getFunctions() 中的Y,|R 中的哪个X 调用ObjectPointer,是否建议创建对象指针的本地拷贝?

可能有人会说这是过度优化,但另一个方面是可读性 getFunctions()..

我的游戏中的一个示例,用于获取本地玩家在某个“基地”中拥有的 Swordsman 数量。

int numSwordsman =  GameManager::getSingletonPtr()->getMatchInstance()->getPlayerData()->getLocalPlayer()->getGameElementManager()->getBase(EWT_MAINBASE)->getSwordsmann();

更糟糕的是这样的

Ogre::Vector2 newVec2 = Ogre::Vector2(GameManager::getSingletonPtr()->getSceneManager()->getCameraNode()->getViewport()->getActualHeight() / GameManager::getSingletonPtr()->getMainGameLoop()->getMouse()->getState()->x.abs,GameManager::getSingletonPtr()->getSceneManager()->getCameraNode()->getViewport()->getActualWidth() GameManager::getSingletonPtr()->getMainGameLoop()->getMouse()->getState()->y.abs);

除了您需要大约 20 到 30 秒才能了解那里发生的事情这一事实之外,输入这些内容也是一种巨大的痛苦。

我个人更喜欢写这样的代码

Ogre::Vector2 newVec2 = Ogre::Vector2(GameManager::getSingletonPtr()->
getSceneManager()->getCameraNode()->getViewport()->getActualHeight()
/ GameManager::getSingletonPtr()->getMainGameLoop()->getMouse()->getState().X.abs,
GameManager::getSingletonPtr()->
getSceneManager()->getCameraNode()->getViewport()->getActualWidth()
/ GameManager::getSingletonPtr()->getMainGameLoop()->getMouse()->getState().Y.abs);

但对于不了解我的编码风格的人来说,它可能会像 **** 一样令人困惑,并且超出了所有人类已知的编程风格和实践。

你怎么看待这个话题?这整个 Get->Get->Get->Get->Get 过度设计了吗?还是必然的必要?你如何处理“遥远”的对象指针?不重要的主题或与性能密集型应用程序相关?关于代码设计的任何提示和技巧?还是 7-8'Get's 仍然是标准?

最佳答案

我会将您的代码示例重写为:

auto GM = GameManager::getSingletonPtr();
auto VP = GM->getSceneManager()->getCameraNode()->getViewport();
auto mouse = GM->getMainGameLoop()->getMouse()->getState();

Ogre::Vector2 newVec2 = Ogre::Vector2(
VP->getActualHeight() / mouse.X.abs,
VP->getActualWidth() / mouse.Y.abs);

只是为了可读性;在效率方面,我怀疑它会更糟,而且可能会更好。

(此外,由于不知道表面之下发生了什么,我宁愿一次获取鼠标状态:我不想在鼠标移动的任何一侧获取 X 和 Y!)

如果效率是一个问题,编译所有的优化,然后查看生成的汇编代码。比较代码重构前后的清晰度;也许它会是一样的。 (这里唯一要注意的是编译器技术一直在改进,所以现在的最佳实践可能在两年内就不是最佳实践。)

还有一个提示:阅读 Martin Fowler 的《重构》一书,以提高您的直觉,判断何时添加抽象层是好的,何时折叠抽象层是好的。是的,我知道它现在已经 15 岁了,但是恕我直言,这个建议非常有效……即使这些例子都是用 java 编写的;-)

关于c++ - GET GET GET GET GET DO - 过度设计?效率与一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27562922/

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