`
Eric.Yan
  • 浏览: 318381 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

一个log的重构

阅读更多

×××××××××××××××××××××××××××××

项目最近在enhancement,很多东西现在一看都需要重构,特别是本人以前写的,哎,才疏学浅啊,还要努力学习才行。
项目中有个记log的功能(可以理解的很简单,点击link就记一条log),是嵌在各个功能方法里边写的,这么写即难看,又不利于维护,而且对性能还会造成影响,所以现在考虑重构,重新来过。
目前有3种方案:
1)用log4j
2)用spring3.0自带的一个asynchronous logging来做
3)自己用动态代理的模式实现
如果可以的话,每种方法都想试一下,目前比较倾向于3),用动态代理,新new一个thread专门去做log的记录,这样的结构要好很多,易维护;

 

一>先看一个简单的dynamic proxy case:
------------------------interface

public interface Phone
{
 public void call(int s, String p);
}

 ------------------------implements

public class CellPhone implements Phone
{
 @Override
 public void call(int s, String p)
 {
  System.out.println("this is cellphone");
 }
}

 ------------------------proxy

public class DynamicProxyFactory implements InvocationHandler
{
 private Object ob;

 
 public Object createProxyInstance(Object targetObject)
 {
  this.ob = targetObject;
  return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
 }
 
 @Override
 public Object invoke(Object arg0, Method arg1, Object[] arg2)
   throws Throwable
 {
  System.out.println("dynamic start!");
  System.out.println("again dynamic start!");
  Object result = arg1.invoke(ob,arg2);
  System.out.println("again dynamic end!");
  System.out.println("dynamic start!");
  return result;
 }
}

 -----------------------test class

public class MainPhone
{

 /**
  * @param args
  */
 public static void main(String[] args)
 {
  //static delegate
  /*Phone cell = new CellPhone();
  cell.call(1,"static delegate");
  
  Phone audioCell = new AudioCellPhone(cell);
  audioCell.call(1,"static delegate");
  
  Phone videoAudioCell = new VideoAudioCellPhone(audioCell);
  videoAudioCell.call(1,"static delegate");*/
  
  //dynamic delegate
  Phone cellPhone = new CellPhone();
  DynamicProxyFactory delegate = new DynamicProxyFactory(); 
  Phone proxyPhone = (Phone)delegate.createProxyInstance(cellPhone);
  proxyPhone.call(5,"dynamic love");
 }

}

 

从上往下,依次是接口-实现类-动态代理类-main入口,结果预期:

dynamic start!
again dynamic start!
this is cellphone
again dynamic end!
dynamic start!

 

如果你想在现有的操作下再套一层(比如说,原来那个方法实现了user request,你现在用代理模式成功的添加了日志,以后user如果要求再添加什么功能,可以直接在DynamicProxyFactory中写,‘again dynamic start!’).
但是实际将动态代理应用在项目中一直会有问题,即前一篇blog, 不过问题都解决了。

 

二>动态代理模式已经建立,下面用new thread来使perfermence更加完善.

thread的用法参考上一篇blog,运用的时候一般用runnable接口来实现,把你想让这个thread做的事情放在override的run()方法中,但是这时又碰到一些问题,参数的问题。
run()中可能需要project传来的参数,从而来完成一些操作,但是run()并没有参数可以让你传递,怎么办?

 

其实有2种基本方法可以向线程传递参数,不再详细说明:


通过构造方法传递
通过变量(set方法)传递

此仅为方案三,如果有时间我会一并实现其他方案……

分享到:
评论

相关推荐

    论文研究-基于log-sum范数的压缩感知重构算法 .pdf

    基于log-sum范数的压缩感知重构算法,成萍,刘婷婷,压缩感知中基于l1范数的最小优化算法,并不是对l0范数的最有效的逼近方法。随着测量值的减少,l1范数恢复信号的能力也在下降。针对

    02-Log丑陋设计分析

    02-Log丑陋设计分析 重构 Log设计臭味-拙劣设计的症状及解决方法

    项目重构方案设计.pdf

    项⽬重构⽅案设计 最近接⼿到⼀个已经成型的项⽬,然后我们的任务就是对它进⾏重构,这个项⽬是⼀个功能很齐全的WPF视频播放器(附带很多其他功 能),在仔细研究了项⽬的背景和架构以后,初步做出了⼀下的重构⽅案...

    logtxt-命名行记录日志

    可以有多个参数. 正常记录方法: logtxt.exe 有事发生记录下来 logtxt.exe 重要 关键错误 vbs调用如下: Dim objShell Set objShell = CreateObject("Wscript.Shell") objShell.Run "logtxt.exe 记录消息",0 把...

    TestRecorder For WatiN 优化重构版

    这里要讨论的是另一个项目WatiN Recorder,那的创意很好,可以也没有坚持下去,2008年5月后就没有更新了,本文分析器原因,提出专注于用户录制、回放,模拟等核心需求,对原项目进行重构,并增加了UI测试人员熟悉的JS...

    matlab实现基于DCT的图像变换编码

    编写一个Matlab程序,实现基于DCT的图像变换编码。 编码过程:将原始图像划分成8×8的图像块,采用离散余弦变换(DCT)对图像块进行变换。 解码过程:对于每个图像块,使用一定比例的最低频DCT系数(被舍弃的高频DCT...

    重构--改善既有代码的设计

    《重构--改善既有代码的设计》除了讨论各式各样的重构技术,作者还提供了一份详细名录(datalog),其中有超过70个一本证明效果的重构手法,以丰饶富帮助的重点,交到你实施的时机,实施时的逐步指令。

    Log 这是一个Android 轻量级简单易用的Log组件

    支持添加拦截器,添加拦截器后它会在最终打印输出前进行拦截处理,可以对日志信息进行重构处理 支持添加全局回调,在不影响底层输出的情况下,所有信息会回调至全局接口里,可以在这里按各种级别类型保存你需要的...

    CS_OMP.zip_K._OMP信号稀疏_OMP稀疏重构_信号稀疏重构

    1-D信号压缩传感的实现(正交匹配追踪法Orthogonal Matching Pursuit) 测量数M>=K*log(N/K),K是稀疏度,N信号长度,可以近乎完全重构

    atom-javascript-refactor:atom javascript 重构工具

    Javascript 重构工具(pre 早期 alpha 版本)非常ALPHA版本这是一个非常有用的东西的早期版本。 主要功能,“仪器所有功能”在 ES6 中不能很好地工作。 我没有时间让它更稳定。 如果您使用的是 ES5,此命令可能会很...

    log4j:对log4j修改,重新修改日志写出格式

    log4j对log4j修改,重新修改日志写出格式以便支持flume-ng的格式对exception信息重构

    一种离散小波变换的快速分解和重构算法 (2002年)

    通过对实序列的快速傅里叶变换算法的推导及Mallat 算法原理的分析,根据离散小波变换(DWT)算法结构特征,提出了一种离散小波变换的快速分解和重构算法;给出了相应的算法步骤。从数学理论上对该算法进行了论证,...

    第一组重构(重构:改善既有代码的设计)

    console.log(`name: ${invoice.customer}`); console.log(`amount:${outstanding}`); } ↓↓↓ function printOwing(invoice) { printBanner(); let outstanding = calculateOutstanding(); pr

    scientist:一个JavaScript库,用于仔细重构关键路径

    科学家 一个用于精心重构关键路径JavaScript库, 端口安装npm install @fightmegg/scientist 用法import Scientist from '@fightmegg/scientist'const experiment = new Scientist ( 'experiment #1' ) ;experiment ...

    项目重构方案设计(1).pdf

    项⽬重构⽅案设计 项⽬重构⽅案设计 近期接⼿到⼀个已经成型的项⽬,然后我们的任务就是对它进⾏重构,这个项⽬是⼀个功能⾮常齐全的WPF视频播放器(附带⾮常多其它功能),在细致研究 了项⽬的背景和架构以后,初步...

    changelog-io:生成变更日志

    使用一个命令生成变更日志。 安装 npm i changelog-io -g 这个怎么运作? 如果您已经有标签并使用如下约定: 功能(scrope)命令消息 修复(作用域)提交消息 docs(scope)提交消息 杂项(作用域)提交消息 重构...

    传统的changelog-angular-emoji:Emojis用于带有表情符号的Angular Commit指南

    角度表情符号预设 带有表情符号的 这是来自的fork。 用npm安装 npm install --save-dev conventional-changelog-...重构: :package: 代码重构 性能(xxx): :rocket: 性能改进 测试(xxx): :police_car_light: 测验

    Java为改善可读性和灵活性重构代码.pdf

    关于这个主题有大量优秀的资源,相关的方法和工具也不只针对Java。假定你已经完成了分析,并且判断出是运行环境中Java 组件的性能需要改善。 ——参考资料:仅个人学习,未详尽测试,请自行调试!!

    Log_Spectral_Distance.rar_LSD_spectral distance_倒谱距离_对数谱距离lsd_对数

    使用LSD,即对数倒谱距离(Log_Spectral_Distance)来评判重构出来信号与原始信号之间的差异。

    数据库备份还原

    数据库都会存在一定的安全隐患。对于数据库管理员来说不能仅寄希望于计算机操作系统的安全运行,而是...在线日志文件(online redo log file)填入日志项(redo entry),日志项记录的数据用于重构对数据库所作的全部修改。

Global site tag (gtag.js) - Google Analytics