



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VB中运用反射原理优化程序代码在这个项目里我负责的部分是读取某子系统从数据库导出来的两个XML(不妨假设为A.XML和B.XML)文件并根据文件内容完成本部分的业务工作流程。文件是以共享方式放在服务器上,我只需要获得一个Session访问即可,因为要求是实时读写文件,所以否定了下载到本地进行读写的方法,而为了保证程序生命力和数据的完整性,我决定将文件信息一次性读入程序存储空间,并在业务流程中设定当完成某个特定的步骤后回写一遍AB两文件,其中A文件节点可能有增删B文件只是更新某个标志。一开始设计具体类的时候很容易想到构造和文件结构对应的类,使用庞大的DOM对象?哦,我可不需要那么多累赘。现在我把对应AB两文件的类分别写了个大概出来,很简单如下:Class clsA/BProperty Name1 as string.End PropertyProperty Name2 as string.End Property. . End Class A,B各需要要一个集合类管理,分别命名为clscolA,clscolB,大概如下:Public Class clscolA/BInherits System.Collections.CollectionBasePublic Function GenerateAson() As clsA/clsBNew并返回一个 clsA or clsB初始化属性的工作可以在这里进行End FunctionPublic Sub AddSon(ByVal objSon As clsA/clsB)增加一条新纪录InnerList.Add(objSon)End SubPublic Sub Sort()根据某设定的属性对集合进行排序InnerList.Sort(New clsSortByName)End Sub默认Item属性以及更多Method从略End Class好了,现在程序数据的基本框架搭好了,这无疑是十分中庸地解决办法,当然也是十分有效的,本文的主题并不是特别愿意删减这些成熟的代码(当然也仅仅是暂且不动而已)。躯壳已有,剩下的工作就是从文件读取并填充数据,如果你还没有接触过反射或者仅仅限于书本上那点例子,这对你来说可能是一个简单而又枯燥的过程,你于是乎也条件反射似地写起来 New一个clscolA/B(就叫colA/B吧)然后遍历文件或取一个包含所有记录(目标节点)的NodeList,然后作如下状:With NodeListfor i as integer=0 to .Count-1Dim objson as clsA/B=colA/B.GenerateAsonobjson.Name1=.item(i).childnodes(x1).innertextobjson.Name2=.item(i).childnodes(x2).innertext. .colA/B.Addson(objson)next iEnd With这段代码虽然他够用,又看似天衣无缝,但总觉得不对头,当属性达到一定数量,你有没有发现你将会使用了太多的同样的赋值句?小学语文就告诉过我们适当使用排比句可以为文章造势,但是如果你一口气排比了20条,那就是滥用了,笔者这里A文件每一条记录有三十多个Field,B文件也有十多个,如果这样用下来景象肯定巍巍壮观,先估计一下代码量,A文件每条记录按30个Field,B按15个算,赋值过程便是45行,还不包括格式化处理和排错处理,如果考虑程序扩展性,以后要读更多的文件则必然会伴随更多类似的过程出现,写程序和做人一样,要低调,一定要低调啊,有激情的程序员自然不会如此糟蹋自己的代码,是否能用一个函数或过程解决上述问题呢?新方案应用而生,采用反射(Imports/using System.Reflection),一个通用过程解决所有问题。示例函数如下:Public Shared Function FillFromXml(ByVal NodeName As String, ByVal strPath As String, ByVal objFather As Object) As BooleanTryWith xmlGetList(NodeName, strPath)For i As Integer = 0 To .Count - 1Dim st As Object = objFather.GenerateAsonDim ty As Type = st.GetTypeFor Each pp As PropertyInfo In ty.GetPropertiesWith DirectCast(.Item(i), XmlElement)If .SelectSingleNode(pp.Name.ToUpper) IsNot Nothing Thenpp.SetValue(st, CType(.SelectSingleNode(pp.Name.ToUpper).InnerText.Trim, String), Nothing) End IfEnd WithNextobjFather.AddSon(st)NextEnd WithReturn TrueCatch ex As ExceptionReturn FalseEnd TryEnd Function使用这个函数,只需要保证集合类clscolA/B有GenerateAson和Addson两个方法以及clsA/B两子类的属性名称与文件中Field保持一致即可。你只需要传递相应A或者B文件的目标节点名,文件路径,以及对应的集合类即可,此时再看一下赋值过程的代码减少了多少,恩,只有8行,这对于笔者则意味着省去了45-8=37行代码,而且丢弃老套的排比句。第一阶段战斗算是小试牛刀了一把,如果只算赋值过程代码减少百分数为37/45,接近83%。你也可能抱怨我上面的百分数计算太不科学,要算也应该拿全部来算,那就不妙了,好吧,看来也只能拿十分“老的“成熟“的来开刀了,下面便是削减代码二期工程,我们的目标是让成熟变干练,太过成熟的确不合某些同志的胃口。对应于AB两文件的类clsA/B,分别至少有30和15个属性,还好,也不过就一二百行代码就搞定,更简单点就用自己写的代码生成器,一次性生成所有属性,并不会很麻烦。不过还是有更好(准确使更精简)的解决办法,用一个通用类,十分之一的代码(实际应用中会更少)就可以做到。这其实不过是一个继承了字典的子类,如下:Public Class clsCommonInherits System.Collections.DictionaryBasePublic Sub AddField(ByVal FieldName As String, ByVal value As Object)Dictionary.Add(FieldName, value)End SubDefault Public Property Item(ByVal key As String) As ObjectGetReturn Dictionary.Item(key)End GetSet(ByVal value As Object)Dictionary.Item(key) = valueEnd SetEnd PropertyEnd Class这个通用类提供两个基本的方法,意义显而易见,而其对应的集合类基本还是原来那个样子:Public Class clscolCommonInherits System.Collections.CollectionBasePublic Function GenerateAson() As clsCommonEnd FunctionPublic Sub AddSon(ByVal objSon As clsCommon)End SubPublic Sub Sort()End Sub默认Item属性以及更多Method从略End Class不过这时候赋值过程也需要更改一下:With xmlGetList(NodeName, strPath)For i As Integer = 0 To .Count - 1Dim st As Obj
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 福建省三明市将乐县2022-2023学年九年级上学期期中化学试题(含答案)
- 消费者心理与行为(第8版·数字教材版) 课件 第1章 绪论
- 高级职称评定课件
- 北医大gsp考试题库及答案
- 北京法官入额考试真题及答案
- 3-Methyl-2-buten-1-ol-d6-生命科学试剂-MCE
- 北海五中期末考试试卷及答案
- 高温安全知识培训内容课件
- 高清课堂安全知识培训课件
- 包头期末考试高中卷子及答案
- 《中国人首次进入自己的空间站》跨学科公开课一等奖创新教案+统编版语文八年级上册
- 小学生英语授课课件模板
- 膳食委员会管理制度
- 2025至2030年中国宽带SOHO路由器行业投资前景及策略咨询报告
- XXX学校违规使用教辅材料专项整治工作实施方案范文
- T/SFABA 7-2024天然食品添加剂天然性溯源
- T/CECS 10011-2022聚乙烯共混聚氯乙烯高性能双壁波纹管材
- T/CACEM 22.6-2022校车运营服务管理第6部分:评价与改进
- DB31/T 477-2018旅行社服务质量要求及等级划分
- 购物中心行业研究报告2024-2025商业洞察
- AI智能体的感知与理解
评论
0/150
提交评论