Ala*_*ing 10 c++ header include
我有一个大班Foo
1:
class Foo {
public:
void apples1();
void apples2();
void apples3();
void oranges1();
void oranges2();
void oranges3();
}
Run Code Online (Sandbox Code Playgroud)
拆分类不是一个选项2,但foo.cpp
文件已经变得相当大.是否存在任何重大的设计缺陷,无法保持类的定义foo.h
并将函数的实现拆分为foo_apples.cpp
和foo_oranges.cpp
.
这里的目标纯粹是可读性和组织,我自己和其他开发人员在包含这个类的系统上工作.
1 "大"意味着大约4000行,而不是机器生成的.
2为什么?那么,apples
和oranges
实际上的上图工作,但使用彼此相当广泛的算法类.它们可以分开,但由于工作的研究性质,我不断重新布线每种算法的工作方式,我发现对我来说(在早期阶段)与经典的OOP原则并不相符.
是否有任何重大设计缺陷,以保持类的定义foo.h中和分裂的功能的实现为foo_apples.cpp和foo_oranges.cpp.
选择nits:在foo.h中保留类的声明并将方法的定义分成foo_apples.cpp和foo_oranges.cpp 是否存在任何主要的设计缺陷.
1)苹果和橘子可以使用相同的私人程序.一个例子是在匿名命名空间中找到的实现.
在这种情况下,一个要求是确保您的静态数据不是多次定义的.如果内联函数不使用静态数据(尽管它们的定义可以多次导出),它们并不是真正的问题.
为了克服这些问题,您可能会倾向于利用类中的存储 - 这可能会通过增加本来隐藏的数据/类型来引入依赖关系.在任何一种情况下,它都会增加复杂性或迫使您以不同的方式编写程序.
2)它增加了静态初始化的复杂性.
3)它增加了编译时间
我在真正大的程序中使用的替代方案(对于许多开发人员来说很讨厌)是创建导出的本地标头的集合.这些标头仅对包/库可见.在您的示例中,可以通过创建以下标题来说明:( Foo.static.exported.hpp
如果需要)+ Foo.private.exported.hpp
(如果需要)+ Foo.apples.exported.hpp
+ Foo.oranges.exported.hpp
.
然后你会像这样写Foo.cpp:
#include "DEPENDENCIES.hpp"
#include "Foo.static.exported.hpp" /* if needed */
#include "Foo.private.exported.hpp" /* if needed */
#include "Foo.apples.exported.hpp"
#include "Foo.oranges.exported.hpp"
/* no definitions here */
Run Code Online (Sandbox Code Playgroud)
您可以根据需要轻松调整这些文件的分配方式.如果你使用c ++约定编写你的程序,那么巨大的TU很少会发生冲突.如果你像C程序员一样编写(许多全局变量,预处理程序滥用,低警告级别和自由声明),那么这种方法将暴露许多你可能不会纠正的问题.
归档时间: |
|
查看次数: |
6005 次 |
最近记录: |