0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

解析编程艺术之策略与机制相分离

开关电源芯片 来源:极客重生 作者:极客重生 2021-08-26 18:03 次阅读

在现代操作系统的结构设计中,经常利用“机制与策略分离”的原理来构造OS结构。所谓机制,是指实现某一功能的具体执行机构。

而策略,则是在机制基础上,借助于某些参数算法来实现该功能的优化,或达到不同的功能目标。通常,机制处于一个系统的基层,而策略则处于系统的高层。

在程序设计中,机制与策略分离的思想可以提高程序的可复用性,可维护性和可调试性使程序更具有高内聚低耦合性。如果说机制是砖,那么策略就是房子,同样的砖可以建不同的房子,我们不能把建砖和建房子混在一起实现。

策略的变化要远远大于机制的变化。将两者分离,可以使机制相对保持稳定,而同时支持策略的变化。

在代码大全中提到“隔离变化”的概念,以及设计模式中提到的将易变化的部分和不易变化的部分分离也是这个思路。

在《Unix编程艺术》第一章就深刻讨论这个编程哲学:“在我们对 Unix 错误的讨论中,我们观察到 X window的设计者做出了一个基本决定来实现“机制,而不是策略” —— 使 X 成为一个通用的图形引擎,并将有关用户界面风格的决定留给工具包和其他级别的系统。我们通过指出政策和机制倾向于在不同的时间尺度上发生变异来证明这一点,政策的变化比机制快得多,GUI 工具包的外观和感觉上的时尚可能来来去去,但光栅操作和合成是永恒的。

因此,将策略和机制硬连接在一起会产生两个负面影响:它使策略变得僵化并且更难以响应用户需求而改变,这意味着试图改变策略有很强的破坏机制稳定的倾向。

另一方面,通过将两者分开,我们可以在不破坏机制的情况下试验新策略。我们还使为机制编写好的测试变得更加容易。

实现这种分离的一种方法是,例如,将应用程序编写为由嵌入式脚本语言驱动的 C服务例程库,应用程序控制流是用脚本语言而不是 C 编写的。这种模式是Emacs编辑器,它使用嵌入式 Lisp解释器来控制用 C 编写的编辑原语。

另一种方法是将您的应用程序分成协作的前端和后端进程,这些进程通过套接字上的专用应用程序协议进行通信;前端执行策略,后端实现机制。这样的全局复杂性通常远低于实现相同功能的单进程单体的复杂性,从而减少您对错误的脆弱性并降低生命周期成本(提高健壮性)。”

一些例子GUI框架

MVC(Model-View-Controller)作为最经典的GUI架构,MVC模式的核心思想是数据层(Domain)与表现层(Presentation)的隔离。

模型(Model) 用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“ Model ”有对数据直接访问的权力,例如对数据库的访问。“Model”不依赖“View”和“Controller”,也就是说, Model 不关心它会被如何显示或是如何被操作。但是 Model 中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此 Model 的 View 必须事先在此 Model 上注册,从而,View 可以了解在数据 Model 上发生的改变。

视图(View)能够实现数据有目的的显示(理论上,这不是必需的)。在 View 中一般没有程序上的逻辑。为了实现 View 上的刷新功能,View 需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册。

控制器(Controller)起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据 Model 上的改变。

View,Model属于策略,在系统中属于可变部分,Controller属于机制,不会随着view的变化而变化,属于系统中不变的部分,构建一个系统要尽肯能分离可变部分和不可变部分。

netfilter框架

netfilter框架是一个典型将机制和策略分离好例子:

Netfilter是一个设计良好的框架,之所以说它是一个框架是因为它提供了最基本的底层支撑,而对于实现的关注度却没有那么高,这种底层支撑实际上是5个HOOK点:

PREROUTING:数据包进入网络层路由前FORWARD:数据包路由之后确定要转发之后INPUT:数据包路由之后确定要本地接收之后OUTPUT:本地数据包发送POSTROUTING:数据包发出去之前

Netfilter拥有几乎无限的可扩展性, Liuux中使用的仅仅是它的一个很小的部分,大部分的内容作为可插拔的module处于待命状态Netfilter的机制集成在Linux内核中, 然而它的策略扩展却处于一个独立的空间,我们说这种所谓的机制也仅仅是5个HOOK点。

