阅读目录:

  • 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://www.cnblogs.com/wangiqngpei557/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

.NET项目开发—浅谈面向对象的纵横向关系、多态入口,单元测试(项目小结)的更多相关文章

  1. .NET项目开发—浅谈面向接口编程、可测试性、单元测试、迭代重构(项目小结)

    阅读目录: 1.开篇介绍 2.迭代测试.重构(强制性面向接口编程,要求代码具有可测试性) 2.1.面向接口编程的两个设计误区 2.1.1.接口的依赖倒置 2.1.2.接口对实体的抽象 2.2.迭代单元 ...

  2. Android开发-浅谈架构(二)

    写在前面的话 我记得有一期罗胖的<罗辑思维>中他提到 我们在这个碎片化 充满焦虑的时代该怎么学习--用30%的时间 了解70%该领域的知识然后迅速转移芳草鲜美的地方 像游牧民族那样.原话应 ...

  3. python进阶_浅谈面向对象进阶

    python进阶_浅谈面向对象进阶 学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass  class F ...

  4. Python测试开发-浅谈如何自动化生成测试脚本

    Python测试开发-浅谈如何自动化生成测试脚本 原创: fin  测试开发社区  前天 阅读文本大概需要 6.66 分钟. 一 .接口列表展示,并选择 在右边,点击选择要关联的接口,区分是否要登录, ...

  5. springboot开发浅谈 2021/05/11

    学习了这么久,本人希望有时间能分享一下,这才写下这篇浅谈,谈谈软件,散散心情. 这是本人的博客园账号,欢迎关注,一起学习. 一开始学习springboot,看了好多网站,搜了好多课程.零零落落学了一些 ...

  6. 九,微信小程序开发浅谈

    最近在帮朋友做一款微信小程序(后面统称为小程序),有简单的交互,以及分享和支付功能.下面就简单的对小程序开发做一个简单的介绍,希望可以帮助大家!!! 当前的小程序我们是在windows系统里开发的,如 ...

  7. JAVAEE企业级应用开发浅谈之MVC 中的V-VIEW视图

    Step1.情景概要 Hello,小伙伴们,好久不见,之前跟大家分享了三层架构与MVC思想,相信大家对于这两块内容有了相对清晰的个人认识了,既然我们讲到了MVC,这里我们接着这块内容继续往下深入,今天 ...

  8. JAVAEE企业级应用开发浅谈第一辑

    不积跬步无以至千里,不积小流无以成江海 Step1.情景概要 作为一个JAVA WEB 开发人员,在开发web 项目时项目大家都有自己的一些新的体会,对于web 开发出现的一些比较经典的名词大家都会有 ...

  9. Java系列1 -- 浅谈面向对象

    也许每一个计算机专业的人,在大学学习java的时候,老师开始时都会说这么一句话,"Java是一门面向对象的语言".那么面向对象到底是什么,他有什么好处,或者他比其他流行的语言C/C ...

随机推荐

  1. 软件工程-构建之法 理解C#一小段程序

    一.前言 老师给出的要求: 阅读下面程序,请回答如下问题: 问题1:这个程序要找的是符合什么条件的数? 问题2:这样的数存在么?符合这一条件的最小的数是什么? 问题3:在电脑上运行这一程序,你估计多长 ...

  2. SQL之收集SQL Server线程等待信息

    要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据. sys.dm_os_wait_ ...

  3. git版本回退, github版本回退

    上周提交了更改,过了周末回来说要撤销上个story.于是,需要找到上周提交的版本,rollback回来. git版本管理命令,自从习惯使用管理工具之后就很少接触了,当突然寻找其他指令的时候就成浆糊了, ...

  4. linux源码分析(三)-start_kernel

    前置:这里使用的linux版本是4.8,x86体系. start_kernel是过了引导阶段,进入到了内核启动阶段的入口.函数在init/main.c中. set_task_stack_end_mag ...

  5. 第一篇:Entity Framework 简介

    先从ORM说起吧,很多年前,由于.NET的开源组件不像现在这样发达,更别说一个开源的ORM框架,出于项目需要,以及当时OOP兴起(总不至于,在项目里面全是SQL语句),就自己开始写ORM框架.要开发O ...

  6. C#File类常用的文件操作方法(创建、移动、删除、复制等)

    File类,是一个静态类,主要是来提供一些函数库用的.静态实用类,提供了很多静态的方法,支持对文件的基本操作,包括创建,拷贝,移动,删除和 打开一个文件. File类方法的参量很多时候都是路径path ...

  7. h5输入框提示语 + 正常文本框提示语

    <input id="username" name="username" type="text" placeholder=" ...

  8. jquery css事件编程 位置 操作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. JAVA 链表操作:循环链表

    主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...

  10. 【HTML5&CSS3进阶学习01】气泡组件的实现

    前言 气泡组件在实际工作中非常普遍,无论是网页中还是app中,比如: 我们这里所谓气泡组件是指列表型气泡组件,这里就其dom实现,css实现,js实现做一个讨论,最后对一些细节点做一些说明,希望对各位 ...