进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图,你会吗?的主要内容,如果未能解决你的问题,请参考以下文章

断电?死机?用Excel要做的第一件事!

转七年阿里老人谈新人成长

我去实习啦,收获了这些

我去实习啦,收获了这些

从零基础到拿到网易Java实习offer,我做对了哪些事

从零基础到拿到网易Java实习offer,我做对了哪些事