表示MongoDB文档的最佳方式是什么?我把 .Product
作为Client
.
首先,我把它们作为聚合;如果Client
坏了,那Product
也坏了。我是使用那个模型,还是切换到嵌套。
嵌套图示例:
表示MongoDB文档的最佳方式是什么?我把 .Product
作为Client
.
首先,我把它们作为聚合;如果Client
坏了,那Product
也坏了。我是使用那个模型,还是切换到嵌套。
嵌套图示例:
从编程的角度来看(例如 Java):
参考:http ://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
嵌套类分为两类:静态和非静态。声明为静态的嵌套类简称为静态嵌套类。非静态嵌套类称为内部类。
class OuterClass {
...
static class StaticNestedClass {
...
}
class InnerClass {
...
}
InnerClass innerObject = new InnerClass();
}
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
从 UML 的角度来看:
类从命名空间泛化
Class--|>EncapsulatedClassifier--|>StructuredClassifier--|>Classifier--|>Namespace
命名空间有“member”和“ownedMember”。
/member : NamedElement [0..*]
/ownedMember : 命名元素 [0..*]
“member”代表“StaticNestedClass + InnerClass”;“ownedMember”仅代表“InnerClass”
一般建议:
怎么做图呢?
协会或组成
这真的取决于你的要求。
大多数人喜欢从“破坏”过程来描述“构图”;“整体”被摧毁,然后“部分”也被摧毁。
但是,从“构造”过程来描述总是有效的;在你“更新整体”的过程中,你“更新了部分”。使“构造”和“销毁”它们保持一致是一种很好的做法。
例如汽车和车轮;
如果有人写了疯狂的代码,哇..
class Car{
public:
Wheel* w1;
Wheel* w2;
Car(Wheel* w1_, Wheel* w2_)
{
w1 = w1_;
w2 = w2_;
}
~Car()
{
delete w1;
delete w2;
}
}
Wheel* l1 = new Wheel();
Wheel* l2 = new Wheel();
Car* myCar = new Car(l1, l2);
delete myCar;
l1->Operation1(); //Crash!
所以这不是一个真正的“组合”,因为构造和破坏是不一致的。如果从析构函数中去掉“delete w1;delete w2”,那么Car和Wheel的关系就是“ Association ”。
代码的组合版本将如下所示:
class Car{
public:
Wheel* w1;
Wheel* w2;
Car()
{
w1 = new Wheel();
w2 = new Wheel();
}
~Car()
{
delete w1;
delete w2;
}
}