前端写代码真的有必要封装太好么?

前言

封装、代码复用、设计模式……

这些都是方法,业务才是目的。技术始终是为业务服务的。能够满足业务需求,并且用起来舒服的,都是好方法。

不存在一套适用于所有项目的最佳代码组织方法,你需要结合业务,去不断地演进。就像你不会用造汽车的方法,去造火箭,或是自行车。

这里分享一些我自己觉得比较舒服的方法。

1. 船到桥头自然直

不用非得等所有细节都想清楚了才开始动手。你只需要一个大致的方案,从第一个文件开始,先写起来。写着写着,你就会发现:

  • 这里用到的代码,别的地方也用到了
  • 某个函数已经长到超出显示器了
  • 自己经常在来回滚动屏幕找同一个东西
  • 某个变量名在同一个文件中被使用过了
  • 某个地方的逻辑已经复杂到自己都很难一眼就懂了

当这些情况累积到一定程度,你开始有些为之心烦了,你自然就知道,有些代码应该重新安排了。

如果你还没遇到这些情况,或是你觉得还能忍受。不用担心,这说明当前的代码组织方式没什么问题,你什么都不用做,继续就好。

就像打伞。雨小的时候,打不打都行,手里有伞也未必撑开;雨下大了,就都知道要打伞了。

有经验的开发者,尤其是经历过多人协作的大型项目的开发者,通常都会形成一套自己觉得最舒服的打法,可以从一开始就对项目的架构,以及代码的组织方式有一个比较合理的规划。他们在写下第一行代码之前,就清楚地知道项目接下来会变成什么样,自己需要做什么,敲键盘的过程只是把它们心里已经想好的内容进行输出而已。

但如果你只是想做个一个小而美的小工具,项目规模并不大;又或是你入行时间不长,还没有形成自己的一套打发。我建议你试试我这个方法,或许你就能找到适合你的方法。

2. 关注 IOR(投入产出比)

当你的代码超过 1 万行的时候,恭喜,你成功解锁了大中型项目的成就。

(不用太纠结于 1 万这个数字,它只是个数量级而已)

这个时候的项目肯定已经有了一定的组织方式,代码分门别类地存放在不同的目录中,各司其职。

从这个阶段开始,任何全局性的改动,都会附带比较大的成本。所以每一次的决策,除了关注能否解决问题外,还有另一个需要重点考虑的,那就是 IOR —— 投入产出比。说得直白一点:如果我要这么做,我需要投入多少资源?我能得到什么?这么做值得吗?

如果经过改造,代码的结构变得更加清晰、使用起来更加符合直觉、更加契合业务的需要,那么这样的投入就是值得的。反之如果结果并没有变得更好,或是为此需要投入巨大的成本,那么就要重新考虑一下,有没有更好的办法。

3. 合理的 SoC(关注点分离)

这也是题主真正纠结的点。

我们以题主给出的场景为例:同一个页面的业务代码,在不涉及通用组件以及工具函数的情况下,要不要拆成多个组件?

显然这不是一个绝对的要或者不要的问题,业务代码的内容,当然是要由业务来决定。前端的业务结构跟路由有很大的关系,因此一个路由对应一个文件,这本身是一个非常合理的安排。

如果页面组成相对简单,所有逻辑都放在一个文件里,阅读起来会更加方便,维护成本也比较低,那就完全可以不用拆。(应该没几个人会把一个关于页面拆的稀碎吧)

但如果业务复杂到一定程度,比如一个页面中包含了若干个相对独立的部分、单文件的行数开始过千,那么就可以考虑对它们进行拆分。(想象一下如果淘宝的首页只有一个组件)

拆分之后,每个组件关心的事情更少,单文件的行数也会显著下降,配合恰当的变量命名,大概率会使代码结构变得更加清晰。

如果结合 React 等具体技术栈来看,合理的拆分甚至还能减少 DOM 操作,优化性能,典型的像输入框的交互、列表的渲染等,它们的性能都是很容易受到其他组件影响的。

至于组件间的通信,Context、EventBus、RxJS、…… 解决办法有很多。

除了按业务拆,我们还可以按分工拆,典型的就是数据与行为分离,把数据模型从视图模型中剥离出来,分工更加明确一些,各自关注的事情也更加纯粹。

至于拆到什么粒度,可以参考第一条 —— 不让自己心烦了,就算到位了。

像 Redux 等状态管理方案,其存在的最大意义就是方便开发者进行关注点分离。同样的事情,React 自己都能做,但当业务复杂到一定程度,你就会想要把它们独立出来。即便你不引入 Redux,你或许不知不觉中也已经实现了一个简易版的 Redux。

类似的还有 React 的 Custom Hooks,本质是一种代码复用方式,通过把整段的逻辑抽取成单个函数,实现了关注点分离。

4. 模块化,减少冲突

在多人协作的项目中,开发者拆分代码还有一个重要的考虑因素,就是代码冲突。

