重构之字段改名 UML行为图 用例图 时序图&协作图 状态图&活动图 依恋情结
简单的使用一下字段改名
为什么使用字段改名:
你在一个软件上做的工作越多,对这个软件的数据的理解就越深刻,你需要把这些理解融入到代码中。利用名字的解释作用,让代码更容易被理解。
如何找到该变量的所有引用点
类的私有字段:
直接修改该字段名称,那么所有引用这个变量的地方将会报红,我们就找到了类中这个字段的所有引用点,之后用新名称依次修改这些引用点。
实战:
这个日志切面类LogAop中的字段clazz和method分别表示被访问的类和被访问的方法。更合适的名称是visitClass, visitMethod或者executionClass和executionMethod。
package cn.itcast.ssm.controller;
import cn.itcast.ssm.domain.SysLog;
import cn.itcast.ssm.service.ISysLogService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;
@Component
@Aspect
public class LogAop {
@Autowired
private HttpServletRequest request;
@Autowired
private ISysLogService sysLogService;
private Class<?> clazz; //被访问的类
private Method method; //被访问的方法
private Date visitTime;
@Pointcut("execution(* cn.itcast.ssm.controller.*.* (..)) && !execution(* cn.itcast.ssm.controller.SysLogController.* (..))")
public void pointCut(){}
// @Before("execution(* cn.itcast.ssm.controller.*.* (..)))")
@Before("pointCut()")
public void before(JoinPoint joinPoint) throws NoSuchMethodException {
/*
获取访问时间
*/
visitTime = new Date();
/*
获取类字节码对象和方法对象
*/
clazz = joinPoint.getTarget().getClass();
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
if(args == null || args.length == 0){
method = clazz.getMethod(methodName);
}else{
Class<?>[] argsClass = new Class<?>[args.length];
for (int i = 0; i < args.length; i++) {
argsClass[i] = args[i].getClass();
}
method = clazz.getMethod(methodName, argsClass);
}
}
// @AfterReturning("execution(* cn.itcast.ssm.controller.*.* (..))")
@AfterReturning("pointCut()")
public void after() throws Exception {
/*
获取执行时间
*/
Long executionTime = new Date().getTime() - visitTime.getTime();
/*
获取url
*/
String url = null;
RequestMapping clazzAnnotation = clazz.getAnnotation(RequestMapping.class);
if(clazzAnnotation != null){
String[] classPath = clazzAnnotation.value();
RequestMapping methodAnnotation = method.getAnnotation(RequestMapping.class);
if(methodAnnotation != null){
String[] methodPath = methodAnnotation.value();
url = classPath[0] + methodPath[0];
}
}
/*
获取ip
需要获取request对象
*/
String ip = request.getRemoteAddr();
/*
获取用户名
*/
SecurityContext context = SecurityContextHolder.getContext();
User principal = (User) context.getAuthentication().getPrincipal();
String username = principal.getUsername();
/*
获取方法
*/
String methodName = "[类名]" + clazz.getName() + "[方法名]" + method.getName();
//创建日志记录,并进行保存
SysLog sysLog = new SysLog();
sysLog.setVisitTime(visitTime);
sysLog.setUsername(username);
sysLog.setIp(ip);
sysLog.setUrl(url);
sysLog.setExecutionTime(executionTime);
sysLog.setMethod(methodName);
sysLogService.save(sysLog);
}
}
-- 日志表
CREATE TABLE sysLog(
id VARCHAR2(32) default SYS_GUID() PRIMARY KEY,
visitTime timestamp,
username VARCHAR2(50),
ip VARCHAR2(30),
url VARCHAR2(50),
executionTime int,
method VARCHAR2(200)
);
依恋情结
函数对某个类的兴趣高过对自己所处的类的兴趣(依恋之苦)。无数次经验里,我们看到某个函数为了计算某个值,从另一个对象那儿调用几乎半打的取值函数。
疗法:使用移动函数(Move Method)把这个函数移到它该去的地方。有时候函数中只有一部分受这种依恋之苦,这时候应该使用提炼方法,把这一部分提炼到独立函数中,在使用移动函数(Move Method)把它们带去它们该去的地方。
UML
UML用户指南 第二部分对基本结构建模 第7章 图
结构图
行为图
5种行为图: 用例图 时序图和协作图 状态图和活动图
交互图
时序图与协作图
时序图:强调消息时间顺序。
协作图:强调接收和发送消息的对象的结构组织。
状态图与活动图
重构之字段改名 UML行为图 用例图 时序图&协作图 状态图&活动图 依恋情结的更多相关文章
- (转)UML实践----用例图、类图、对象图、顺序图、协作图、状态图、活动图、组件图、配置图
面向对象的问题的处理的关键是建模问题.建模可以把在复杂世界的许多重要的细节给抽象出.许多建模工具封装了UML(也就是Unified Modeling Language™),这篇课程的目的是展示出UML ...
- [UML]UML系列——活动图activity diagram
系列文章 [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系(include.extend) [UML]UML系列——类图Class [UML]UML系列——类 ...
- UML: 活动图
摘自http://www.umlonline.org/school/thread-36-1-1.html 活动图和流程图很类似,我们看看一个流程图的例子: 活动图是用来描述流程的一种图,它与流程图的不 ...
- UML活动图(转载)
概述: 活动图是另一个重要的UML图来描述系统的动态方面. 活动图基本上是代表流程形成一个活动到另一个活动的流程图.活动可以被描述为一个系统的操作. 因此,绘制控制流从一个操作到另一个.此流可以是连续 ...
- UML之活动图
活动图,她的英文名字叫Activity Diagram,是一种说明业务用例实现的工作流程,活动图是UML大家族中用于对系统的动态方面建模的无中图之一. 举个简单的例子,以建房的工作流为例,首先,我们要 ...
- uml活动图
uml是程序员需要掌握一个重要工具,特别在研究hadoop(http://www.iigrowing.cn/hadoop)系统中,有很多相关的uml图形需要绘制,为了方便大家了解uml,在网络上找了些 ...
- UML 活动图(转载)
活动图:用于表示系统中各种活动的次序,它的应用非常广泛,即可用来描述用例的工作流程,也可用来描述类中某个方法的操作行为.常用于表示业务流程,对系统功能建模,强调对象之间的控制流.活动图是由状态图变化而 ...
- UML建模——活动图(Activity Diagram)
活动图概述 •活动图和交互图是UML中对系统动态方面建模的两种主要形式 •交互图强调的是对象到对象的控制流,而活动图则强调的是从活动到活动的控制流 •活动图是一种表述过程基理.业务过程以及工作流的技术 ...
- UML活动图(二)
转载于https://www.cnblogs.com/xiaolongbao-lzh/p/4591953.html 活动图概述 •活动图和交互图是UML中对系统动态方面建模的两种主要形式 •交互图强调 ...
随机推荐
- Python学习教程(十)精选 TOP45 值得学习的Python项目
精选 TOP45 值得学习的Python项目 [导读]热门资源博客 Mybridge AI 比较了 18000 个关于 Python 的项目,并从中精选出 45 个最具竞争力的项目.我们进行了翻译,在 ...
- Qt SDK Issue cstdlib: fatal error: stdlib.h: No such file or directory
*To reproduce the issue, I've tried the following solutions which did not help:* *1) Globally remove ...
- dp + 预处理前缀和 - HNU 13248 Equator
Equator Problem's Link: http://acm.hnu.cn/online/?action=problem&type=show&id=13248&cour ...
- 一个萝卜一个坑#我的C坑_两局变量
前面的笔记慢慢补 全局变量和局部变量的区别: 1.首字母 尽量不用全局变量原因: 1.占内存 2.降低通用性和可靠性 3.降清晰度 若在同一源文件中,全局变量和局部变量同名,记住很重要的一条:实参决定 ...
- [终极巨坑]golang+vue开发日记【一】,环境搭建篇
写在前面 这个golang+vue大部分的内容是基于bydmm(橙卡)大佬的视频学来的,我在这里只是做一下个人开发的笔记,就是图一个乐,毕竟我只是个应届毕业生,如果真的要学请:bydmm的b站空间. ...
- python+requests+unittest 接口ddt测试
以数据驱动的形式,将用例维护在py文件中 源码分析: 变量定义 publicParameters.py """ 公共参数 , 按照各公司实情,自行编写 "&qu ...
- IdentityServer4学习及简单使用
本文,主要用来记录IdentityServer4的简单使用. 一. IdentityServer的预备知识 要学习IdentityServer,需要了解下基于Token的验证体系,其中涉及到Token ...
- C#基础语法,快速上収C#
C#代码基础语法 对新手的帮助很大,可以尝试多看看然后在敲敲 // 单行注释以 // 开始 /* 多行注释是这样的 */ /// <summary> /// XML文档注释 /// < ...
- spring mvc 服务器端输出一条可执行js
@RequestMapping(value = "/test",produces = "text/html; charset=UTF-8") @Response ...
- 2019 美柚java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.美柚等公司offer,岗位是Java后端开发,因为发展原因最终选择去了美柚,入职一年时间了,也成为了面试官,之 ...