什么是合成的正确代码

时间:2018-06-24 16:45:40

标签: c++ code-generation composition

我正在尝试寻找正确的解决方案以根据组成生成类代码。

Composition

通过上面的表示,并使用2个工具(MagicDraw和Enterprise Architect),为DateTimeOffset dateTime = DateTime.Now.ToFileTime(); var url= $"/PullAsync?since={datetime}&page={pageno}&count=10"; 文件生成了2种不同的代码:

MagicDraw:

Person.h

企业架构师:

class Person
{   
    int age;    
    string fname;   
    Head haveHead;  
    string lname;   
};

因此,在MagicDraw中,我有一个class Person { public: Person(); virtual ~Person(); Head *m_Head; private: int age; string fname; string lname; }; 的类成员,但是在Enterprise Architect代码中,我有一个指针?

我知道Head是Person对象的一部分,并且它的存在是由Person对象管理的。所以我猜MagicDraw生成的代码更合适。

我的问题是企业生成的代码是否正确?

如果两者都正确,哪一个是最好的?

2 个答案:

答案 0 :(得分:2)

我不认为一个比另一个更好。通常,除非您将两件事进行比较,否则实际上没有答案,除非其中两件事比另一件事极端逊色,但是这里有两点需要注意。

Enterprise Architect将m_head公开(我不希望每个人都可以利用我的头脑!)。除非您希望并需要将其公开(但是有比公开它更好的方法),否则这是不可取的。另外,它是一个指针,因此可以将一个头分配给多个人,但您可能需要它,如@coredump的注释中所建议,在运行时访问Head的子类。此版本还可以自行执行内存管理。您需要在构建期间动态分配,然后自己清理。但是,如果Head不能轻易移动,并且即使Head由于某种奇怪的原因而不能移动,移动该版本的成本也会降低。

Magic Draw的版本将所有内容都设为私有,因此无法接近某人的头部。一头只属于一个人。内存是自动管理的。如果Head不可移动,则移动会更昂贵,如果Head不可移动,则无法移动。

您应该选择最适合自己的需求。

答案 1 :(得分:1)

至少在语义上,我认为MagicDraw的版本更正确。关键是在这种情况下,关系1 <-> 1更加明确地声明,并且不能滥用。在另一种情况下,您可能会将多个Head与特定的Person相关联。