.NET项目开发—浅谈面向对象的纵横向关系、多态入口,单元测试(项目小结)
阅读目录:
- 1.开篇介绍
- 2.使用委托消除函数串联调用
- 2.1.使用委托工厂转换两个独立层面的对象
- 3.多态入口(面向对象继承体系是可被扩展的)
- 4.多态的受保护方法的单元测试(Protected成员的单元测试)
1】开篇介绍
一如既往,这篇文章是我最近在工作中总结出的一点小小的经验,特此写出来与大家分享,因为我觉得日常开发中这些点点滴滴很有用;
2】使用委托消除函数串联调用
在一般的函数调用情况下,我们都习惯性的将参数传入到某个被调用的方法,这可能就是我们考虑调用方法的惯用思维,但是现在的C#语言得到了很大的提升,我们可以很自然的使用委托来减少函数之间的参数依赖;有时候会经常看见一个函数的内部逻辑并没有使用到传入的某个参数,而传入的真正目的是为了再传入到本函数需要调用的另外一个函数中去;
图1:
这个时候我们可以试着使用委托来封装调用的方法,然后将委托实例传入到第一层使用的函数中去,当然要分清使用场景,不是所有的场景都合适;
图2:
当然需要平衡好这里的内联变量ProductContent,如果可以的话尽量将委托放入到专门创建委托的委托工厂中去,这样方便全局管理,甚至进一步抽象就可以将委托移除程序硬编码到配置文件;
2.1】使用委托工厂转换两个独立层面的对象
一般情况下,我们在应用层会通过数据访问层的代码获取到数据源中的对应数据实体,然后将其进行DomainModel话,只有这样我们才能使用到面向对象的强大功能;这个时候我们只需将创建DomainModel的委托工厂构造好,然后作为参数传入到数据访问接口中去;由于应用层是全局协调层,它可以去完成多层之间的协调操作,所以对于应用层的设计可以尽量饱满一点,而不是很简单的一个静态方法集合,这样就会使得Application Layer很薄;
3】多态入口(面向对象继承体系是可以被扩展的)
很多时候我们在设计一个框架的时候我们都会注意对象的继承体系,但是我们基本上都没有为这些内部对象留有对外的扩展入口;现假设你有一个框架内部的类XmlConvert,该类被XmlConvertSetting全局静态类引用着,如果不能通过XmlConvertSetting对XmlConvert进行设置,就无法使用到XmlConvert的所有对外提供的扩展方法;
public class XmlConvert{protected virtual string ConvertReplace(StringBuilder NodeString){return NodeString.ToString().Replace("XXX", "LLL");}}
有一个很简单的XmlConvert类,是框架内部使用的,现在它提供了一个Virtual方法ConvertReplace,我们想使用这个框架内部的类进行扩展;
public class CustomerXmlConvert : XmlConvert
{protected override string ConvertReplace(StringBuilder NodeString){return base.ConvertReplace(NodeString).Replace("JJJ", "AAA");}
}
但是如果未能提供给我们一个多态入口,我们这个自定义的CustomerXmlConvert无法起作用;最近发现很多自定义的框架设计上就有这个问题,留有了扩展的类型和相应的方法,但是无法插入到框架内部去,所以特此分享一下;
4】多态的受保护方法的单元测试
受保护方法的单元测试一直都不太好解决,但是我们可以通过简单的继承方式来轻松的处理,就拿上面提到的XmlConvert类来举例;
public class XmlConvert
{protected virtual string ConvertReplace(StringBuilder NodeString){return NodeString.ToString().Replace("XXX", "LLL");}
}
如果我们想测试它,直接使用类型继承就可以:
[TestClass]
public class XmlConvertTests : XmlConvert
{[TestMethod]public void XmlConvert_ConvertReplace_Normal(){StringBuilder testData = new StringBuilder("XXXJJJ");string testResult = this.ConvertReplace(testData);Assert.AreEqual(testResult, "JJJ");}
}
这里有一个很好的设计启发就是将方法碎片化尽量保持有返回值的操作,这样很好的进行Assert;其实提到单元测试,冥冥之中总觉得它与面向对象有着一脉相承的感觉,甚至单元测试、重构、面向对象都会起到互补的作用;
内容不多,只是简单的项目小小的总结,希望对大家有用,谢谢;
作者:王清培
出处:http://blog.csdn.net/wangqingpei557
本文版权归作者和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
.NET项目开发—浅谈面向对象的纵横向关系、多态入口,单元测试(项目小结)相关推荐
- .NET项目开发—浅谈面向对象的纵横向关系、多态入口,单元测试(项目小结)...
阅读目录: 1.开篇介绍 2.使用委托消除函数串联调用 2.1.使用委托工厂转换两个独立层面的对象 3.多态入口(面向对象继承体系是可被扩展的) 4.多态的受保护方法的单元测试(Protected成员 ...
- unity 项目开发——浅谈设计模式的六大原则(一)
目录 前言 首先,六大原则是谁? 其次,为什么需要学习这六大原则? 正文 一.单一职责原则 示例: 因此我们需要进行拆分,根据具体的职能可将其具体拆分如下: Unity 单一职责原则 二.开闭原则 U ...
- Hubble A/B test平台前端项目开发浅谈
前言 现在Hubble abtest平台已经正式上线了,至于技术实现方案我在其中一篇文章做了一些分享(查看react技术栈实践),本文主要分享下一些开发过程中的遇到问题思考总结,以及简单介绍下我们平台 ...
- 【c++开篇】浅谈面向对象与面向过程(举例说明)
浅谈面向对象与面向过程 前言:刚接触C++第一时间,都会经常听到这样一话:C语言面向过程,C++面向对象.在老师模拟面试时,问道你对面向对象与面向过程的认识时,我有点懵答的不是很完整,刚好C++开篇写 ...
- 『软件工程13』浅谈面向对象方法,统一建模语言UML
浅谈面向对象方法UML 一.UML的含义 二.UML的主要内容 1.UML的概念模型 2.UML概念模型图例 三.UML的基本构造块 1.UML中的事物 (1)UML中的四种事物 (2)UML中各种事 ...
- 校园兼职网站php设计,基于PHP+MySql的校园兼职信息平台的开发浅谈
Data Base Technique 0数据库技术基于PHP+MySqI的校园兼职信息平台的开发浅谈文刘晓智1杨雨锋2李万星2 表1:数据库一蹬表 摘要 首光简要介绍了编程语孬和MySql数据库的主 ...
- 计算机与昆虫关系的论文,浅谈昆虫与人类的关系.doc
浅谈昆虫与人类的关系.doc 浅谈昆虫与人类的关系 班级:生物科学师范 姓名:李杰 学号:2012221107110076 摘要:昆虫为全世界增添光彩,让声音更加多样化,然而随着人类活动的增加,昆虫的 ...
- 简述相关与回归分析的关系_浅谈相关分析与回归分析的关系
浅谈相关分析与回归分析的关系 郝依寒 [期刊名称] <数字通信世界> [年 ( 卷 ), 期] 2018(000)004 [摘要] 本文以回归分析及回归分析的应用为对象做出简要论述 , 通 ...
- 项目开发一般流程、入职流程、尚学堂OA项目01_基础环境搭建、人事管理模块搭建、Servlet的高级封装
项目开发一般流程.入职流程.尚学堂OA项目01 1. 项目开发的一般流程 2. 入职时工作的一般流程 3. 尚学堂办公自动化系统/OA 3.1 项目介绍 3.2 项目资料 3.3 项目开发 3.3.1 ...
最新文章
- Python 怎么样在函数内部对全局变量进行修改
- Spring MVC集成Tiles使用方法
- 常用WebService一览表(一)
- 大同语网站页面资料汇总编书(PDF)
- rust能捏人不_不跟风出游的五一假期,武汉人到底能去哪
- ORACLE数据库测试题(一)
- Spoj REPEATS 后缀自动机+set
- CDA LEVEL I 数据分析认证考试模拟题库(一)
- libcef(二)基于VS2019编写CEF简单样例
- 拍摄须知ISO、快门、光圈、曝光概念
- 引入第三方sdk错误提示
- programming collective intelligence 读书笔记(一):配置eclipse+pydev环境,运行delicious模块
- 词袋 图像检索 matlab,词袋模型BoW图像检索Python实战
- 03 大数据hadoop发展简史及环境安装
- SDN控制器究竟在干啥?
- 自动记账解析之基本概念
- 大图中找小图(根据图片定位)
- 神舟战神TX8R9和TX9R7区别对比评测
- 安科瑞抗晃电产品在河北某化工项目的应用
- MATlAB运用——数值积分