gpt4 book ai didi

c++ - 提高可读性和可维护性 : omit < > for many variable declaration possible?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:25 24 4
gpt4 key购买 nike

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












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

5年前关闭。




Improve this question




这个问题看起来很抽象。我将通过一个例子来提问。
介绍
假设我有多种类型的游戏对象。
他们是子弹,火箭,敌人,区域,......
它们都由池很好地创建、删除和管理,例如

Pool<Bullet> poolBullet ; 
Pool<Rocket> poolRocket ;
游戏逻辑将以 Pool_Handle 的形式管理对象,例如
Pool_Handle< Bullet >  bullet = poolBullet.create() ;
Pool_Handle< Rocket> rocket = poolRocket .create() ;
问题
现在,我看看重构。
例如,如果我的旧代码是...
Bullet* functionA(Rocket* rocket){
for(int n=0;n<rocket->zones.size();n++){
Zone* zone = rocket->zones.get(n);
Bullet* return_value =zone.functionB();
}
}
……它会变成……
Pool_Handle<Bullet> functionA(Pool_Handle<Rocket> rocket){
for(int n=0;n<rocket->zones.size();n++){
Pool_Handle<Zone> zone = rocket->zones.get(n);
Pool_Handle<Bullet> return_value =zone.functionB();
}
}
请注意,他们现在是 池句柄 到处。
几天的阅读和编辑这千行代码,我已经习惯了 池句柄 甚至超过任何游戏对象。这可能是我现在打字最快的一个词。

如何保持与旧代码同等水平的可读性和可维护性,如果可能,如何减少变量模板的输入时间?
我不期望一个完美的答案,因为我找到的每个解决方案都有一些权衡。
我可怜的解决方案
/**  remedy 1 **/
template <class TT> using H = Pool_Handle<TT>; //remedy line
H<Bullet> bullet ; //alleviate symptom, better but not perfect

/** remedy 2 **/
using H_Bullet = Pool_Handle<H_Bullet>; //remedy line
H_Bullet bullet ; //looks good, but have limitations

/** remedy 3 **/
auto bullet; //concise, but can't be used everywhere, sometimes also reduce readability
第二种解决方案似乎不错,但引入了一些限制。
  • 我必须为 Bullet、Rocket、... 等等一一声明一行
  • 如果有新类型的游戏对象,我将不得不手动添加另一行。
  • 如果游戏对象被重命名,例如子弹 - > MetalBullet,
    我还必须手动将补救线更改为 H_MetalBullet。
  • 因此,它降低了整体的可维护性。

  • 有没有更好的办法?
    (编辑)您可以假设 c++11、c++14 等。
    (编辑)独立于平台的解决方案是有利的。
    编辑 1(进一步澄清为什么第二个解决方案不完美)
    在第二个解决方案中,我必须在声明一个新类后添加“另一个”行。
    线路是...
    using H_Bullet  = Pool_Handle<H_Bullet>; 
    我应该把它放在哪里?
  • 在 Bullet.h 内;
    它会造成不好的耦合,因为 Bullet 根本不应该知道 Handle。
  • 在每个游戏逻辑文件中包含的一些高级头文件中;
    结果是有 2 个不同的地方对 Bullet 有一些定义。
    更多的地方 -> 更少的可维护性。

  • 这两个地方都会产生一定的小劣势:
    当我调用一些自动重构时,我必须在两个 上调用两次子弹 H_Bullet .

    最佳答案

    选项1

    使用 auto说明符:

    auto object = pool.create();

    完整示例:
    template <typename T>
    class Pool {
    public:
    class Handle {};

    Handle create () const {
    return Handle();
    }
    };

    class Object {};

    int main () {
    Pool<Object> pool;
    auto object = pool.create();
    }

    View Successful Compilation Result

    选项 2

    使用 typedef (对于那些无法访问 功能的人):
    Object::Handle object = pool.create();

    完整示例:
    template <typename T>
    class Pool {
    public:
    class Handle {};

    Handle create () const {
    return Handle();
    }
    };

    class Object {
    public:
    typedef Pool<Object>::Handle Handle;
    };

    int main () {
    Pool<Object> pool;
    Object::Handle object = pool.create();
    }

    View Successful Compilation Result

    关于c++ - 提高可读性和可维护性 : omit < > for many variable declaration possible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37642852/

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