我们浏览netfilter.org就会知道,它里面融合了大量的策略,我们最熟悉的就是iptables了,上图的ebtables,arptables,nft也是Netfilter的扩展之一, 足以看出,Netfilter有多强大,内核仅仅给出钩子点而已, 如果你嫌某些不好,你可以自己实现一个更好的,事实上,Netfilter中有很多的东西并没有集成在Linux内核。

TCP拥塞控制框架

Linux系统中的TCP拥塞控制采用面向对象的设计思想,提供拥塞控制接口用于实现不同的拥塞控制策略,成功把拥塞控制解耦了:

内核实现BPF虚拟机执行核心引擎,属于机制部分;

用户态可以编写各种BPF程序,实现不同策略功能;

游戏引擎

游戏引擎便是专门为游戏而设计的工具及技术集成,之所以称为引擎,如同交通工具中的引擎,提供了最核心的技术部分--游戏机制,然后可以通过脚本语言或者关卡设计来插入策略逻辑,重用性是游戏引擎的一个重要设计目标,这样很多游戏开发都可以通过“换皮策略”来快速开发新游戏。

最后一些问题1、透过现象看本质,机制与策略到底是什么?为什么要将机制与策略分离?

机制可以认为是业务通用的核心模型(框架),不易变化;策略可以认为是某个功能的具体实现方案,可以被框架使用;机制与策略分离,是一种可扩展性设计的重要方法,提供一个继承接口,用于提供不同的实现,这也就是策略模式和接口隔离原则。机制关联一个抽象的策略(也就是接口),用不同的具体策略初始化抽象策略,就能调用具体策略的处理流程。

2、假如不分离,会出现什么问题?

把策略同机制揉成一团有两个负面影响:一来会使策略变得死板,难以适应用户需求的改变,二来也意味着任何策略的改变都极有可能动摇机制,对原来稳定的框架造成污染,引入风险。

所以我们在设计系统的时候,可以参考这种机制和策略模式,让系统具有更好的扩展性和更好的稳定性。

参考和扩展阅读https://web.archive.org/web/20050306210911/http://www.faqs.org/docs/artu/ch01s06.html#id2877777

https://qcc107.github.io/2015/09/01/UNIX%E7%BC%96%E7%A8%8B%E8%89%BA%E6%9C%AF%E4%B9%8B%E7%AD%96%E7%95%A5%E4%B8%8E%E6%9C%BA%E5%88%B6%E7%9B%B8%E5%88%86%E7%A6%BB/#:~:text=%E6%89%80%E8%B0%93%E6%9C%BA%E5%88%B6%EF%BC%8C%E6%98%AF%E6%8C%87%E5%AE%9E%E7%8E%B0,%E5%86%85%E8%81%9A%E4%BD%8E%E8%80%A6%E5%90%88%E6%80%A7%E3%80%82

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • WINDOWS
    +关注

    关注

    3

    文章

    3438

    浏览量

    87142
  • 程序
    +关注

    关注

    114

    文章

    3630

    浏览量

    79527
  • GUI
    GUI
    +关注

    关注

    3

    文章

    610

    浏览量

    38787

原文标题:深入理解编程艺术之策略与机制相分离

