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

前言

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

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

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

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

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,即便它并不需要,但依然存在,问题就得到了简化。毕竟让计算机创建一个没用的对象并不会占用太多资源,但相比之下让人工来处理这个问题,成本就很高了。

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

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

总之

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cad报错:由于找不到vcruntime140.dll无法继续执行代码

在现代的工程设计中,计算机辅助设计(CAD)软件已经成为了工程师们不可或缺的工具。然而,在使用CAD软件的过程中,有时我们会遇到一些问题,其中之一就是“找不到vcruntime140.dll”的错误提示。本文将详细介绍…

鸿蒙期末项目(2)

主界面 主界面和商店详情界面参考如下设计图(灵感严重匮乏) 简单起见,将整个app分为4个布局,分别是主界面、搜索界面、购物车界面,以及个人界面。 所以在app中也需要使用tab组件进行分割,且需要通过tabBa…

安装Flask

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 大多数Python包都使用pip实用工具安装,使用Virtualenv创建虚拟环境时会自动安装pip。激活虚拟环境后,pip 所在的路径会被添加…

离散傅里叶变化

傅里叶变换 对傅里叶变换了解不是很清楚的朋友推荐一下这个帖子,讲得很详细 傅里叶变换 源码 先看源码链接 #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "open…

FuTalk设计周刊-Vol.026

🔥🔥AI漫谈 热点捕手🔥🔥 1、Hotshot-XL AI文本转GIF Hotshot-XL 是一种 AI 文本转 GIF 模型,经过训练可与Stable Diffusion XL一起使用。能够使用任何现有或新微调的 SDXL 模型制作 GIF。 网页体验 网页http://htt…

git 初基本使用-----------笔记(结合idea)

Git命令 下载git 打开Git官网(git-scm.com),根据自己电脑的操作系统选择相应的Git版本,点击“Download”。 基本的git命令使用 可以在项目文件下右击“Git Bash Here” ,也可以命令终端下cd到指定目录执行初始化命令…

聚类算法(3)---K-means 算法

本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习笔记&#…

软件测试的目的和原则介绍,软件测试外包公司推荐

在当今信息技术迅速发展的时代,软件产品的质量和安全性对用户至关重要。而软件测试作为保障软件产品质量的关键一环,具有不可或缺的作用。 软件测试的目的是为了发现和解决软件产品中的缺陷和问题,确保软件的稳定和可靠性。软件测试帮助找出…

表格截图怎么转换成表格?6个软件帮助你快速进行表格转换

表格截图怎么转换成表格?6个软件帮助你快速进行表格转换 将表格截图转换为可编辑的表格文件是处理数据时常见的需求,特别是在需要分析或编辑图像中包含的信息时。以下是几款帮助你快速进行表格转换的软件和工具,它们提供了不同的功能和适用场…

揭秘!这款电路设计工具让学校师生都爱不释手——SmartEDA的魔力何在?

随着科技的飞速发展,电子设计已成为学校师生们不可或缺的技能之一。而在众多的电路设计工具中,有一款名为SmartEDA的工具,凭借其强大的功能和友好的用户体验,迅速赢得了广大师生的青睐。今天,就让我们一起探索SmartEDA…

游泳耳机入耳式好还是骨传导好?游泳教练力荐实力卓绝的四大热款

作为一名长期致力于游泳爱好者健康与运动体验提升的专业教练,我深知在水中听音乐的魅力,同时也深知选择正确的耳机对于水上运动的重要性。近年来,市场上的游泳耳机类型日益丰富,其中入耳式和骨传导两大主流各有千秋。今天&#xf…

系统运维面试题总结(网络基础类)

系统运维面试题总结(网络基础类) 网络基础类第七层:应用层第六层:表示层第五层:会话层第四层:传输层第三层:网络层第二层:数据链路层第一层:物理层 类似面试题1、TCP/IP四…

停更公告

由于csdn越来越流氓了,我永久停更,专注于网站建设(亚运奥运素材网)qdhca.asiahttp://qdhca.asia/

Linux之prometheus安装和使用简介(一)

一、prometheus简介 普罗米修斯Prometheus是一个开源系统监控和警报工具包,最初构建于SoundCloud。自2012年成立以来,许多公司和组织都采用了普罗米修斯,该项目拥有非常活跃的开发人员和用户社区。它现在是一个独立的开源项目,独立…

如何使用WxPusher向个人微信推送发送实时消息,比如定时任务等

wxpusher-sdk-java这个框架开源了:GitHub - wxpusher/wxpusher-sdk-java: 微信消息实时推送服务[WxPusher]的Java版本sdk,可以通过API实时给个人微信推送消息。wechat pusher. 文档地址:WxPusher微信推送服务 WxPusher (微信推送服务)是一个…

【启明智显分享】典型的HMI应用实现方案:帮你更好地主控选型!

HMI是操作者与机器/系统间资讯传递和交换的主要桥梁。HMI系统通常能提供丰富的资讯,例如温度、压力、制造流程步骤以及材料的计量数据。还能显示设备中物料的确切位置或储存槽内的液位数据等讯息。无论是在工业自动化还是医疗、商业等重要行业领域,HMI都…

使用Retrofit2+OkHttp监听上传或者下载进度会执行两次的问题

使用Retrofit2OkHttp监听上传或者下载进度RequestBody#writeTo/ResponseBody#source 会执行两次的问题 example: 问题原因: 使用了HttpLoggingInterceptor拦截器,并且日志等级为HttpLoggingInterceptor.Level.BODY 问题解决:

【Linux】环境基础开发工具使用(yum、vim、gcc/g++、gdb、make/Makefile)

文章目录 Linux 软件包管理器 yumLinux开发工具Linux编辑器-vim使用vim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行模式各命令汇总批量化注释和批量化去注释vim简单的配置解决一个小问题 Linux编译器-gcc/g作用gcc/g 语法预处理编译汇编链接什么是函数库 Linux调…

【第一周】认识小程序

目录 认识小程序发展历史发展前景发展优势个人企业/创业 账号申请开发工具下载流程使用说明 协作项目交流收益渠道 认识小程序 发展历史 微信小程序自2016年首次提出以来,经历了快速的发展和完善过程,以下是其主要发展历史节点: 2016年1月…

vue3 中的根据某些特定的文字来筛选数组数据

现在有一批这样的数据 这样的数据 我想根据 hallName 来筛选数据 比如关键字有 我不需要 带有下面字符换的数组数据 const importantData ref(["VIP", "CINITY", "杜比", "IMAX", "4DX", vip, Vip]) 使用some 方法 arr…