代码之家  ›  专栏  ›  技术社区  ›  andreas buykx

重构id类型

  •  1
  • andreas buykx  · 技术社区  · 14 年前

    我的应用程序使用 int 作为标识内存和永久注册表中对象的ID。应用程序中的函数接收id作为参数,从注册表中检索对象并执行其工作,例如。

    void print( int id, int bar, double zip, int boo )
    {
        Object *obj = get_obj_by_id( id );
        obj->print( bar, zip, boo );
    }
    

    应用程序已经发展,现在可以在同一个应用程序中有多个注册表。该应用程序现在使用一个全局可访问的“当前”注册表,正如globals所做的那样,这会带来很多麻烦。

    为了摆脱全局“当前”注册表的概念,我需要引入一个类型,该类型在注册表中唯一地标识对象。我不能改变 int 它正在被使用,所以我必须创建一个 full_id 从中键入 int 以及注册表的标识。 因此,示例函数必须更改为

    void print( full_id id, int bar, double zip, int boo )
    {
        Object *obj = get_obj_by_id( id );
        obj->print( bar, zip, boo );
    }
    

    关于id参数的命名有一些约定,但是在整个应用程序中并没有严格遵循这些约定,所以我不能假设id参数的名称,或者它总是第一个参数。还有许多功能需要更改。什么是最有效和可靠的方法来取代 int 按类型输入的ID 丰满的 类型ID?

    4 回复  |  直到 14 年前
        1
  •  4
  •   caf    14 年前

    可能你的新类型不是数字的-它有点小 struct ?

    typedef struct _full_id {
        int registry_id;
        int object_id;
    } full_id;
    

    如果是这样,那么您可以从更改处理id的低级函数开始,比如 get_obj_by_id() 在你的例子中起作用。在你把那个函数改成 full_id 参数而不是 int ,重新编译完整的程序。调用此函数的所有调用站点现在都应报告由于类型不匹配而导致的错误-然后可以转到这些调用站点并修复 他们的 参数类型。

    冲洗,重复,最后你会把它们都修好的。

    祝你好运(我打赌你希望你用 typedef 从现在开始?;)

        2
  •  1
  •   Jan    14 年前

    最可靠的方法是:确保不能隐式地将int转换为full_id,然后将参数改为get_obj_by_id为full_id,并让编译器计算出需要更改的地方。

    它相当低效,但非常可靠(除了人为错误)。

        3
  •  0
  •   Patrick    14 年前

    我会开始寻找所有的调用来获取按ID获取的对象,并将其参数从int改为full。 然后编译,看看哪些没有编译,然后迭代地重复这个过程,直到找到所有的地方。慢一点,但会有用的。

        4
  •  0
  •   Dmitry Yudakov    14 年前

    如果您可以控制id分配,那么可以为某些注册表分配一定范围的id,并在get_obj_by_id()中决定要寻址哪个注册表。

    例子:

    Object* get_obj_by_id(int id)
    {
        if( id % 2 )
            return registry1[id];
        else
            return registry2[id];
    }