4

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

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

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

到目前为止,我只在类项目上工作过,我对用 C++ 编写任何功能性的东西还是比较陌生,但是我已经用 PHP 编写了很多不同类型的程序。

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

  1. 我会简单地从交互地实现它开始
  2. 将其编码成一个小文件
  3. 编写一些使用该功能的代码
  4. 将其构建为一个函数
  5. 将该函数导入我更大的代码体中。

这似乎是用 C++ 做同样事情的一种非常尴尬的方式。我是否把它全部倒退了,你如何在你的编译程序中解决小的孤立问题并将它们导入你的项目;是否有您认为有用的工作流程。

4

3 回答 3

2

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

这个想法是这样的:

  1. 做所有敏捷故事的东西(我会让你自己阅读)
  2. 你把你的设计分解成类
  3. 编写为您的类定义“规范”的单元测试
  4. 编写空占位符函数。
  5. 查看单元测试失败。
  6. 编写代码直到单元测试成功。
  7. 回到第 3 步并重复其他课程。

如果您以这种方式编写代码,您将创建可重用且健壮的代码。

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

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

于 2010-11-05T23:18:57.087 回答
1

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

首先确定主要组成部分,并确保您对所有内容的责任有非常透彻的了解。

写出每个组件的接口,并(逻辑上)检查它是否适合您的问题。

实现每个模块。

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

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

希望能帮助到你

于 2010-11-05T04:22:03.427 回答
0

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

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

源/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
}

希望能帮助到你。

于 2010-11-14T12:18:29.897 回答