2011-04-14 76 views
0

我在这里有两个困境:我有几个类,让我们说A,B,C和D. A有一个公共接口,和B有一个关系(就像A有一个类型为B的成员变量),并且A的方法之一是返回这个B对象,B只是一个暴露某些方法的类,C是另一个暴露其他方法的类,而D是一个单例对象。 D的公共接口具有对C类对象的引用(指针,如果你更喜欢的话)。C++的一些设计问题

所以,当我想在这一步绘制关系图时,我会在A和B和C之间有一个关系会放在图上,与其他两个没有明显的关系。所以,这是基于头文件(.h),其中包含类A,B,C的声明。我现在对D有点困惑。

在另一端:

  1. A和B两者的实现(在cpp文件)严重依赖于从C类创建的对象(无,C是不是标准,如表,字符串,队列,但在我的应用程序中另一个有意义的类)。
  2. A和B的实现都使用D单例与本地C对象。

这里是我的问题:

  1. 我应该把A,B,C和d之间的类图上什么关系,还不算我已经确定了一个(A HAS-A B) ?我对单身D与C类的关系特别感兴趣。
  2. 什么是这种情况下普遍接受的方法(当接口没有对象之间的关系时,因为没有关系,但是在实现中它们是大量使用)?
  3. 如果我按照Java而不是C++有相同的问题会有区别(因为在java中与类有关的所有东西都在一个文件中,所以很容易看出类方法实际使用的是什么,而在C++中你通常只看到头文件)。

非常感谢您的指导。

+1

为什么单身? – 2011-04-14 13:03:27

+0

如果你还没有在头两段中描述你所描述的内容。然后当你有这个问题时,将它添加到你的问题中,这将有助于我们理解这些关系,即使该图不完整。重要的是要先画出你所知道的。 – nathan 2011-04-14 13:05:15

+2

由于尝试将单例装入其他易于管理的设计而引起混淆。无所事事,万事俱备,他们在一张关系图上跺脚,把它缩小成意大利面条。大约99%的时间应该避免使用全局对象;当你确实需要一个,几乎肯定不应该是一个单身人士,除非你有一些非常离奇的要求。 – 2011-04-14 13:10:41

回答

1

您提供的大部分信息应在下列 图(plantuml输入)中可识别。我希望能回答第一个问题。

@startuml 
class A 
A o--> B 
A : + method() 
A : + B& getB() 
A : - B m_B 
A --> "getC" D 

class B 
B : + method() 
B --> "getC" D 

class C 
C : + method() 

class D <<Singleton>> 
D --> "0..n" C 
D : + C* getC(int index) 
D : - list<C> m_containerOfC 

@enduml 

关于第二个问题:我想画UML图(我想为设计)主要是关于抽象的,因此忽略了细节的地步。在编写完程序后,试图在UML中表达一个完整的C++程序是毫无意义的。你可以购买(尝试)为你做的程序,但是我不认为这些图表是有用的。

第三个问题的答案是,在设计阶段,Java和C++实现的UML应该是相等的,或者至少是相当大的比例。设计是关于选择和连接设计模式等,这些都是独立于语言的。当你开始详细描述你的图表来表示更多的实现细节时(例如使用的容器类型等),那么所选择的实现语言就会发挥作用。然而,在那个阶段,你应该问自己,你的图表是否能够让你对设计有足够的信心,然后开始对它进行编码。

1

您应该确切阅读本书Large-Scale C++ Software Design

它特别是接口和实现之间的依赖关系的模型交易,推出了两款新型关系使用,在最接口使用,在最实施,而不只是传统的“人─一个”。

随后,它进入上与施加到这种建模(如隔离绝缘封装等)的设计原则。不过,它确实是一本技术性很强的书。所以要做好准备!