如何以c ++模块化构建应用程序

时间:2010-11-05 03:15:56

标签: c++ workflow modular

这是一个关于如何构建c ++应用程序而不是c ++本身的问题

我正在构建一个被设想为图形应用程序的应用程序,但实现的细节需要大量的抽象功能来促进界面,例如从文件,Web资源等中读取对象列表。已经想出如何实现这个功能没有太大的困难,但我没有很好的方法来测试它。具体来说,我已经开始实现图形环境,但尚未准备好使用较低级别的功能。

我还建立了很多我希望下层要做的事情,但它尚未经过测试。所有这些代码都驻留在一个文件夹中,并存储在具有常规提交的版本控制系统中。

我在编写C ++中的任何功能方面相对较新,到目前为止只在类项目上工作过,但我在PHP中编写了大量各种类型的程序。

如果这是一个PHP项目,那么测试任何功能似乎都很简单:

  1. 我只是从交互式实施开始
  2. 将其编成一个小文件
  3. 编写一些使用该功能的代码
  4. 将其构建为函数
  5. 将该函数导入我更大的代码体中。
  6. 对于使用C ++来说,这似乎是一种非常尴尬的方式。我是否已经倒退了,你如何在编译的程序中解决小的孤立问题并将它们导入到你的项目中;是否有一个有用的工作流程。

3 个答案:

答案 0 :(得分:2)

一般来说,您的问题的答案是使用类和单元测试。在互联网上搜索敏捷/极限编程。

这个想法是这样的:

  1. 做所有敏捷故事(我会让你自己阅读)
  2. 您将设计分为几类
  3. 编写定义班级“规范”的单元测试
  4. 写空占位符函数。
  5. 请参阅单元测试失败。
  6. 编写代码,直到单元测试成功。
  7. 返回第3步,重复其余课程。
  8. 如果以这种方式编写代码,则可以创建可重用且健壮的代码。

    老实说,我个人并不相信真正的TDD(测试驱动开发) - 我觉得在编写代码之后编写单元测试会更好(我觉得即将到来的用户尖叫的火焰来自用户)敏捷或死!“)。

    编辑:如果你的问题更多的是多个类的实际构建的谎言,那很容易。一般来说,每个类都应该封装在2个文件中(源代码和头文件)。只需在新项目中包含这些文件(以及您要使用的所有其他类中的文件)。 #include“xxx.h”在需要使用类的适当位置,编写使用这些类的代码,然后构建。就是这样。

答案 1 :(得分:1)

我想这可能是任何OO项目的一般策略。

首先确定主要组件,并确保您对所有事情的责任有充分的了解。

写出每个组件的界面,并检查(逻辑上)以确定它适合您的问题。

实施每个模块。

就测试而言,制作测试器模块(存根):例如,创建一个类,该类将向GUI发送输入,模仿将由实际组件发送的输入。由于您对界面有清晰的认识,因此如何生成此结果将无关紧要。

对系统中的每个组件重复此过程,然后将它们放在一起。

希望有所帮助

答案 2 :(得分:0)

我目前处于类似的情况,我已经实现了一些功能(通过某些API的文件I / O,工作的主要部分等)。所以也许我的一些经历会有所帮助:

  • 如果您已经拥有一些代码,那么绘制一张您所拥有的图表可能会有所帮助。笔和纸,甚至更好的UML可以在这里提供帮助(顺便说一句,一个可以导入现有类的优秀UML工具是Umbrello)。有时我会在最后一次提交后进行这种“设计检查”,这有助于我发现一些微妙的问题,特别是在设计阶段,我每天都在重构课程;
  • 如果您已经为组件编写了代码,我认为您可以轻松地为每个组件制定一些要求,并从中可以创建一些测试(例如使用'UnitCPPLite')。目前,我在主文件中进行了测试,其中一些样板代码在应用程序中完成任何其他操作之前触发测试执行(尽管这仍然不是最佳的);
  • 最后,我会在ComtriS的建议中添加“包含警卫”的想法(如果你还没有使用它们),以防止多次包含头文件。所以,在实践中,我通常最终得到类似的东西:

的src / CFoo.h:

// class 'CFoo': header file
#ifndef CFOO_H
#define CFOO_H

#include <only_what_you_need_in_declaration_interface>

class CFoo {
    private:
        // class data
    public:
        // constructors, destructors, getters, setters, etc.
        void doWork();
    };
#endif /* CFOO_H */

的src / CFoo.cpp:

// class 'CFoo': implementation file
#include "CFoo.h"
#include <what_you_need_in_addition_for_internal_workings_of_methods>

// code for other methods...

void CFoo::doWork() {
    // work
}

希望它有所帮助。