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
    +关注

    关注

    4

    文章

    3694

    浏览量

    93207
  • 程序
    +关注

    关注

    117

    文章

    3836

    浏览量

    84756
  • GUI
    GUI
    +关注

    关注

    3

    文章

    693

    浏览量

    42836

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    效率超30%的三结叠层太阳能电池:基于卤化物混合制动策略赋能1.95eV宽带隙钙钛矿

    宽带隙钙钛矿因混合卤化物组分具备1.5-2.3eV可调带隙,广泛应用于叠层太阳能电池,但带隙提升至1.95eV所需的高溴含量会导致卤化物分布不均、相分离加剧及载流子复合增强,引发显著开路电压损失。单
    的头像 发表于 12-03 09:03 393次阅读
    效率超30%的三结叠层太阳能电池:基于卤化物混合制动<b class='flag-5'>策略</b>赋能1.95eV宽带隙钙钛矿

    储能系统为何拉低功率因数、产生谐波?深层机制与治理策略解析

    这两大问题已成为储能并网后电网稳定运行的核心挑战,需从技术原理层面拆解影响机制,为工程应用提供解决方案。
    的头像 发表于 11-25 08:43 443次阅读
    储能系统为何拉低功率因数、产生谐波?深层<b class='flag-5'>机制</b>与治理<b class='flag-5'>策略</b>全<b class='flag-5'>解析</b>

    实现高效稳定宽带隙钙钛矿电池:抑制相分离的晶界工程策略

    宽禁带钙钛矿光伏材料因其带隙可调,在室内能量收集领域展现出巨大应用潜力。然而,其面临一个根本性挑战:在光照下,混合卤化物钙钛矿会发生光诱导卤化物相分离,导致材料内部形成局部的富碘区和富溴区。这种现象
    的头像 发表于 11-21 09:05 196次阅读
    实现高效稳定宽带隙钙钛矿电池:抑制<b class='flag-5'>相分离</b>的晶界工程<b class='flag-5'>策略</b>

    电流探头在共差模电流分离中的应用解析

    传递的有用电流,是系统正常运行的核心。准确分离共模电流和差模电流,对于设备的电磁兼容性(EMC)设计、故障诊断和性能优化至关重要。电流探头凭借其非侵入式测量特性和精准的信号捕捉能力,成为实现这一分离的关键工具。 一、
    的头像 发表于 10-29 09:10 192次阅读
    电流探头在共差模电流<b class='flag-5'>分离</b>中的应用<b class='flag-5'>解析</b>​

    边聊安全 | 安全芯片的守护神:BIST机制的深度解析

    BIST机制的深度解析写在前面:在安全芯片的设计与验证过程中,工程师常会遇到一个关键概念——BIST(Built-InSelf-Test,内置自检测)。初次接触这一术语时,许多人容易将其简单理解为
    的头像 发表于 09-05 16:17 29次阅读
    边聊安全 | 安全芯片的守护神:BIST<b class='flag-5'>机制</b>的深度<b class='flag-5'>解析</b>

    一文看懂锂离子电池组装过程的分离与堆垛

    的核心步骤。本文将结合美能锂电的技术实践,深度解析锂离子电池组装的这两大工艺。分离工艺:电极片精准切割制备MillennialLithium分离工艺流程图分离工艺是将
    的头像 发表于 08-11 14:53 784次阅读
    一文看懂锂离子电池组装过程的<b class='flag-5'>分离</b>与堆垛

    API让电商“活”起来:动态定价策略的革新力量

    格局。而应用程序编程接口(API)正是这一变革的核心引擎,它将数据、算法和业务系统无缝连接,使电商平台真正“活”起来。本文将逐步解析动态定价策略的原理、API的关键作用、技术实现,以及其实际应用,帮助您理解这一创
    的头像 发表于 07-22 14:46 375次阅读

    NVIDIA AI如何助力艺术创意落地

    本次 GTC 将在欧洲著名艺术之都巴黎举办,特别策划的艺术画廊将展示 AI 如何助力创意落地,实现技术与灵感碰撞的愿景。
    的头像 发表于 06-12 15:26 796次阅读

    解析RZ/N2L CANFD模块的缓冲区机制(2)

    在工业自动化、智能交通、机器人等领域,CANFD(CAN with Flexible Data-Rate)技术正逐步取代传统CAN,以适应更高的数据速率和更复杂的通信需求。本文将深入解析RZ/N2L CANFD模块的缓冲区机制,帮助工程师更高效地管理CAN消息,提高系统性
    的头像 发表于 05-19 14:13 1141次阅读
    <b class='flag-5'>解析</b>RZ/N2L CANFD模块的缓冲区<b class='flag-5'>机制</b>(2)

    解析RZ/N2L CANFD模块的缓冲区机制(1)

    在工业自动化、智能交通、机器人等领域,CANFD(CAN with Flexible Data-Rate)技术正逐步取代传统CAN,以适应更高的数据速率和更复杂的通信需求。本文将深入解析RZ/N2L CANFD模块的缓冲区机制,帮助工程师更高效地管理CAN消息,提高系统性
    的头像 发表于 05-19 14:10 956次阅读
    <b class='flag-5'>解析</b>RZ/N2L CANFD模块的缓冲区<b class='flag-5'>机制</b>(1)

    RS485空调如何保证其更安全高效的防护机制

    RS485空调如何保证其更安全高效的防护机制
    的头像 发表于 05-05 16:00 759次阅读
    RS485<b class='flag-5'>之</b>空调如何保证其更安全高效的防护<b class='flag-5'>机制</b>

    完整版—单片机编程思想(推荐下载!)

    单片机的编程思想,希望能帮助大家写出简明的代码 内容简介 以单片机裸环境为基础,为编程者定义了一个微操作系统(MOS)的编程环境,并面向应用中不断提高的需求对编程
    发表于 04-16 15:06

    深度解读 30KPA64A 单向 TVS:64V 击穿机制与高效防护策略

    深度解读 30KPA64A 单向 TVS:64V 击穿机制与高效防护策略
    的头像 发表于 02-24 13:52 601次阅读
    深度解读 30KPA64A 单向 TVS:64V 击穿<b class='flag-5'>机制</b>与高效防护<b class='flag-5'>策略</b>

    解析DeepSeek MoE并行计算优化策略

    本期Kiwi Talks将从集群Scale Up互联的需求出发,解析DeepSeek在张量并行及MoE专家并行方面采用的优化策略。DeepSeek大模型的工程优化以及国产AI 产业链的开源与快速部署预示着国产AI网络自主自控将大有可为。
    的头像 发表于 02-07 09:20 2695次阅读
    <b class='flag-5'>解析</b>DeepSeek MoE并行计算优化<b class='flag-5'>策略</b>

    三菱PLC编程语言解析

    (Sequential Function Chart, SFC)等。以下是对这些编程语言的简要解析: 1. 梯形图(Ladder Diagram, LD) 梯形图是PLC编程中最常用的图形编程
    的头像 发表于 12-26 17:36 2218次阅读