2010-01-21 129 views
4

我目前正在尝试以更好的方式组织我的代码。如何更好地组织C++项目中的代码

要做到这一点我使用的命名空间,通过组件分组类别,每一个都具有定义的角色和一些接口(实际上是抽象类)。

我发现它很不错,特别是当我不得不重写整个组件时,我几乎没有影响到其他组件。 (我相信这将是一个困难的多了一堆混乱的类和方法)

但我不喜欢它100%。特别是我想在接口,组件的公共面和后面的实现之间做更好的分离。 我认为组件本身的'接口'应该更清晰,我的意思是新手应该很容易理解他必须实现的接口,他可以使用的接口以及实现的组成部分。

不久,我将开始一个涉及多达5个开发者的更大项目,我想在这一点上让我清楚。

那么你呢?你怎么做呢?你如何组织你的代码?

+0

只是悄悄地改变问题,从而使答案失效是不公平的;) – 2010-01-21 20:11:35

+0

对不起,我只是重新读它,并认为它不是那么好:) – 2010-01-21 20:14:03

回答

3

特别是我想要做的接口之间的部件的 公众形象 他们实现更好的 分离,并在后面。

我想你要找的是什么Facade模式:

的立面是提供了一个简化的接口,更大的代码体,如类库的对象。 - 维基百科

您可能也想看看MediatorBuilder模式,如果你在你的类的复杂的相互作用。

Pimpl成语(也称为编译器防火墙)对隐藏实现细节并减少构建时间也很有用。当我不需要多态时,我更喜欢在接口类+工厂中使用Pimpl。小心不要过度使用它。不要将Pimpl用于通常在堆栈中分配的轻量级类型(如3D点或复数)。将它用于更大,更长寿命的类,这些类依赖于您希望从用户隐藏的其他类/库。

在大型项目中,在简单的前向声明中不要在头文件中使用#include指令很重要。如果绝对必要,只要在头文件中放置一个#include指令(比较喜欢将#include放在实现文件中)。如果做得对,适当的#include规则将显着减少你的编译时间。 Pimpl成语可以帮助将#includes从头文件移动到相应的实现文件。

类/函数的连贯集合可以组合在它自己的名称空间中,并放在源代码树的子目录中(子目录应该与库名称空间具有相同的名称)。然后可以为该包创建一个静态库子项目/ makefile,并将其与主应用程序链接起来。这就是我认为UML术语中的一个“包”。在一个理想的包中,类彼此密切相关,但与包之外的类相关的松散关系。绘制包的依赖关系图有助于确保不存在循环依赖关系。

+0

关于#include指令,这是'有趣',在工作中我有遵循一个正好相反的代码约定......即使我习惯于做前向声明。 – 2010-01-22 09:29:23

+1

您可以告诉他们,即使Google鼓励进行前瞻性声明:http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Header_File_Dependencies#Header_File_Dependencies – 2010-01-22 15:14:07

4

有两种常用的方法:

如果,除了公共接口,只需要一些辅助功能,只是把它们在实现文件具名命名空间:

// header: 

class MyClass { 
// interface etc. 
}; 

// source file: 

namespace { 
    void someHelper() {} 
} 

// ... MyClass implementation 

如果您发现自己想隐藏的成员函数,可以考虑使用PIMPL方法:

class MyClassImpl; // forward declaration 

class MyClass { 
public: 
    // public interface 
private: 
    MyClassImpl* pimpl; 
}; 

MyClassImpl实现的功能,而MyClass将对公用接口的调用转发给私有实现。

1

您可能会在Large Scale C++ Software Design中找到一些有用的建议。它有点过时(发布于1996年),但仍然很有价值,它提供了结构化代码的指针,以最大限度地减少“单个头文件更改时重新编译世界”问题。

-6

首先声明你可以在一个字符串声明中使用它们的变量,像这样。

char Name[100],Name2[100],Name3[100]; 
using namespace std; 
int main(){ 

} 

如果您有一长串可以用于程序的代码,使其成为一项新功能。 likeso。

void Return(char Word[100]){ 
cout<<Word; 
cin.ignore();  
} 
int main(){ 
Return("Hello"); 
} 

我建议你放到一个头文件中的任何外部的函数和声明,并将其链接 likeso 开发-C++的#include“RESOURCE.H”