`
qingBYqing
  • 浏览: 50513 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多
以前写的代码 :
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);
			}}}}




感悟接口、抽象类 的优越性后重构


一、以前代码局限性分析
      上面这些代码,自己其实不是没想过搞一点面向对象的思想来指导自己的编码,主要是当自己能把功能实现的时候已经很不错了,还管它面向什么。不能一直这样下去,自己试着以面向对象的思想去发现以前写的代码一些缺点:
      
    a.扩展性差 :很难再在个类里面加入些了
    b.重用性差: 看上去根本没什么可好重用的代码段
    c.耦合度高:方法之间的调用比较凌乱
 
   
二、重构代码分析
       
    自己首先拿一只笔再纸上分析文件的复制整个流程步骤:
   a. 文件复制首先要有存在被复制的文件即“源文件”和要复制到哪里去 即“目标文件”  是  否存在的问题

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

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

经过上面的分析不难发现 可以把这个类写的更有层次结构化一些:
         
    首先,可以将 文件是否存在的判断单独的写一个类或者定义它为接口
    其次,在文件夹的复制时要用到文档的复制,这样就容易想到将文件夹的复制作为“子类”来 继承父类”文档的复制。
    最后,根据“面向对象”的思想考虑将可以将其中的某个类写成“抽象类
                 
              



三、再分析代码的优越性

              

    

    a.扩展性

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




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


             


四、自己关于面向对象的一点点看法:

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

      说起来好像是那么回事,但是自己用起来就难,希望在以后的敲代码之前多注意下,试着能够尽量的体现下面向对象
  • 大小: 50.8 KB
  • 大小: 19.8 KB
  • 大小: 13.9 KB
  • 大小: 30.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics