React组件设计之边界划分原则

news/2024/7/7 21:20:11

简述

结合SOLID中的单一职责原则来进行组件的设计

Do one thing and do it well

javaScript作为一个弱类型并在函数式和面对对象的领域里疯狂试探语言。SOLID原则可能与其他语言例如(java)的表现可能是不同的。不过作为软件开发领域通用的原则,在javaScript也还是有一席之地,尤其是在React出生之后。因为React组件的对外接口非常规范。

分而治之

任何一个应用,无论多么复杂,都是由慢慢发展而来的。在初期因为功能较少,可能一个组件就够。但是随着时间的推移,功能的迭代,整个组件可能变得越来越臃肿和难于管理。

这个时候就应该对组件进行拆分。用单一职能(feature component)的组件组合起来完成复杂的功能,react也提倡 Composition vs Inheritance – React 使用Composition来完成组件的设计(无论大小)。

缺点

分而治之是一个非常优秀的策略。能把复杂的问题分解成小的问题,解决起来迅速,维护简单。但是因为组件拆分开了,必定会造成文件和目录的增加(FTF && FF文件组织原则)。这可能会导致维护成本和开发体验。每个组件都是独立存在的,但是拆分的时候发现两个组件逻辑太紧密,无法清晰定义各自的责任,这个时候你就应该考虑一下组件本身是否不应该拆分。

单一原则

其根本思想是弱化组件间的依赖关系,每个组件尽量保证独立,无论是业务组件还是基础组件,保证整个系统的的低耦合度。其实这个是非常难的,需要开发者对整个系统有深入的认知。对整个系统的功能点进行模块的划分,让不同的业务组件去完成不同的功能模块。这个需要我们开发者自己挖掘,也是最花费心力的!

?: 开发一个购物车模块,如果商品的数量大于0则显示在购物车里,而且会出现一个加减商品的操作按钮和一个显示商品数量的功能

class ProductionOperation extends React.Component {constructor(props) {super(props);this.state = {value: 0};}increment = () => {this.setState({value: this.state.value - 1});}decrement = () => {this.setState({value: this.state.value + 1});}render() {return (<div><button onClick={this.increment}> - </button><span>{this.state.value}</span><button onClick={this.decrement}> + </button></div>);}
}
复制代码
const CartHOC = (ProductionOperation)=>{return (props)=>{if (props.onhand > 0) {return <ProductionOption />;} else {return null;}}
};
复制代码
const ShoppingCart = CartHOC(ProductionOperation);
复制代码

这样就做到了ProductionOperation的复用,和功能单一,通过组合不同的HOC来完成不同的功能。

总结

单一职责原则作为软件设计的通用原则,在实现组件的高内聚和低耦合上起到了至关重要的作用。但是组件并不是孤岛,组件间必须有交流才能完成更大的应用。这需要开发者花费心思进行程序设计

顺便提一下

高内聚:react的开发模式将传统的html,css,js通过JSX整合在一个javaScript文件中,因为他们是为了实现一个目的(feature)存在的。所以React天生具有高内聚的特点,也解决了传统前端开发的弱势。

低耦合:组件关系关系尽量弱化,保持功能独立,以达到整个系统的低耦合度。


http://lihuaxi.xjx100.cn/news/235775.html

相关文章

网络管理员比赛回顾02-网关、静态路由、动态路由

目录 一、配置网关 二、配置静态路由 三、配置动态路由 3.1、使用RIP协议配置动态路由 3.2、使用OSPF协议配置动态路由 2021年9月参加青年网络管理员比赛&#xff0c;因为网管超龄不能按照“青年”参赛&#xff0c;临时培训我们这批“青年”参赛&#xff0c;回顾一下经过以…

学习笔记之vue根据权限动态添加路由

路由守卫判断 router.beforeEach((to, from, next) > {if (to.path /login) {sessionStorage.removeItem(user);}if (!user && to.path ! /login&&location.search ! ?validate) {next({ path: /login })} else {next()} }) 复制代码 点击登陆后&#xff…

mongodb使用常用语法,持续更新

设置快捷命令D:\mongodb4.0.8\bin>mongod --config "D:\mongodb4.0.8\mongo.conf" --auth --install --serviceName "MongoDB"mongodb配置文件#数据库路径dbpathD:\mongodb4.0.8\data\db#日志输出文件路径logpathD:\mongodb4.0.8\data\log\MongoDB.log#…

SAP创建webservice

目录 一、创建webservice 二、更改webservice 三、SoapUI测试webservice 四、查看webservice日志及排错 一、创建webservice 以用户相关的函数User为例创建webservice&#xff0c;事务码bapi查看bapi函数&#xff0c;BasisComponents-Security-User&#xff0c;选择Tools…

固定资产打印条码标签应用方案

条码在固定资产管理中的应用方案&#xff1a; 应用客户案例&#xff1a; 河南省交通规划勘察设计院 黄河水文勘察测绘局 以实物管理为基础&#xff0c;以条码技术的应用为特点。通过先进的条码技术对固定资产实物从购置、领用、转移、盘点、清理到报废等方面进行全方位准确监管…

SAP事务码f-02做账界面显示“页数”字段

事务码 f-02 做账界面&#xff0c;没有显示页数。 用户账号的参数添加 CSF &#xff08;Country-Specific Fields&#xff09;参数&#xff0c;参数值为 CN&#xff08;伟大的China&#xff09; 再次来到 f-02 的界面&#xff0c;显示了页数字段

深度分析Java的枚举类型——枚举的线程安全性及序列化问题

点击关注&#xff0c;快速进阶高级架构师作者&#xff1a;Hollis写在前面&#xff1a;Java SE5提供了一种新的类型-Java的枚举类型&#xff0c;关键字enum可以将一组具名的值的有限集合创建为一种新的类型&#xff0c;而这些具名的值可以作为常规的程序组件使用&#xff0c;这是…

MATLAB矩阵操作

转载于:https://www.cnblogs.com/souhaite/p/10727988.html