重构代码前后的对比
重构前
重构后
为什么要重构文件路径的代码
由上面的对比图相信您可以看出我是把原来的绝对路径的部分(D盘,考生文件)给封装起来了,重构后的代码是从其他文件(ClsNum)中调用封装起来的路径。
通过这种方式调用路径是符合对修改封闭,对扩展开放的思想。
假如我们需要把上面的D盘改成C盘,那么我们需要找到这个文件,打开并作出修改。当然,一个需要修改好说,要是有许多文件的路径都需要呢?你需要打开这些类,然后一个一个的去修改。这种做法增加了工作量,降低了开发效率。如果项目交接给新人,这玩意都不是他写的,找到所有文件路径然后更改的做法对他也太残忍了。
怎么封装这些路径呢?
方案一(不合适):
我们新建一个类,把这些路径封装在这个类文件中,形成变量。然后U层直接引用这个类,在这个类里面“点”出来封装的变量即可。
分析:这个做法的确可以做到在一个类里面修改这些路径,而不影响其他类。对于开发人员来说,这看似是最方便省事的一个办法。只要把这个类的名字命名规范,谁都能看懂,连新人也不需要费很大事儿。
But,这个方案有一个致命的问题。因为我们的软件都是需要打包发布的,而打包发布后的文件是.exe,在VS中开发的所有.cs类文件全部打包在了这个.exe文件中,生成为软件后,我们没办法修改。也就是说,上述的方法每修改一次,程序就得重新打包发布一次。仔细想想:这是不是违背了对修改封闭,对扩展开放呢?
方案二:
顺着方案一的思路,也就是说我们最好能把路径集中写在一个位置,同时还不用重新打包发布。当我们想把原来的文件路径操作从D盘变成C盘时,在一个文件里做更改,不用借助打包软件,不要发布,再执行一次.exe文件,就直接能体现在用户的下一次使用上。这是不是就太爽了?有这样的办法吗?
当然有,下面的内容将会带读者看看把路径文件封装在.config配置文件的强大效果。
C#读写App.config文件
在配置文件中书写代码。
key是名称,value是指,具体的路径也写在value里
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="DemoKey" value="*" />
</appSettings>
</configuration>
在项目的类中怎么调用配置文件里的路径呢?
可以看到["DemoKey"]里面的内容就是配置文件中key的值
String str = ConfigurationManager.AppSettings["DemoKey"];
项目实战
我们项目组做的是大学生一级考试系统,是C/S的项目。需要系统自动读取指定路径下学生的答题文件,进行判分。我优化的正是这里的路径。 方法如下:
1.在配置文件(App.config)中把路径封装好。
你当然可以写多个子路径,调用的时候把这些路径拼接起来就可以读到了。需要注意!是在<appSettings></appSettings>里写的如下代码
<!--定义考生文件夹的路径-->
<add key="CommonUrlOne" value="D:\\" />
<add key="CommonUrlTwo" value="\计算机一级考生文件\" />
<!--定义考生excel文件的路径-->
<add key="excelUrlOne" value="卷\Excelkt\Excel" />
<add key="excelUrlTwo" value=".xlsx" />
<!--定义考生PPT文件的路径-->
<add key="pptUrlOne" value="卷\\Pptkt\\PPT" />
<add key="pptUrlTwo" value=".pptx" />
<!--定义考生word文件的路径-->
<add key="wordUrlOne" value="卷\\Wordkt\\bg" />
<add key="wordUrlTwo" value=".docx" />
<add key="wordUrlThree" value="卷\\Wordkt\\Word" />
2.用反射获取配置文件中的路径
我这里封装了一个定义类。首先你需要在类里面应用命名空间using System.Configuration;反射代码这么写!可以看到CommonUrlOne与配置文件里key的值对应
//定义变量反射配置文件中的考生文件夹路径
public static string CommonPathOne = ConfigurationManager.AppSettings["CommonUrlOne"];
public static string CommonPathTwo = ConfigurationManager.AppSettings["CommonUrlTwo"];
//定义变量反射配置文件中的excel文件路径
public static string ExcelPathOne = ConfigurationManager.AppSettings["excelUrlOne"];
public static string ExcelPathTwo = ConfigurationManager.AppSettings["excelUrlTwo"];
//定义变量反射配置文件中的ppt文件路径
public static string PPTPathOne = ConfigurationManager.AppSettings["pptUrlOne"];
public static string PPTPathTwo = ConfigurationManager.AppSettings["pptUrlTwo"];
//定义变量反射配置文件中的word文件路径
public static string WordPathOne = ConfigurationManager.AppSettings["wordUrlOne"];
public static string WordPathTwo = ConfigurationManager.AppSettings["wordtUrlTwo"];
public static string WordPathThree = ConfigurationManager.AppSettings["wordUrlThree"];
3.读取方式。
只需要在调用时,声明一个变量来获取路径即可。ClsNum就是我封装的定义类。
(代码中的MyInfo.是获取学生的学号,这些考生文件是以学号来命名的,在此不是重点)
//从配置文件读取考生Excel文件路径——刘桐——2019-2-22
private static string file = ClsNum.CommonPathOne + MyInfo .MystudentID ()+ ClsNum.CommonPathTwo +MyInfo.MyPaperType()+ ClsNum.ExcelPathOne + MyInfo.MyPaperType().Trim() + ClsNum.ExcelPathTwo;
4.请看看2步骤和3步骤这两个类,它们的代码写好了之后不需要再更改,只需要在配置文件中更改对应Value的值即可~