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

简介:

阅读目录:

  • 1.开篇介绍

  • 2.使用委托消除函数串联调用

    • 2.1.使用委托工厂转换两个独立层面的对象


  • 3.多态入口(面向对象继承体系是可被扩展的)

  • 4.多态的受保护方法的单元测试(Protected成员的单元测试)

1】开篇介绍

一如既往,这篇文章是我最近在工作中总结出的一点小小的经验,特此写出来与大家分享,因为我觉得日常开发中这些点点滴滴很有用;

2】使用委托消除函数串联调用

在一般的函数调用情况下,我们都习惯性的将参数传入到某个被调用的方法,这可能就是我们考虑调用方法的惯用思维,但是现在的C#语言得到了很大的提升,我们可以很自然的使用委托来减少函数之间的参数依赖;有时候会经常看见一个函数的内部逻辑并没有使用到传入的某个参数,而传入的真正目的是为了再传入到本函数需要调用的另外一个函数中去;

图1:

201944747.jpg

这个时候我们可以试着使用委托来封装调用的方法,然后将委托实例传入到第一层使用的函数中去,当然要分清使用场景,不是所有的场景都合适;

图2:

202008525.jpg

当然需要平衡好这里的内联变量ProductContent,如果可以的话尽量将委托放入到专门创建委托的委托工厂中去,这样方便全局管理,甚至进一步抽象就可以将委托移除程序硬编码到配置文件;

2.1】使用委托工厂转换两个独立层面的对象

一般情况下,我们在应用层会通过数据访问层的代码获取到数据源中的对应数据实体,然后将其进行DomainModel话,只有这样我们才能使用到面向对象的强大功能;这个时候我们只需将创建DomainModel的委托工厂构造好,然后作为参数传入到数据访问接口中去;由于应用层是全局协调层,它可以去完成多层之间的协调操作,所以对于应用层的设计可以尽量饱满一点,而不是很简单的一个静态方法集合,这样就会使得Application Layer很薄;

3】多态入口(面向对象继承体系是可以被扩展的)

很多时候我们在设计一个框架的时候我们都会注意对象的继承体系,但是我们基本上都没有为这些内部对象留有对外的扩展入口;现假设你有一个框架内部的类XmlConvert,该类被XmlConvertSetting全局静态类引用着,如果不能通过XmlConvertSetting对XmlConvert进行设置,就无法使用到XmlConvert的所有对外提供的扩展方法;

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
[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;其实提到单元测试,冥冥之中总觉得它与面向对象有着一脉相承的感觉,甚至单元测试、重构、面向对象都会起到互补的作用;

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




 本文转自 王清培 51CTO博客,原文链接:http://blog.51cto.com/wangqingpei557/1329246,如需转载请自行联系原作者


相关文章
|
16天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
2月前
|
存储 开发框架 NoSQL
ASP.NET WEB——项目中Cookie与Session的用法
ASP.NET WEB——项目中Cookie与Session的用法
36 0
|
2月前
|
开发框架 前端开发 .NET
ASP.NET WEB——项目创建与文件上传操作
ASP.NET WEB——项目创建与文件上传操作
46 0
|
3月前
|
监控 安全 测试技术
从开发到测试再到发布,全方位解析项目上线的完美路程!
从开发到测试再到发布,全方位解析项目上线的完美路程!
123 0
|
3月前
|
开发框架 安全 .NET
IIS服务器发布ASP.NET项目
对于云服务器,程序员一般不会陌生,如果项目需要发布到现网,那么服务器是必不可缺的一项硬性条件,那么如何在云服务器上部署一个项目,需要做哪些配置准备,下面就由本文档为大家讲解,本篇以IIS服务器发布ASP.NET项目为例。
47 1
|
4月前
|
移动开发 前端开发 JavaScript
VSCode设置类似Webstorm那样可以用本地局域网IP地址访问自己开发的测试项目,vs code 前端如何以服务器模式打开?
VSCode设置类似Webstorm那样可以用本地局域网IP地址访问自己开发的测试项目,vs code 前端如何以服务器模式打开?
VSCode设置类似Webstorm那样可以用本地局域网IP地址访问自己开发的测试项目,vs code 前端如何以服务器模式打开?
|
3月前
|
存储 Rust 测试技术
【一起学Rust · 项目实战】命令行IO项目minigrep——测试驱动开发完善功能
【一起学Rust · 项目实战】命令行IO项目minigrep——测试驱动开发完善功能
94 0
|
1月前
|
Java
java面向对象高级分层实例_测试类(main方法所在的类)
java面向对象高级分层实例_测试类(main方法所在的类)
10 1
|
1月前
|
Java PHP 数据库
在护卫神上部署javaWeb项目,已经测试通过
在护卫神上部署javaWeb项目,已经测试通过
10 0
|
1月前
|
存储 开发框架 安全
C# .NET面试系列二:面向对象
<h2>面向对象 #### 1. 什么是构造函数? 构造函数(Constructor)是一种特殊类型的方法,它在创建类的实例(对象)时被调用,用于初始化对象的状态。构造函数的名称必须与包含它的类的名称相同,并且没有返回类型。 主要特点和用途包括: 初始化对象: ```c# 构造函数主要用于初始化类的实例。当使用 new 关键字创建类的对象时,构造函数会被调用,确保对象在使用之前处于一个合适的状态。 ``` 与类同名: ``` 构造函数的名称必须与包含它的类的名称完全相同。 ``` 没有返回类型: ```c# 构造函数没有返回类型,甚至不能声明 void。它的目的是初始化对象
48 0