一次成功的重构实践3 - 抽象的艺术

一次成功的重构实践3 - 抽象的艺术

黄国强 2019/2/7

       抽象能力的培养非常重要。所谓抽象即抓住事物的本质规律,透过现象看本质。一个程序员工作多年,写代码的技术都会掌握。但是如果想做架构,缺乏抽象能力是不行的。
       这就好比工匠和艺术家,前者只能做到是技艺纯熟,不断重复自己。艺术家往往可以表达人类普遍情感,探索客观世界的规律。比如,物理学上补色原理就是印象派画家最先发现并运用到他们的作品中。
       回到编程,看一个具体的例子。
       设备里用到了多种IO控制卡,控制卡负责读取传感器输入信号并输出信号控制设备动作。下面分别是三个控制卡的API。

// 控制卡1的输入输出函数
EXPORTS void   CALLBACK PIODIO_OutputWord(DWORD wPortAddress, DWORD wOutData);
EXPORTS void   CALLBACK PIODIO_OutputByte(DWORD wPortAddr, WORD bOutputValue);
EXPORTS DWORD  CALLBACK PIODIO_InputWord(DWORD wPortAddress);
EXPORTS WORD   CALLBACK PIODIO_InputByte(DWORD wPortAddr);
// 控制卡2的输入输出函数
EXPORTS WORD   CALLBACK FRB_SendSA(WORD wPort, WORD SAn, WORD wOutputData);
EXPORTS WORD   CALLBACK FRB_ReceiveRA(WORD wPort, WORD RAn, WORD *wInputData);
EXPORTS WORD   CALLBACK FRB_ReadRAStatus(WORD wPort,BYTE *bRAStatus);
// 控制卡3的输入输出函数
short __stdcall ps400_get_FRnet_DI
    (
    BYTE bCardID,			/* the specific Card ID that is configured by onboard DIP-switch */
		WORD wSA,				/* Group Address FRNET_SA8 ~ FRNET_SA15 */
		WORD *pStatus,			/* the pointer to the FRnet DI status */
		WORD wEnableDirectAccess = FRNET_ENABLE_DIRECT_ACCESS /* FRNET_ENABLE_DIRECT_ACCESS/FRNET_DISABLE_DIRECT_ACCESS, access the DI module directly, or read the stored status in driver */
		);

short __stdcall ps400_set_FRnet_DO
    (
    BYTE bCardID,			/* the specific Card ID that is configured by onboard DIP-switch */
		WORD wRA,				/* Group Address FRNET_RA0 ~ FRNET_RA7 */
		WORD wDOData			/* the data to DO module */
		);

       很明显,三个API完全不同,任何其他模块如果用到IO,并直接使用这些API的话,将不可避免地导致这些代码不可移植,换IO卡必须重写这些代码,这很无聊。而且类似模块如果很多的话,工作量也很大。
       因而这里我们需要抽象,我们认为世界上只有标准的IO卡,这个IO卡包含下面几个函数。

// 从众多不同的IO卡提炼出以下三个基本函数成为类成员
    void BitOn(const WORD, const WORD, const WORD, const BOOL);     // 输出ON信号
    void BitOff(const WORD, const WORD, const WORD, const BOOL);    // 输出OFF信号
    bool Bits(const WORD, const WORD, const WORD, const BOOL);      // 查询当前IO状态

       问题来了,这些函数怎么获得呢?这里加重点:要从软件用户的角度,获得得到这些函数。以气缸为例,对于用户来说,客户只关心如何打开气缸、如何关闭气缸以及当前是关还是开的状态。所以这个IO卡抽象出这个三个函数是正确的。如果站错了角度,你抽象出的函数根本就是不对的。
       我们把真实的IO卡适配到这个标准卡,达到设计模式里所提到到的“抽象与实现分离”的目的。架构师的工作就是不断发掘系统里形形色色的类和函数,把抽象出一个又一个与具体实现无关的类放到领域层中。那么领域层到底是什么?卖个关子,以后再写。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

acloud_csu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值