在做软件开发的过程中,uml图是必备不可的。我们在设计自己的软件uml建模时,对自己要开发的模块、构件、体系结构都有一个基本的想法,可以比较容易地绘制出uml图。但是最近在对别人的开源项目做项目分析的时候,涉及到uml的绘制让我傻眼了,因为对于别人的项目,我们只能通过一行行读代码来了解其架构,要想绘制一个较高质量的uml图难度非常大,当时就在想要是能有自动绘制uml图的工具就好了,没想到还真有,这就是今天要介绍的主角——enterprise architect。
1.概念
enterprise architect大多数用户简称ea ,是一个强大的辅助建模工具,广泛用于软件工程、业务过程管理、系统工程和其他需要复杂系统设计和分析的领域。它提供了一个综合的环境,支持从需求管理到系统设计的各种模型创建和文档编制。ea不同于普通的uml画图工具,(如visio),它将支撑系统开发的全过程。在需求分析阶段,系统分析与设计阶段,系统开发及部署等方面有着强大的支持,同时加上对10种编程语言的正反向工程,项目管理,文档生成,数据建模等方面。可以让系统开发中各个角色都获得最好的开发效率。
2.下载安装
链接:https://pan.baidu.com/s/1xq2q-_cst_dti3zidvxkfw 提取码:wq83
软件图标如下:

3.绘制uml(构建类图为例)
安装好之后,我们进行一个尝试学习使用,看看效果如何。
(1)打开ea,点击左上角的图标新建项目。

(2)起一个项目名称,这里以test2为例

(3)在工程下新建一个包,点击browser下的文件夹图标:

起一个名字后点击ok,然后会出现一个窗口。现在我们的包建好了,需要在包里添加视图,我们的类图和活动图等都是创建在视图上的。点击包右边的小图标添加视图:

(4)选择视图类型
由于我这里构建类图,就以类图为例

选择好模型之后,就可以手动绘制uml图了,在上方有工具栏,可以进行拖拽构建。

以上的功能其实visio等工具也能实现,我们目的是解放双手,下面介绍下自动导入分析。
4.自动建模功能
我们的目的是能够使得工具代码就能分析出uml图,下面详细介绍下。
首先,我们还是和前面一样,新建一个model,如果我们想导入要分析的代码,按file -> code -> import source directary的顺序操作,如下图,结果发现到如不了,这是因为我们需要先确定要分析的模型。

我们鼠标右击model,点击add a moder.....

add操作之后便会发现中间出现了很多模板,包括顺序图,包图,部署图,用例图等等,此处我们选择类图,然后点击下方的create按钮即可。

此时,我已经创建好了类图模型,按时这个类图只是一个模板,我们需要导入自己的代码让软件分析。

还是按之前的步骤,file -> code -> import source directary,

执行之后会弹出选项框,可以选择要导入文件的路径,格式,编程语言等,此处我用python文件做测试。

我导入了“新建文件夹”,这个文件夹下面只有一个py文件,代码放在这里。可以先根据代码预测类之间关系,然后看看ea软件的效果如何。。。
# -*- coding: utf-8 -*-
"""
created on thu jun 13 10:45:46 2024
@author: m q
"""
class person:
def __init__(self, name, age):
self.name = name
self.age = age
def get_details(self):
return f"name: {self.name}, age: {self.age}"
class customer(person):
def __init__(self, name, age, customer_id):
super().__init__(name, age)
self.customer_id = customer_id
self.accounts = []
def add_account(self, account):
self.accounts.append(account)
def get_accounts(self):
return [account.get_account_info() for account in self.accounts]
class account:
def __init__(self, account_number, balance=0.0):
self.account_number = account_number
self.balance = balance
def deposit(self, amount):
self.balance += amount
def withdraw(self, amount):
if amount <= self.balance:
self.balance -= amount
else:
print("insufficient funds")
def get_account_info(self):
return f"account number: {self.account_number}, balance: {self.balance:.2f}"
class savingsaccount(account):
def __init__(self, account_number, balance=0.0, interest_rate=0.01):
super().__init__(account_number, balance)
self.interest_rate = interest_rate
def apply_interest(self):
self.balance += self.balance * self.interest_rate
class bank:
def __init__(self, name):
self.name = name
self.customers = []
def add_customer(self, customer):
self.customers.append(customer)
def get_customers(self):
return [customer.get_details() for customer in self.customers]
if __name__ == "__main__":
# create a bank
bank = bank("mybank")
# create a customer
customer1 = customer("john doe", 30, "c123")
# create accounts for the customer
savings_account = savingsaccount("sa001", 1000.0, 0.02)
checking_account = account("ca001", 500.0)
# add accounts to the customer
customer1.add_account(savings_account)
customer1.add_account(checking_account)
# add customer to the bank
bank.add_customer(customer1)
# apply interest to the savings account
savings_account.apply_interest()
# print customer details and their accounts
print("bank customers:")
for customer in bank.get_customers():
print(customer)
for account_info in customer1.get_accounts():
print(account_info)
下面就是这段代码对应的类图,很清晰的描述出来了。

我在演化课上测试了lesin/ob-reposyncer项目的src,其中一部分类图如下:

看起来还是有点恐怖的,如果要人手工绘制可能会有疏忽,工作量也非常大。但用ea就能很好的解决,我想这就是软件的作用以及它带给我们的便利之处,当然,我们对它的结果也是参考作用,取其精华,弃其糟粕!
我对ea的了解还很少,它的大部分功能还值得探索,我们要牢记那句话——工欲善其事,必先利其器!
发表评论