进500强公司当开发实习生,导师让做的第一件事竟然是画UML图,你会吗?
Posted 陈皮的JavaLib
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进500强公司当开发实习生,导师让做的第一件事竟然是画UML图,你会吗?相关的知识,希望对你有一定的参考价值。
前言
一个项目的开发前期,会有功能分析,建模和系统设计等步骤,虽然一般是由技术负责人或者架构师进行处理,但是作为一个合格,进阶的程序员来说,这些功夫是必须要掌握。这不仅是提高自己的技术实力,也是能与他人沟通顺畅的保证。
既然是系统功能的分析和设计,不然自己能看懂,也要能让团队其他人能看懂,输出正确规范的文档;其中有一个部分就是系统类图关系,是描述系统中所包含的类以及它们之间的互相关系,类图能简化团队成员对系统的理解,整体逻辑,是系统开发早期阶段必要的产物,不仅能帮助程序员开发编码,也是测试过程的重要模型依据。
对于面向对象设计
中,类图分析的工具用得最多的就是UML(Unified Modeling Language,统一建模语言)
。它是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言。
UML 画法
UML的模型主要有三部分构成:
- 事物:UML中最基本的构成元素,具有代表性的成分的抽象
- 关系:关系把事物之间联系一起
- 图:图是事物和关系的可视化表示
面向对象设计,以下我们以Java语言为分析,介绍如何使用UML画类图关系。在Java中,最主要的就是类(Class)和接口(Interface)了。类封装了数据和行为,即类中定义了属性和方法。每个类一般都具有一定的职责(一般是只有一种职责,即单一职责原则
),即类要完成什么样子的功能。
单个类
在UML图中,单个类或者接口是最基础的模块了,所以优先介绍下单个类是如何画,一个类一般分为三层,最顶层是类名,中间层是属性,最底层是方法。
- 类名的表示方式:直接写类名,例如Dog
- 属性的表示方式:【可见性】【属性名称】:【类型】= { 默认值,可选 }
- 方法的表示方式:【可见性】【方法名称】(【参数列表】):【类型】
- 可见性符合表示:+ 代表 public,- 代表 private,# 代表 protected
假如定义如下一个类:
package com.nobody.uml;
/**
* @Description 狗
* @Author Mr.nobody
* @Date 2021/5/18
* @Version 1.0
*/
public class Dog {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void bark() {
System.out.println("Dog " + name + " is bark.");
}
}
继承关系
继承也叫泛化,它基本上描述了在对象世界中的继承关系,用于描述父子类之间的关系,父类又称为基类或者超类,子类又称作派生类,是一种一般化 - 特殊化的关系。继承关系用带空心三角形的实线来表示。
package com.nobody.uml;
/**
* @Description 黄狗
* @Author Mr.nobody
* @Date 2021/5/18
* @Version 1.0
*/
public class YellowDog extends Dog {
private String color;
public void showColor() {}
}
实现关系
实现关系是具体类实现接口,接口是定义抽象方法并且只能有静态常量的。实现关系用带空心三角形的虚线来表示。如下定义接口Animal,以及它的实现类Dog:
package com.nobody.uml;
/**
* @Description 动物接口
* @Author Mr.nobody
* @Date 2021/5/18
* @Version 1.0
*/
public interface Animal {
void run();
}
package com.nobody.uml;
/**
* @Description 狗
* @Author Mr.nobody
* @Date 2021/5/18
* @Version 1.0
*/
public class Dog implements Animal {
private String name = "dog";
private int age;
public void bark() {
System.out.println("Dog " + name + " is bark.");
}
@Override
public void run() {
}
}
聚合关系
聚合关系表示整体与部分的关系,部分是整体的一部分,也可以脱离整体而单独存在。例如桌子,椅子是教室的一部分,但是桌子和椅子也能独立存在于教室之外。聚合关系用带空心菱形的直线表示。
package com.nobody.uml;
/**
* @Description 教室
* @Author Mr.nobody
* @Date 2021/5/18
* @Version 1.0
*/
public class ClassRoom {
private Desk desk;
private Chair chair;
public String getClassRoomNo() {
return "";
}
}
package com.nobody.uml;
/**
* @Description 桌子
* @Author Mr.nobody
* @Date 2021/5/18
* @Version 1.0
*/
public class Desk {
}
package com.nobody.uml;
/**
* @Description 椅子
* @Author Mr.nobody
* @Date 2021/5/18
* @Version 1.0
*/
public class Chair {
}
关联关系
关联关系表示一类对象与另一类对象之间有联系,这种关系也是Java中比较常见的,因为我们通常会将一个类的对象作为一个另一个类的属性,例如顾客和商品,部门和职工等。在UML类图中,用带有箭头的实线连接有关联关系的对象所对应的类,关联关系分单向关联、双向关联、自关联。
单向关联
单向关联指的是关联只有一个方向,例如电脑拥有CPU,示例代码如下:
package com.nobody.uml;
/**
* @Description 电脑拥有CPU
* @Author Mr.nobody
* @Date 2021/5/18
* @Version 1.0
*/
public class Computer {
private Cpu cpu;
}
class Cpu {
}
双向关联
双向关联指的是关联有两个方向,一般指互相拥有的情况,例如顾客和商品,客户拥有商品,商品属于某个顾客。示例代码如下:
package com.nobody.uml;
import java.util.List;
/**
* @Description 顾客和商品的双向关联关系
* @Author Mr.nobody
* @Date 2021/5/18
* @Version 1.0
*/
public class Customer {
private List<Product> products;
}
class Product {
private Customer customer;
}
自关联
自关联,指的就是类中的属性也是自身类的一个对象,这在链表中比较常见,例如单向链表Filter会维护下一个后继的Filter。
package com.nobody.uml;
/**
* @Description
* @Author Mr.nobody
* @Date 2021/5/19
* @Version 1.0
*/
public class Filter {
private Filter nextFilter;
}
组合关系
组合关系表示的是整体和部分的关系,并且由部分组成整体,部分依赖于整体,整体不存在了部分也就不存在了。例如人有手和脚等。在UML中,组合关系用带实心菱形的直线表示。
package com.nobody.uml;
/**
* @Description 人和手教的关系,组合关系
* @Author Mr.nobody
* @Date 2021/5/19
* @Version 1.0
*/
public class Person {
private Hand hand;
private Foot foot;
}
class Hand{
}
class Foot{
}
IDEA 生成 UML 图
其实在 Intellij IDEA 工具中,可以根据现有的类关系,一键自动生成UML类关系图,操作简单,而且图也易看清楚。我们只需要在查看的类右键选择Diagrams - Show Diagrams (快捷键 Ctrl + Alt + Shift + U) 即可打开此类所关联的图类。
总结
一个好的系统,一定是经过充分的分析设计的,而不是一拿到需求就直接开撸代码,到最后发现系统有问题,或者系统扩展性稳定性极差,不得不重新设计开发,这是得不偿失的。所以得学会分析需求,功能分析,系统设计,才能为后续的开发做好充足的准备。当然以上讲解的面向对象设计会用到UML类图设计,实际中会结合其他工具或者文档使用。欢迎大家点赞关注,也可以关注我公众号,同我用户名,一起学习交流。
以上是关于进500强公司当开发实习生,导师让做的第一件事竟然是画UML图,你会吗?的主要内容,如果未能解决你的问题,请参考以下文章