以 API 为例,把所有的 API 函数抽取到一个独立的文件已经是一个不错的实践,对于独立开发者而言,这往往已经够了。我自己有一些私人的小项目就是这么干的。即便是大型的项目,这么做也不是不可以。

但在多人协同的过程中,每个人负责不同的 Feature,可能同时有多个人都在编辑同一个文件,就很容易产生冲突。如果我们把每一个 API 都拆到一个单独的文件中去,或者按照一定的规则分个类(例如分成 user、product、comment 等 ),冲突的概率就会大大下降,因为和你编辑同一个文件的人变少了。

这本质上就是模块化的思想,每个模块之间相互独立互不干扰,只要结果正确,我并不关心你内部是怎么实现的。

5. 统一化,减少认知负担

团队管理中,一个不容忽视的成本,就是沟通成本。让所有人都步调一致,这可不是一件容易的事。

举个例子:在大型项目中,我们经常会看到这样的结构:一个组件 + 一个 Store,即便这个 Store 里的内容非常的少,完全可以由 State 来承载,甚至里面什么也没有,只是继承了一下父类,也依然会安排一个 Store。

当然,具体到这个组件来看,确实是没有必要。但当你面对几十个甚至几百个组件,你的团队也有差不多的规模的时候,问题就变了。

同一类的组件,有的有 Store 有的没有,这在一些场景下会形成认知负担,开发者需要花时间去熟悉它们的组合,可能还会需要为此编写一些容错代码。如果我们可以确保每一个组件都有一个 Store,即便它并不需要,但依然存在,问题就得到了简化。毕竟让计算机创建一个没用的对象并不会占用太多资源,但相比之下让人工来处理这个问题,成本就很高了。

这样的做法在大厂中比比皆是,有点算法复杂度中空间换时间的意思。

当然,也不排除有些是通过代码模板自动生成的。

总之

代码的管理也是一门艺术,就像写作,如何把你的文字整理成章节,需要慎重的思考。

没有人能告诉你什么是最正确的方法,勇敢去尝试,到时候了,你自然就会知道该怎么做。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/36151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web应用安全测试-专项漏洞(一)

Web应用安全测试-专项漏洞(一) 专项漏洞部分注重测试方法论,每个专项仅列举一个例子。实际测试过程中,需视情况而定。 文章目录 Web应用安全测试-专项漏洞(一)Web组件(SSL/WebDAV)漏…

vue3爷孙组件通信——provide和inject

父组件中提供数据&#xff0c;并在子组件中注入这些数据&#xff0c;从而实现了组件之间的数据传递。可用于兄弟组件通信&#xff0c;爷孙组件通信&#xff0c;父子通信。 provide( ‘注入名’, 注入值" ) 和 inject(‘注入名’) 第一代组件&#xff1a; <template>…

2024十大首码地推拉新app平台,一手首码对接平台!

到了2024年&#xff0c;地推新应用的接单平台成为创业者们关注的焦点。对于地推行业的从业人员而言&#xff0c;选择一家拥有一手单资源的平台至关重要&#xff0c;因为这直接关系到他们的利益。 2024年如果想要进行app地推活动&#xff0c;却没有人脉渠道的困扰&#xff0c;建…

Jmeter+InfluxDB+Grafana性能测试数据展示

JmeterInfluxDBGrafana提供了一种更好的对Jmeter压测结果的实时监控展示。可以理解为数据源产生的数据加上时间记录并存储&#xff0c;然后使用各种开源图表组件进行展示。实现jmeter报告的更好的可视化展示 1&#xff09;方便测试结果数据落地以及更好的分析 2&#xff09;将…

【数据集管理】使用 Fiftyone 管理数据集,大型数据集也不在话下!

【数据集管理】使用 Fiftyone 管理数据集&#xff0c;大型数据集也不在话下&#xff01; 1. Fiftyone 安装2. 数据集的加载与导出2.1 本地数据集操作2.1.1 创建 session2.1.2 加载数据集2.1.2.1 加载 YOLO 格式的数据集2.1.2.2 加载本地数据库中的数据集2.1.2.3 同时加载数据集…

2024《汽车出海全产业数据安全合规发展白皮书》下载

随着中国制造向中国智造目标的迈进&#xff0c;中国汽车正以前所未有的速度和质量&#xff0c;在全球市场上开疆拓土。不过&#xff0c;在中国汽车加快出海步伐的过程中&#xff0c;数据安全合规风险管理成为车企不容忽视的课题。 6月25日&#xff0c;在中国&#xff08;上海&…

从万里长城防御体系看软件安全体系建设@安全历史03

长城&#xff0c;是中华民族的一张重要名片&#xff0c;是中华民族坚韧不屈、自强不息的精神象征&#xff0c;被联合国教科文组织列入世界文化遗产名录。那么在古代&#xff0c;长城是如何以其复杂的防御体系&#xff0c;一次次抵御外族入侵&#xff0c;而这些防御体系又能给软…

上海高考志愿填报小程序开发的主要功能

