重构”文件复制"---感悟接口、抽象类

[color=red]以前写的代码 :[/color]

import java.io.*;
import javax.swing.*;
public class CopyFileUtil {
/**
* 文档内容复制
*/
private static void getData(String sourceFileName,
String destinationFileName) {
// 文件复制
int i;
BufferedInputStream input = null;// 读取
BufferedOutputStream output = null;// 写出
try {
input = new BufferedInputStream(new FileInputStream(sourceFileName));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
output = new BufferedOutputStream(new FileOutputStream(
destinationFileName));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
while ((i = input.read()) != -1) {
output.write(i);
}
input.close();
output.flush();
output.close();
} catch (IOException e) {
e.printStackTrace();
}}
/**
* 判断目的文件是否存在
*/
private static boolean isDestinationPathExist(String destinationFilePath,
boolean isOverwrite) {
File destinationFile = new File(destinationFilePath);
if (destinationFile.exists()) {
// 如果目标文件存在并不可以覆盖
if (isOverwrite == false) {
return false;
}
} else {// 如果目标文件所在的目录不存在且创建目标不成功
if (!destinationFile.getParentFile().exists()) {
if (!destinationFile.getParentFile().mkdirs() == true) {return false;
}}}return true;
}
/**
* 判断源文件是否存在
*/
private static boolean isSourcePathExist(String sourceFileName) {
File sourceFile = new File(sourceFileName);
if (!sourceFile.exists()) {
return false;
}return true;}
/**
* 复制文件
*/
public static void copyFile(String sourcePath, String destinationPath,boolean isOverwrite) {
File _sourceFile = new File(sourcePath);
// 获得文件下面所以子文件
File[] listFile = _sourceFile.listFiles();
for (int i = 0; i < listFile.length; i++) {
if (listFile[i].isFile()) {// 如果是真实文件,复制文件内容
getData(listFile[i].getAbsolutePath(), destinationPath+ File.separator + listFile[i].getName());
} else if (listFile[i].isDirectory()) {
// 如果是文件夹,就先创建这个文件夹
String DirectoryPath = destinationPath + File.separator+ listFile[i].getName();
File DirectoryFile = new File(DirectoryPath);
DirectoryFile.mkdirs();
// 递归循环
CopyFileUtil.copyFile(listFile[i].getAbsolutePath(),
DirectoryPath, isOverwrite);
}}}}



[color=red]感悟接口、抽象类 的优越性后重构[/color]:


一、以前代码局限性分析
上面这些代码,自己其实不是没想过搞一点面向对象的思想来指导自己的编码,主要是当自己能把功能实现的时候已经很不错了,还管它面向什么。不能一直这样下去,自己试着以[color=green]面向对象[/color]的思想去发现以前写的代码一些缺点:

a.[color=green]扩展性[/color]差 :很难再在个类里面加入些了
b.[color=green]重用性[/color]差: 看上去根本没什么可好重用的代码段
c.[color=green]耦合度[/color]高:方法之间的调用比较凌乱


二、重构代码分析

自己首先拿一只笔再纸上分析文件的复制整个流程步骤:
a. 文件复制首先要有存在被复制的文件即“源文件”和要复制到哪里去 即“目标文件” 是 否存在的问题

b.文件类型的问题:是文档文件,还是一个文件夹

c. 文件复制:如果是文档文件就直接复制文档内容,如果是文件夹不仅要复制里面问档内容,还有一些只文件夹复制

经过上面的分析不难发现 可以把这个类写的更有层次结构化一些:

首先,可以将 文件是否存在的判断单独的写一个类或者定义它为[color=green]接口[/color]
其次,在文件夹的复制时要用到文档的复制,这样就容易想到将文件夹的复制作为“[color=green]子类[/color]”来 [color=green]继承[/color]“[color=green]父类[/color]”文档的复制。
最后,根据“面向对象”的思想考虑将可以将其中的某个类写成“[color=cyan]抽象类[/color]”


[img]http://dl.iteye.com/upload/attachment/286224/35986c20-7a6d-3215-8476-36e1980ca675.jpg[/img]


三、再分析代码的优越性


[img]http://dl.iteye.com/upload/attachment/286226/782fa39c-87ea-33d5-ac5e-6633d3969c7a.jpg[/img]


a.[color=green]扩展性[/color]:

定义的抽象类中可进行扩展,继承它的子类也可以进行扩展 这不仅是一个文件复制的实现了,如果在进行文件“压缩”“加密”等等都很容易实现。而且不感到杂乱!

[img]http://dl.iteye.com/upload/attachment/286231/65da3f84-ebba-3fe5-8562-490d7a5670d7.jpg[/img]


b.[color=green]重用性[/color]:
基本上没个模块都可以单独的划分开,每个类都可以重用
c.[color=green]耦合性[/color]:
类与类的关系明确,继承结构清晰,不同类直接方法调用少。
可以将整个包进行封装 ,如果要复制的时候只要传入 “源文件路径”“目标文件路径”即可。

[img]http://dl.iteye.com/upload/attachment/286229/7e999953-8ccd-320d-9b50-2f92fa497927.jpg[/img]



四、自己关于[color=green]面向对象[/color]的一点点看法:

我觉得面向对象主要就是把抽象的事物通过“[color=green]抽象类[/color]”具体化后,再进行操作,具体化后的事物都具备抽象的功能,通过[color=green] 封装[/color] 、[color=green]接口[/color]这样就能够最大化的体现重用,当然具体化后的东西可以更改操作的内部实现,比如通过 [color=green]继承[/color]这样就能够体现出[color=green]多态性[/color]......

说起来好像是那么回事,但是自己用起来就难,希望在以后的敲代码之前多注意下,试着能够尽量的体现下[color=green]面向对象[/color]吧
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值