Enterprise Architect 15 使用指南 II

Enterprise Architect 15 使用指南 II

昨天折腾了半天好不容易才把EA的代码框架生成过程跑通,就没心思继续折腾了,今天打开VSCode发现有一些细节还是有待继续折腾。

首先我们看到Carrier基类里:

Enterprise Architect 15 使用指南 II

出现了一个奇怪的1=TakeoffMode(),这无疑是因为我们类图里那个组合关系设置的1对1惹的祸,看来是不能那样设置的,与此同时,takeoffMode=null也存在问题,在Python中null是应该写作None,而且也不能这样定义对象属性。

首先我们在类图中的组合关系上删除错误的1对1表示:

Enterprise Architect 15 使用指南 II

然后在基类Carrier的属性中设置为抽象类:

Enterprise Architect 15 使用指南 II

我们现在还有类不能正确创建对象属性和构造函数的问题,这需要我们修改默认的代码生成模板。

关于代码生成模板的介绍,可以看这里,这个火龙果好像是一个专业的EA培训机构,缺点是要钱。

点击develop>Options>Edit Code Template:

Enterprise Architect 15 使用指南 II

第一个模板file用于在自动生成的代码前添加注释,我们可以按自己的需求修改:

Enterprise Architect 15 使用指南 II

不用担心修改后找不到原始模板内容,右下角有Get Default Temp...

  • 关于CTF(Code Template Framework)的官方介绍可以看这里
  • 需要注意的是每修改完一个模板,要ctrl+S保存才能生效。
  • 模板修改页面最下边的一条是会被windows任务栏遮住的,只有隐藏任务栏才能看到,不过这一条的按钮可有可无,用处不是很大,类似的小毛病EA比比皆是,大概专用软件都是这个样子吧,不鸟用户还能卖的死贵。

接下来我们要修改类,以符合Python的类定义:

Enterprise Architect 15 使用指南 II

这里主要是添加了一个构造函数,在构造函数内定义属性。

代码我贴出来吧:

    def __init__(self):
$attr=%list="Attribute" @separator="\n" @indent="        "%
%if $attr == ""%
        pass\n
%endIf%
$ops=%list="Operation" @separator="\n\n" @indent="    "%
$iclasses=%list="InnerClass" @separator="\n\n" @indent="    "%
%if $iclasses != ""%
$iclasses\n
%endIf%
$attr
$ops
%if $attr == "" and $ops == "" and $iclasses == ""%
    pass
%endIf%

类似的,还要修改属性声明:

Enterprise Architect 15 使用指南 II

这个简单,只是原本模板只考虑了private,没有考虑protected,照葫芦画瓢即可。

最后还要修改方法声明:

Enterprise Architect 15 使用指南 II

这里主要是在方法参数最前面加入self,真心觉得EA对Python的支持就是个半成品,还好模板支持自定义。

修改后的模板如下:

$dec=%REPLACE(opTag:"decorators","@","\n@")%
%TRIM($dec)%
%PI=" "%
$params = %list="Parameter" @separator=", "%
def
%PI=""%
%if opScope == "Private"%
__
%else if opScope == "Protected"%
_
%endIf%
%opName%
%if $params == ""%
(self):
%else%
(self, $params):
%endIf%

最后还发现只要有组合关系存在,EA在生成代码时候会给属性添加上一个m_takeoffMode=TakeoffMode(),这显然是不合适的,直接删除组合关系:

Enterprise Architect 15 使用指南 II

然后按前文中的步骤生成代码。

Enterprise Architect 15 使用指南 II

完美。

  • 还有个小瑕疵,构造函数内有属性赋值的时候,最后不会换行,不过应该无伤大雅。
  • 生成代码中的模块引用使用的是绝对路径,不知道能否改为相对路径,这里我不打算继续折腾了,如果有知道怎么改的可以留言告诉我一下,不胜感激。

最后附上我的EA工程文件,想试一下用EA生成代码的可以用来做测试:

百度盘:

链接:https://pan.baidu.com/s/1IJZK3lZk5aKNt3uZCtZ4qg
提取码:0hao
复制这段内容后打开百度网盘手机App,操作更方便哦

上一篇:Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁


下一篇:面试准备每日五题:C++——变量定义&声明、#ifdef & #else、结构体赋值、sizeof & strlen、C和C++的static