代码之家  ›  专栏  ›  技术社区  ›  Lucas

在循环中创建不同的实例

c++
  •  2
  • Lucas  · 技术社区  · 15 年前

    我将为特定的文件格式(格式本身并不重要)编写一个验证器。有一大组文档指定了格式的每个部分需要的外观,不同部分之间的关系等等。很多很多必须的,应该的,应该的,可能的等等。

    标准中指定的规则,如果传递失败,则向标准输出输出一条错误消息。每个过程都是一个单独的类,实现一个公共接口,每个过程的一个实例将在堆栈上创建,在文档上运行,并收集结果(包含错误ID、消息、行/列号等)。然后,结果将被循环并打印出来。然后就可以轻松地为每个过程创建一个单元测试。

    现在,我希望最终 一旦

    你知道我要说什么吗?如何创建所有这些不同的实例而不使用500行函数逐行创建每个实例?我想要一个线圈。我还希望新的pass类在创建时以某种方式被“发现”,这样就不必手动添加实例化这些新类的行。

    现在想想,这一切似乎让我想起了单元测试框架。。。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Alex B    15 年前

    C++是一种缺乏反射的静态语言,因此你将 要以这种或那种方式枚举类,可以是类名到工厂函数的映射、创建所有类的显式函数,或cppunit样式的“注册”(与将它们放入静态映射中相同)。

    用最简单最容易改变的方法去做

    你是说你最终会有成百上千个,不是现在。 By the time you have hundreds of them, your design will have changed completely

    如果这样简单的代码不再适合这个任务,那么它也更容易被丢弃,因为你只会在一个复杂的设计中投入资金,并给它添加一些乱七八糟的东西,而不是扔掉

    当您的代码库成熟时,您将确切地知道您需要什么样的安排,但是现在, 尽可能做最简单的事情 .


    附言

    some_ptr<Foo> foo = new Foo() 麻烦你了,宏没那么脏:)

    #define NEW_V(cls, ...) do {\
        std::tr1::shared_ptr<Validator> v(new cls(__VA_ARGS__));\
        lst.push_back(v);\
    } while(0)
    ...
    std::list< std::tr1::shared_ptr<Validator> >
    CreateValidators() {
        std::list< std::tr1::shared_ptr<Validator> > lst;
        CREATE_V(Foo);
        CREATE_V(Bar);
        CREATE_V(Baz, "baz");
        return lst;
    }
    
        2
  •  1
  •   Community CDub    8 年前

    对于有这么多类的东西,我会使用一个注册表,它允许您实例化所有注册的类。我写道 some sample code 它显示了工厂函数和注册模式(您需要添加对注册函数进行迭代的功能)。

    注册模式的唯一问题是编译器有时会 智能并删除它认为未使用的代码。解决方法各不相同。

        3
  •  0
  •   jdehaan    15 年前

    我将管理一个可能的解析器类列表(例如按名称),并使用 factory pattern 创建具体的实现。解析器类应有一个公共接口,使您能够使用相同的代码来传递信息和处理数据。

    不用一个接一个地传递,你也可以分块地传递:从输入中读取几行,然后把它交给所有的解析器。

        4
  •  0
  •   AndersK    15 年前

    我觉得这听起来像是一个解析器的工作。 ANTLR