阅读目录:

  • 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的所有对外提供的扩展方法;

1 public class XmlConvert
2    {
3        protected virtual string ConvertReplace(StringBuilder NodeString)
4        {
5            return NodeString.ToString().Replace("XXX", "LLL");
6        }
7    }

有一个很简单的XmlConvert类,是框架内部使用的,现在它提供了一个Virtual方法ConvertReplace,我们想使用这个框架内部的类进行扩展;

1 public class CustomerXmlConvert : XmlConvert
2 {
3     protected override string ConvertReplace(StringBuilder NodeString)
4     {
5         return base.ConvertReplace(NodeString).Replace("JJJ", "AAA");
6     }
7 }

但是如果未能提供给我们一个多态入口,我们这个自定义的CustomerXmlConvert无法起作用;最近发现很多自定义的框架设计上就有这个问题,留有了扩展的类型和相应的方法,但是无法插入到框架内部去,所以特此分享一下;

4】多态的受保护方法的单元测试

受保护方法的单元测试一直都不太好解决,但是我们可以通过简单的继承方式来轻松的处理,就拿上面提到的XmlConvert类来举例;

1 public class XmlConvert
2 {
3     protected virtual string ConvertReplace(StringBuilder NodeString)
4     {
5         return NodeString.ToString().Replace("XXX", "LLL");
6     }
7 }

如果我们想测试它,直接使用类型继承就可以:

 1 [TestClass]
 2 public class XmlConvertTests : XmlConvert
 3 {
 4     [TestMethod]
 5     public void XmlConvert_ConvertReplace_Normal()
 6     {
 7         StringBuilder testData = new StringBuilder("XXXJJJ");
 8         string testResult = this.ConvertReplace(testData);
 9         Assert.AreEqual(testResult, "JJJ");
10     }
11 }

这里有一个很好的设计启发就是将方法碎片化尽量保持有返回值的操作,这样很好的进行Assert;其实提到单元测试,冥冥之中总觉得它与面向对象有着一脉相承的感觉,甚至单元测试、重构、面向对象都会起到互补的作用;

内容不多,只是简单的项目小小的总结,希望对大家有用,谢谢;

作者:王清培

出处:http://www.cnblogs.com/wangiqngpei557/

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

转载于:https://www.cnblogs.com/wangiqngpei557/p/3434231.html

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

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

    阅读目录: 1.开篇介绍 2.使用委托消除函数串联调用 2.1.使用委托工厂转换两个独立层面的对象 3.多态入口(面向对象继承体系是可被扩展的) 4.多态的受保护方法的单元测试(Protected成员 ...

  2. unity 项目开发——浅谈设计模式的六大原则(一)

    目录 前言 首先,六大原则是谁? 其次,为什么需要学习这六大原则? 正文 一.单一职责原则 示例: 因此我们需要进行拆分,根据具体的职能可将其具体拆分如下: Unity 单一职责原则 二.开闭原则 U ...

  3. Hubble A/B test平台前端项目开发浅谈

    前言 现在Hubble abtest平台已经正式上线了,至于技术实现方案我在其中一篇文章做了一些分享(查看react技术栈实践),本文主要分享下一些开发过程中的遇到问题思考总结,以及简单介绍下我们平台 ...

  4. 【c++开篇】浅谈面向对象与面向过程(举例说明)

    浅谈面向对象与面向过程 前言:刚接触C++第一时间,都会经常听到这样一话:C语言面向过程,C++面向对象.在老师模拟面试时,问道你对面向对象与面向过程的认识时,我有点懵答的不是很完整,刚好C++开篇写 ...

  5. 『软件工程13』浅谈面向对象方法,统一建模语言UML

    浅谈面向对象方法UML 一.UML的含义 二.UML的主要内容 1.UML的概念模型 2.UML概念模型图例 三.UML的基本构造块 1.UML中的事物 (1)UML中的四种事物 (2)UML中各种事 ...

  6. 校园兼职网站php设计,基于PHP+MySql的校园兼职信息平台的开发浅谈

    Data Base Technique 0数据库技术基于PHP+MySqI的校园兼职信息平台的开发浅谈文刘晓智1杨雨锋2李万星2 表1:数据库一蹬表 摘要 首光简要介绍了编程语孬和MySql数据库的主 ...

  7. 计算机与昆虫关系的论文,浅谈昆虫与人类的关系.doc

    浅谈昆虫与人类的关系.doc 浅谈昆虫与人类的关系 班级:生物科学师范 姓名:李杰 学号:2012221107110076 摘要:昆虫为全世界增添光彩,让声音更加多样化,然而随着人类活动的增加,昆虫的 ...

  8. 简述相关与回归分析的关系_浅谈相关分析与回归分析的关系

    浅谈相关分析与回归分析的关系 郝依寒 [期刊名称] <数字通信世界> [年 ( 卷 ), 期] 2018(000)004 [摘要] 本文以回归分析及回归分析的应用为对象做出简要论述 , 通 ...

  9. 项目开发一般流程、入职流程、尚学堂OA项目01_基础环境搭建、人事管理模块搭建、Servlet的高级封装

    项目开发一般流程.入职流程.尚学堂OA项目01 1. 项目开发的一般流程 2. 入职时工作的一般流程 3. 尚学堂办公自动化系统/OA 3.1 项目介绍 3.2 项目资料 3.3 项目开发 3.3.1 ...

最新文章

  1. php array_merge内存不够,php array_merge函数使用需要注意的一个问题
  2. c语言一段字符加密,请问C语言怎么实现对一长串字符进行MD5加密?
  3. (八十二)利用苹果服务器获取导航信息和绘制路径
  4. 大剑无锋之简单说一下聚簇索引和非聚簇索引?【面试推荐】
  5. Intel OpenCL + Ubuntu安装
  6. 世界卫生组织高血压防治指南_建立对团队和组织的信任的指南
  7. 零基础学python数据分析_Python学习指南:使用Python学习数据分析
  8. redis远程连接超时
  9. BZOJ2007 NOI2010 海拔 网络流+最短路
  10. 浅谈C语言字符串结束符'\0'
  11. 现代 JavaScript 教程
  12. vant + Vue创建项目全过程
  13. LOST1-Linux远程控制工具
  14. ESP32 HTTP Client接口使用
  15. 查找大于某个数的最小数
  16. 正在解析主机 失败:未知的名称或服务。 wget: 无法解析主机地址
  17. 东莞dell服务器维修怎么样,看看大牌戴尔服务器 r410的维修,是设计缺陷吗
  18. 2019年工作总结——没有岁月可回首,珍惜当下不负流年
  19. C语言,练习8.9 n*n阶矩阵对角线元素之和
  20. 梯形波的傅里叶级数分解

热门文章

  1. 了解语音合成系统WORLD(日语)(译)
  2. endnote使用心得
  3. 阿里大数据打假:实时分析数据每秒1亿次
  4. 网页设计者不应错过的帖子
  5. 计算机应用基础无纸化考试题目,《计算机应用基础》自考计算机无纸化考试 模拟试题...
  6. joomla本地安装全过程
  7. bootstrap tips
  8. [校内模拟]为了部落
  9. 非自交多边形的轮廓内缩外扩算法
  10. Ubuntu16.04安装国际版QQ教程