6月毕业季&#xff0c;高考学子刚经历了激烈的高考角逐&#xff0c;又迎来了志愿填报的大关。面对影响一生的高考志愿&#xff0c;如何填报显得尤为重要&#xff0c;面对广大学子的填报需求&#xff0c;上海高考志愿填报小程序为高考学子带来了福音。 一&#xff0e; 上海高考…

端到端图像分类算法开发实战:从 Arm 虚拟硬件到 Grove Vision AI Module V2 物理硬件

端到端图像分类算法开发实战&#xff1a;从 Arm 虚拟硬件到 Grove Vision AI Module V2 物理硬件 文章目录 1. 写在前面2. 产品简介2.1 Arm 虚拟硬件镜像产品简介2.2 Grove - Vision AI V2 产品简介 3. 实验前准备4. 实验步骤4.1 模型训练4.2 Arm 虚拟硬件镜像上的部署测试4.2…

OpenAI 开启买买买模式:接连收购 Rockset 与 Multi,科技巨头创新布局

引言 最近&#xff0c;OpenAI 在科技领域引起了广泛关注&#xff0c;通过接连收购两家初创公司 Rockset 和 Multi&#xff0c;开启了所谓的“买买买模式”。这一战略举措不仅展现了 OpenAI 对于技术发展的深远布局&#xff0c;也预示着未来更多创新产品的推出。本文将详细探讨…

Linux通用系统高危漏洞(CVE-2024-1086)修复案例

一、漏洞描述 2024年3月28日&#xff0c; Linux kernel权限提升漏洞&#xff08;CVE-2024-1086&#xff09;的PoC/EXP在互联网上公开&#xff0c;该漏洞的CVSS评分为7.8&#xff0c;目前漏洞细节已经公开披露&#xff0c;美国网络安全与基础设施安全局&#xff08;CISA&#x…

测试:MyBatisDemo

MyBatis Demo 先创建一个 Maven 项目&#xff0c;名称为 MyBatis01。 之后创建并连接 MySQL 数据库&#xff0c;然后执行 sql 脚本&#xff1a; CREATE DATABASE mybatis;USE mybatis;DROP TABLE IF EXISTS user;CREATE TABLE user ( id int(20) NOT NULL, name varchar(30)…

ABB机器人控制柜各模块指示灯状态说明

ABB机器人控制柜各模块指示灯状态说明 主计算机模块位于控制柜的正前方,负责机器人的各种运算处理,安全模块主要负责安全相关的信号处理,驱动单元模块用于接收上位机指令,驱动机器人运动,轴计算机模块用于接收主计算机的运动指令和串

入门JavaWeb之 Response 验证码和重定向

Response 写验证码&#xff1a; package com.demo.response;import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse…

浏览器页面打不开(网络连接正常的情况下)

目录 一、代理被打开 二、DNS被篡改 三、网络配置出现问题 四、浏览器配置问题 一、代理被打开 1. 右击Wifi图标 2.点击“打开网络和internet设置” 3. 点击代理&#xff0c;把该窗口所有的东西都关闭&#xff0c;尤其是代理服务器 二、DNS被篡改 如果第一个方法不行&am…

浅谈逻辑控制器之仅一次控制器

浅谈逻辑控制器之仅一次控制器 “仅一次控制器”(Once Only Controller) 是一个非常实用的组件&#xff0c;它允许用户控制测试计划中的某些操作仅执行一次&#xff0c;无论其所在的线程组或父级控制器设置了多少次循环。本指南将详细介绍“仅一次控制器”的功能、使用场景及配…

HarmonyOS ArkUi Tabs+TabContent+List实现tab吸顶功能

Demo效果 Entry Component struct StickyNestedScroll {State message: string Hello WorldState arr: number[] []scroller new Scroller()StyleslistCard() {.backgroundColor(Color.White).height(72).width("100%").borderRadius(12)}build() {Scroll(this.sc…

医药研发项目管理系统:适合CRO/CDMO企业使用的项目管理系统有哪些?

近日&#xff0c;北京民康百草医药科技有限公司&#xff08;以下简称“民康百草”&#xff09;与北京瑞杰智能科技有限公司&#xff08;以下简称“瑞杰科技”&#xff09;宣布达成战略合作&#xff0c;双方将共同打造一套符合民康百草企业特色的研发项目管理系统。该系统将基于…

postGreSQL关系数据库介绍

什么是postGreSQL关系数据库&#xff1f; PostgreSQL 是一个强大的、开源的对象关系型数据库管理系统&#xff08;ORDBMS&#xff09;。它基于POSTQUEL查询语言的继承&#xff0c;提供了对SQL标准的广泛支持&#xff0c;并扩展了许多高级功能&#xff0c;如事务处理、多版本并…

使用 Webmin 中模块注意事项

一、 Docker中Webmin忘记密码解决方法 Webmin忘记Web登陆时候的密码&#xff0c;无法登陆&#xff0c;可以通过changepass.pl 文件修改密码来进行解决。但在 Docker 中这一方法很难&#xff0c;因为不知道changepass.pl 在那里&#xff1f; 我是通过如下方法来解决的&#xff…