重构之字段改名 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三级联动
#以字典的形式 保存相关省市数据 menu={ '北京':{ '朝阳':{ '国贸':{ 'CICC':{}, 'HP':{}, '银行':{}, 'CCTV':{} }, '望京':{ '陌陌':{ ...
- C++ getline()的两种用法
getline():用于读入一整行的数据.在C++中,有两种getline函数.第一种定义在头文件<istream>中,是istream类的成员函数:第二种定义在头文件<string ...
- ThreadPoolExecutor源码1
参考:https://www.cnblogs.com/liuyun1995/p/9305273.html ThreadPoolExecutor1 executorService1 = new Thre ...
- Python学习教程(十)精选 TOP45 值得学习的Python项目
精选 TOP45 值得学习的Python项目 [导读]热门资源博客 Mybridge AI 比较了 18000 个关于 Python 的项目,并从中精选出 45 个最具竞争力的项目.我们进行了翻译,在 ...
- [转帖]java面试和笔试大全
java面试和笔试大全 https://www.cnblogs.com/linzheng/archive/2011/01/05/1926856.html 2.String是最基本的数据类型吗? 基本数 ...
- 第七节:Asp.Net Core内置日志和整合NLog(未完)
一. Asp.Net Core内置日志 1. 默认支持三种输出方式:控制台.调试(底部输出窗口).EventSource,当然也可以在Program类中通过logging.ClearProviders ...
- 【洛谷】P1022 计算器的改良-全AC题解
#include <iostream> #include <cstring> #include <iomanip> using namespace std; int ...
- EF Core 批处理语句
在Entity Framework Core (EF Core)有许多新的功能,最令人期待的功能之一就是批处理语句.那么批处理语句是什么呢?批处理语句意味着它不会为每个插入/更新/删除语句发送单独的请 ...
- Prometheus 配置文件详解
Prometheus 配置文件详解 官方文档:https://prometheus.io/docs/prometheus/latest/configuration/configuration/ 指标说 ...
- 补习系列(17)-springboot mongodb 内嵌数据库【华为云技术分享】
目录 简介 一.使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二.使用Fongo A. 引入框架 B. 准备测试类 C.业 ...