文章出处:【微信号:gh_3980db2283cd,微信公众号:开关电源芯片】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    解析EMI电磁干扰:原理、影响与应对策略

    深圳比创达电子|解析EMI电磁干扰:原理、影响与应对策略
    的头像 发表于 04-02 11:35 271次阅读
    <b class='flag-5'>解析</b>EMI电磁干扰:原理、影响与应对<b class='flag-5'>策略</b>

    EMI解析:影响、防护与应对策略

    EMI解析:影响、防护与应对策略?|深圳比创达电子EMC
    的头像 发表于 03-12 10:22 184次阅读
    EMI<b class='flag-5'>解析</b>:影响、防护与应对<b class='flag-5'>策略</b>?

    verilog与其他编程语言的接口机制

    Verilog是一种硬件描述语言,用于描述数字电路的行为和结构。与其他编程语言相比,Verilog具有与硬件紧密结合的特点,因此其接口机制也有一些与众不同之处。本文将详细介绍Verilog与其他编程
    的头像 发表于 02-23 10:22 199次阅读

    CP AUTOSAR信息安全机制全面解析

    这个模块一定是我们工程师最先接触到的AUTOSAR信息安全机制,主要用于ECU板级的安全通信。 大家应该有印象,在以往没有该机制,CAN通信通常是使用Checksum和RollingCounter来检验是否掉帧或者漏帧,并没有一个机制
    的头像 发表于 02-22 11:44 704次阅读
    CP AUTOSAR信息安全<b class='flag-5'>机制</b>全面<b class='flag-5'>解析</b>

    一种面向标识公共递归解析节点的数据安全加固策略

    摘要 :为解决工业互联网标识解析体系公共递归解析节点信息透明、缺乏隐私数据保护和身份权限管理等问题,提出了一种面向标识公共递归解析节点的数据安全加固策略。通过设计加密
    的头像 发表于 12-26 11:27 299次阅读
    一种面向标识公共递归<b class='flag-5'>解析</b>节点的数据安全加固<b class='flag-5'>策略</b>

    室内照明单相分支回路,为什么不能采用三相断路器控制和保护?

    室内照明单相分支回路,为什么不能采用三相断路器控制和保护? 室内照明单相分支回路是指通过一个单独的电源供应分支到多个照明设备的电路。通常情况下,这些单相分支回路由单相断路器来进行控制和保护。然而
    的头像 发表于 12-25 17:19 264次阅读

    无功补偿单相分补和三相分补的区别

    无功补偿是电力系统中的一项重要技术,通过补偿电力负载中产生的无功功率,可以提高电能的利用效率和供电质量。在无功补偿中,单相分补和三相分补是两种常见的补偿方式,它们在应用场景和原理上存在着一些区别。
    的头像 发表于 11-30 15:13 774次阅读

    什么是PoE分离器?为什么要用PoE分离器?怎样选择PoE分离器?

    什么是PoE分离器?为什么要用PoE分离器?怎样选择PoE分离器? PoE分离器(Power over Ethernet Splitter),顾名思义,是一种设备,它可以将从PoE供电
    的头像 发表于 11-28 15:33 1884次阅读

    基于微流控的功能化凝聚相系统的构建及应用研究进展

    在高分子溶液的缔合液液相分离过程中,均一的溶液体系会在熵或焓的驱动下经相分离形成两种液相
    的头像 发表于 11-25 10:17 391次阅读
    基于微流控的功能化凝聚相系统的构建及应用研究进展

    把您的 PCB 艺术品带来 KiCon 吧

    环节,我们还安排了 PCB Art 的教学及现场装配,让您亲身体验 PCB 艺术的魅力。 为 KiCon 徽章编程 如果您的 SAO 设计除了使用 VCC 和 GND,还需要 I2C 或者 IO 口
    发表于 10-20 10:43

    Redis的删除策略和内存淘汰机制介绍

    Redis过期键的删除策略? Redis的过期删除策略就是:惰性删除和定期删除两种策略配合使用。 惰性删除:Redis的惰性删除策略由db.c/expireIfNeeded函数实现,所
    的头像 发表于 10-09 11:06 283次阅读

    一文解析Linux中ARP学习和老化机制

    ARP学习和老化机制在Linux网络通信中起着至关重要的作用。ARP(Address Resolution Protocol)地址解析协议是将IP地址解析为MAC地址的一种机制
    发表于 08-04 16:55 921次阅读

    微马达不同推进机制以及不同的传感策略探讨

    该文章综述了用于传感的微马达的发展历程,包括其推进机制、传感策略和应用(图1)。首先,概述了微马达的推进机制,包括基于燃料的推进机制和免燃料的推进
    发表于 07-15 12:32 441次阅读
    微马达不同推进<b class='flag-5'>机制</b>以及不同的传感<b class='flag-5'>策略</b>探讨

    Linux内核SoftLockUp机制解析

    与hardlockup机制类似, softlockup也是在watchdog框架下关注于某个task一直处于内核态而不给其它task运行机会的一种debug机制.具体的超时判断时间一般为20S,也可以通过sysctrl 来进行修改.
    发表于 06-23 15:30 1112次阅读
    Linux内核SoftLockUp<b class='flag-5'>机制</b><b class='flag-5'>解析</b>

    分离式液位传感器代替浮球传感器的优势

    ,如水、油、酸碱液等,而浮球传感器只适用于特定的液体。 安装方便:分离式液位传感器采用分离式设计,可以将传感器和控制器分开安装,方便安装和维护。 可编程性强:分离式液位传感器可以通过
    发表于 06-20 14:02