.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;其实提到单元测试,冥冥之中总觉得它与面向对象有着一脉相承的感觉,甚至单元测试、重构、面向对象都会起到互补的作用;
内容不多,只是简单的项目小小的总结,希望对大家有用,谢谢;
.NET项目开发—浅谈面向对象的纵横向关系、多态入口,单元测试(项目小结)的更多相关文章
- .NET项目开发—浅谈面向接口编程、可测试性、单元测试、迭代重构(项目小结)
阅读目录: 1.开篇介绍 2.迭代测试.重构(强制性面向接口编程,要求代码具有可测试性) 2.1.面向接口编程的两个设计误区 2.1.1.接口的依赖倒置 2.1.2.接口对实体的抽象 2.2.迭代单元 ...
- Android开发-浅谈架构(二)
写在前面的话 我记得有一期罗胖的<罗辑思维>中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样.原话应 ...
- python进阶_浅谈面向对象进阶
python进阶_浅谈面向对象进阶 学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass class F ...
- Python测试开发-浅谈如何自动化生成测试脚本
Python测试开发-浅谈如何自动化生成测试脚本 原创: fin 测试开发社区 前天 阅读文本大概需要 6.66 分钟. 一 .接口列表展示,并选择 在右边,点击选择要关联的接口,区分是否要登录, ...
- springboot开发浅谈 2021/05/11
学习了这么久,本人希望有时间能分享一下,这才写下这篇浅谈,谈谈软件,散散心情. 这是本人的博客园账号,欢迎关注,一起学习. 一开始学习springboot,看了好多网站,搜了好多课程.零零落落学了一些 ...
- 九,微信小程序开发浅谈
最近在帮朋友做一款微信小程序(后面统称为小程序),有简单的交互,以及分享和支付功能.下面就简单的对小程序开发做一个简单的介绍,希望可以帮助大家!!! 当前的小程序我们是在windows系统里开发的,如 ...
- JAVAEE企业级应用开发浅谈之MVC 中的V-VIEW视图
Step1.情景概要 Hello,小伙伴们,好久不见,之前跟大家分享了三层架构与MVC思想,相信大家对于这两块内容有了相对清晰的个人认识了,既然我们讲到了MVC,这里我们接着这块内容继续往下深入,今天 ...
- JAVAEE企业级应用开发浅谈第一辑
不积跬步无以至千里,不积小流无以成江海 Step1.情景概要 作为一个JAVA WEB 开发人员,在开发web 项目时项目大家都有自己的一些新的体会,对于web 开发出现的一些比较经典的名词大家都会有 ...
- Java系列1 -- 浅谈面向对象
也许每一个计算机专业的人,在大学学习java的时候,老师开始时都会说这么一句话,"Java是一门面向对象的语言".那么面向对象到底是什么,他有什么好处,或者他比其他流行的语言C/C ...
随机推荐
- ListView中的数据表格写入Excel中
SaveFileDialog sfd = new SaveFileDialog(); sfd.DefaultExt = "xls"; sfd.Filter = "Exce ...
- 数据库join方式分析
前言 不管是博客园还是CSDN,看到很多朋友对数据库的理解.认识还是没有突破一个瓶颈 ,而这个瓶颈往往只是一层窗纸,越过了你将看到一个新世界. 04.05年做项目的时候,用SQL Serv ...
- PHP连接SQL Server相关配置及说明
关于php怎么连接数据库,大家肯定有不同的看法,有的用wamp,有的用xamp,他们都是集成环境,方便操作.但有时,数据库的类型不同,要连接不同的数据库.今天和大家分享一下如何连接sql2000,服 ...
- PHP中常见魔术方法解析
<?php class info { private $province; //省 public $city; //城市 private $myname; //姓名 //__construct( ...
- OracleSugar ORM框架的诞生,代码开源
经过四天的努力终于将SqlSugar ORM 成功支持ORACLE数据库 优点: 1.高性能,达到原生最高水准,比SqlHelper性能要高,比Dapper快30% 比EF快50% 2.支持多种数据库 ...
- do{...}while(0)的妙用
在学习第一门编程语言时,就已经介绍了顺序分支.条件分支.循环分支.比如循环分支有for.while.do-while语句.在随后的学校及工作中,如果手工循环一般使用for.while,很少使用do-w ...
- Visual Studio 2008 Package Load Failure:未能正确加载包“Microsoft.VisualStudio.Xaml”
在安装好Visual Studio 2008后,启动Visual Studio 2008 发现如下提示: 包加载失败 未能正确加载包“Microsoft.VisualStudio.Xaml”( GUI ...
- JS检查是否支持Storage
查看效果:http://hovertree.com/code/html5/q69kvsi6.htm 代码: <!DOCTYPE html> <html> <head> ...
- .Net中的并行编程-2.ConcurrentStack的实现与分析
在上篇文章<.net中的并行编程-1.基础知识>中列出了在.net进行多核或并行编程中需要的基础知识,今天就来分析在基础知识树中一个比较简单常用的并发数据结构--.net类库中无锁栈的实现 ...
- 簡單工廠模式-之-什麼是產品線 And 抽象工廠模式-之-什麼是產品族
簡單工廠模式-之-什麼是產品線 簡單工廠模式中,有一個概念就是使用了多層次的產品結構,那麼什麼是產品結構或者說什麼是產品線? 假定我們有一個基準的產品標準Product,那麼所有繼承該基類或者傳遞基類 ...