优化解耦的设计思考

简介: 基于开源项目进行开发已经越来越普遍,WebKit和Android都有很多的深度定制的版本。 对这样庞大工程修改的逻辑越来越多,日后想要同步升级就要面对更大的复杂性和风险。

基于开源项目进行开发已经越来越普遍,WebKit和Android都有很多的深度定制的版本。


对这样庞大工程修改的逻辑越来越多,日后想要同步升级就要面对更大的复杂性和风险。跟随开源项目同步升级,寻求上层的创新和优化才比较适合未来的产品开发策略。深度定制的方式会遭遇越来越多的尴尬。


修改是必要的,但如何最大化地降低耦合和隔离对原生代码逻辑的修改?逻辑碎片的风险也许大家都体会过。以下是我对一个问题的思考,与大家分享,抛砖引玉。

1. 问题定义

首先交待一下当前的状况。
1.有对WebKit原生内核中HTMLMediaElement修改的需求。
由于实现的限制,导致了必须对HTMLMediaElement进行修改。


2. 不同平台的修改逻辑混杂在一起。
在不同平台上的适配内容也不尽相同,所以其中有许多使用宏来区分系统的修改。

问题就是有没有可能将这些修改的实现放到独立的文件中去,在HTMLMediaElement中只做少量的修改,最大化的减少对原生代码的修改?或者是有规则的修改。总之要便于和最新的WebKit代码同步。

2. 问题分析

首先从设计上来看这个问题,可以将WebKit的实现视为核心逻辑,将我们的修改视为一个辅助逻辑或特殊逻辑。

这样就可以有一个设计上问题定义:把这部分逻辑从主逻辑中抽离的设计方法,但不改变原来的类的层次架构。

继承并不合适。因为一部分HTMLMediaElement中的成员定义为protected,它本身已经被HTMLAudioElement和HTMLVideoElement所继承。还有对应的Render、JS Binding与它的对应问题。远不是在parser位置将video和audio对应的类改成新类就可以的, 而是需要更改到HTMLMediaElement的定义。

解决方案就是提供一个Helper类,如MediaElementHelper来处理特殊逻辑。

   


2. 实现说明

2.1 建构

在HTMLMediaElement的建构函数中加入:
m_helper = MediaElementHelper::create(this);
 不同平台可以使用相同的类定义,但实现不同。

2.2  相互调用

helper又为HTMLMediaElement的友类,就可以访问HTMLMediaElement的私有变量,或者执行私有成员函数。如果认为这样风险高,也可以像下面这样专为helper增加一些访问私有成员的接口。
   
这样在需要进行特殊逻辑判断和处理的地方,就使用m_helper来调用执行。具体的行为则在不同的helper类中实现。

3. 评估

关于helper的使用一直是有争议,网上也有很多避免使用helperclass的讨论。主要论调在于认为helper class是过程化的产物,思考时是考虑的是流程上的逻辑补充。虽然在目前场景下,这也算是一个解决方案,但不是最佳方案,因为这些做同样增加了设计的复杂性。

参考: 自然而然的设计

         WebKit模块化分析

转载请注明出处: http://blog.csdn.net/horkychen


目录
相关文章
|
1月前
|
存储 前端开发 数据库
模块功能分层解耦
模块功能分层解耦
32 2
|
7月前
|
存储 Cloud Native Linux
软件开发方法:复用与扩展
软件开发方法:复用与扩展
|
9月前
|
消息中间件 运维 监控
微服务架构的优点和缺点分别有哪些?
微服务架构的优点和缺点分别有哪些?
367 0
微服务架构的优点和缺点分别有哪些?
|
17天前
|
算法 Linux C++
C++框架设计中实现可扩展性的方法
在软件开发中,可扩展性至关重要,尤其对于C++这样的静态类型语言。本文探讨了在C++框架设计中实现可扩展性的方法:1) 模块化设计降低耦合;2) 使用继承和接口实现功能扩展;3) 通过插件机制动态添加功能;4) 利用模板和泛型提升代码复用;5) 遵循设计原则和最佳实践;6) 应用配置和策略模式以改变运行时行为;7) 使用工厂和抽象工厂模式创建可扩展的对象;8) 实现依赖注入增强灵活性。这些策略有助于构建适应变化、易于维护的C++框架。
30 2
|
18天前
|
消息中间件 存储 监控
通过将大型应用拆分成一系列小型、独立的服务,微服务架构为后端开发带来了更高的灵活性、可扩展性和可维护性
【6月更文挑战第10天】本文探讨了构建高效微服务架构的后端开发最佳实践。微服务的核心原则是服务独立、去中心化、自治和轻量级通信,优势在于可扩展性、独立性、技术灵活性和团队协作。实践中,应注意服务的拆分粒度,选择合适的通信协议(如RESTful、RPC、消息队列),处理数据一致性与分布式事务,实施服务治理和监控,以及确保安全性与权限控制。未来,微服务将结合服务网格、容器化和云原生技术,持续发展和优化。
28 0
|
1月前
|
设计模式 API 数据库
【C/C++ 设计思路】C++中解耦策略的艺术:有效管理复杂依赖关系
【C/C++ 设计思路】C++中解耦策略的艺术:有效管理复杂依赖关系
84 3
|
1月前
模块功能复用和扩展性
模块功能复用和扩展性 模块功能复用和扩展性是软件工程中的重要概念,主要体现在设计和实现阶段。
36 1
|
存储 设计模式 缓存
响应式编程的复杂度和简化
响应式系统不是今天的主题,我们要讨论更具体的话题,即响应式代码的编写会有哪些复杂度,应该如何简化。
143 0
响应式编程的复杂度和简化
|
存储 消息中间件 监控
复杂任务中,流程的解耦设计
在系统开发的过程中,必然存在耗时极高的动作,是基于请求响应模式无法解决的问题,通常会采用解耦的思维,并基于异步或者事件驱动的方式去调度整个流程的完整执行。
398 0
复杂任务中,流程的解耦设计
|
API 数据库 开发者
微服务架构的优点和缺点总结
微服务架构的好处与优势 微服务架构模式有很多好处。 首先,通过分解巨大单体式应用为多个服务方法解决了复杂性问题。在功能不变的情况下,应用被分解为多个可管理的分支 或服务。每个服务都有一个用RPC-或者消息驱动API定义清楚的边界。
8321 0