测量小百科 | 面向对象的编程方法(二)
来源: | 作者:JYTEK | 发布时间: 2020-07-15 | 447 次浏览 | 分享到:
全文字数2300 | 阅读需要4分钟

关键词:编程、面向对象、C#、.NET、OOP

导读

面向对象编程是面向对象思想在程序编写层面的实践,使用该思想可以将系统的复杂度层层分解,极大简化代码层面的开发问题。熟悉面向过程编程方式的开发人员经常会在面向对象的语言中使用面向过程的方式实现功能,未能将面向对象编程的优势体现到代码中,本文将使用一个例子简单演示面向对象编程的使用方法,分别就面向对象的三个特性的使用方法进行说明。本文最后将简单介绍关于设计模式和面向对象设计的相关内容。


一个面向对象编程的例子

使用面向对象编程的方法设计一个简单的商品管理和交易系统,需要支持商品的属性维护、订单的创建、确认、撤销等操作。


定义数据类

首先对该系统中涉及到的数据对象进行封装。系统中涉及到的数据对象主要是商品类、订单类,分别用来保存不同商品的属性信息和某个具体订单的信息。

基于商品应该具备的属性定义如下表,同时因为商品类涉及到售出了入库的操作,所以在商品类中额外定义了Sell(售出)和PutIn(入库)方法。


商品类的代码实现如下图所示,Sell方法中对订单状态和售出数量做了有效性监测。


基于订单的业务,订单类的属性定义如下(不考虑单次购买买多件商品),因为订单还涉及到确认和撤销的操作,所以在Order类中定义了Acknowledge(确认)和Cancel(取消)两个方法。


订单类的代码实现如下图所示。


Acknowledge和Cancel方法的定义如下,两个方法分别对订单状态进行了有效性检查。


类的方法已经定义好,我们可以使用这些类进行简单的商品维护和订单创建撤销操作。一个简单的订单创建和取消的范例如下:


订单1被提交,订单2被取消,最终执行的结果如下图所示


通过以上的简单范例可以发现使用封装,可以将各自的业务细节封装到类的内部,对外只开放最小可用的接口,保证了类的使用简洁明了。同时因为类的功能非常单一,所以出现问题可以快速定位到具体的位置,降低了后期维护的复杂度。

使用计算类

在上面的例子中每个订单的总价格是通过外部计算传入order的构造方法中的,但是在订单的业务场景下这种方法是不可行的,因为不同的订单可能会使用完全不同的计价策略,例如折扣、根据订单数量的阶梯单价等。因为订单总价的计算在订单系统的业务中是一个会持续不断更新的部分,所以这里需要使用易于后期扩展的接口来实现。

针对计算类定义的接口如下所示:



该接口只有一个计算的方法,输入个数和产品原单价,返回产品总价。基于此接口分别创建几个采用不同计算策略的计算类,分别如下:

  • 普通订单价格计算类:单价乘以个数。


  • 折扣订单价格计算类:单价乘以个数乘以折扣。


  • 阶梯订单价格计算类:按照个数匹配对应的阶梯的折扣,然后乘以单价乘以个数。


Order的构造方法中修改传入订单价格计算类,如下图所示,在构造方法中调用接口的方法计算出最终结果。


下面将就几个计算类进行分别测试,代码如下。有三个订单,分别使用NormalCalculator、DiscountCalculator、StepwiseCalculator,其中StepwiseCalculator有三个阶梯,三个订单购买数量分别为5、10、30。


该测试程序的运行结果如下图所示:


通过以上的例子可以发现通过继承和多态,可以将复杂的可能变化的部分抽离出系统整体逻辑之外,使用接口提供统一的使用方式,将复杂的多样的实现方式封装到接口以外,简化调用者的使用。

系统的继续优化

该系统仅用于演示面向对象的编程方法,其设计目前仍然较为粗糙,可优化的点包括且不限于以下几点:

  • 商品类较多时需要商品管理类进行维护

  • 订单生成类接口过于复杂,可以使用订单生成类代为生成,且订单生成类可能是容易变更的模块,所以需要考虑使用接口或抽象类实现。

  • 订单计算类的创建较为复杂,不同类型的计算类构造方法接口不同,可以考虑使用抽象工厂模式优化。

  • 商品类和订单类等信息需要持久化,可以考虑使用.NET提供的ORM(例如EntityFramework等)将商品类和订单类持久化到相关的数据库中。

  • 目前订单类的处理中未实现事务化管理,在执行过程中可能因为软件的错误、硬件的失效导致出现脏数据。

感兴趣的读者可以就这个例子的后续优化进行展开。

设计模式

设计模式是面向对象的应用开发中经常使用到的方法,其概念是1990年代Erich Gamma在书中最早提出的,整理了23个在面向对象应用设计中常用的设计方法,用于解决面向对象编程过程中会遇到的对象创建、代码结构组织、行为模式设计的问题,软件设计中最常用到的设计模式包括:

  • 对象创建:简单工厂、工厂方法、抽象工厂、原型模式、单例模式。

  • 代码结构组织:装饰模式、适配器模式、代理模式、组合模式。

  • 行为模式:模板方法、观察者模式、策略模式、职责链模式。

设计模式本身仍是基于面向对象三特性以上的演绎和发展,设计模式不是“银弹”,只有在最适合的场景才能发挥出本身的优势。设计模式解决的问题和详细的设计方式本文将不再展开,有兴趣的读者可以自行参阅设计模式相关的资料和书籍。

面向对象设计

面向对象的思想在软件架构设计领域的应用也已经在实践多年,即面向对象设计(OOD)。面向对象设计中提出了很多思想和准则,例如单一职责、开-闭原则、里氏替换、控制反转(IOC)、接口隔离、迪米特法则等软件设计思想。这些思想和准则可以让软件架构的设计更简洁高效;让软件的代码层面逻辑明确清晰;让软件的后续维护和扩展更加容易和稳定。面向对象设计时比面向对象编程抽象层次更高的实践,感兴趣的读者可以参考面向对象设计的相关文档和书籍。


文中出现的完整范例程序下载链接

参考

  1. Inheritance in C# and .NET

  2. C# language specification

  3. 面向对象的设计思想

  4. 设计模式