4

从组件 boolean 值属性谈谈分层架构

 3 years ago
source link: https://my.oschina.net/wsafight/blog/5017153
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
从组件 boolean 值属性谈谈分层架构

在刚入行的时候,我从事的是企业服务,在当前业务下开发组件或者页面的时候遇到需要表示 boolean 值属性的时候,往往以 can 作为变量前缀来表示组件是否可以执行某一类或者某一个操作。这种命名习惯跟随了我很久。

直到有一天,我去了另一家公司开发拖拽设计器的时候,领导告诉我:虽然 can 开头表示 boolean 值是没什么问题,但是对于组件开发来说,应该是 able 结束或者 is 开头更合适。然后我在查看了市面上较为知名的几个的组件库,它们在表示 boolean 值时候都是以 able 结尾,我就默默的把当前的变量修改了一下。

可惜的是:当时没有仔细分析这个问题以及问题背后的逻辑。但是做一件事总是要有一个理由的,即使这个理由无法说服别人,但至少也要说服自己。下面我就来分析一下,两者的异同。

我们来看一看 can,able 这两者的实际意思,is 后面再聊。

  • can (表示有能力做或能够发生)能,会;(表示知道如何做) 懂得; 与动词feel、hear、see、smell、taste 连用
  • able 能;能够;有才智的;有才能的

以编辑为例子: canEdit 表示可以编辑,而 editable 表示可编辑的。前者着重表示能够实现某事,后者着重表示具备能力实现某事。

在不同的命名下,我们可以看出决定当前命名的内在逻辑在于当前工作的重点是什么:在之前的工作中,我们是开发业务系统,而对于当时的业务系统来说,有大量的权限控制。而在后来的工作中,我们更多开发的是配置(基础)组件。

我们不妨再来看一看 is 前缀,is 前缀可能更接近 boolean 的意思。如 isInternalStaff 表示是否是内部员工。 但同样,对比前两个单词的意思,它能够表示的粒度太粗。在没有实际深入分析业务前,你无法通过该变量分析出任何实际意义。

分层模式是最常用的架构模式。大部分软件系统都是由多人开发的。根据某种方式或规则可以将系统分层,方便开发人员协同工作。分层实现了层间低耦合和层内高内聚,提升了系统的可维护性。

从规则上来看,分层的所有代码必须属于某一层内,上层代码可以使用下一层,但这种关系必须是单向的。不可以进行循环依赖。当然,从浏览器运行实际分析,依次加载和执行 js 无疑是分层模式的天然应用场景。

当然,分层模式的优势和劣势也是较为明显的,优势无疑是把基础,不易变化的单独提取出来。提高系统的可复用性,可测试性。更容易修改。同时系统分层非常容易实施。但同时,每一次分层都引入了额外的抽象,增加了系统的复杂度,并且有可能会影响性能(清晰的结构比那一点点性能损失要有用的多),同时也可能导致开发有一定的痛苦。

分层模式有许多变种,但无论分为多少层,它的关系,使用规则是不变的。

Flux 架构就像眼镜:您自会知道什么时候需要它。

对待任何系统,都有符合自身的代码架构。但对于分层来说,它太棒了。除非你在进行 demo 测试,否则我一定会推荐你使用分层架构。

分层模式还有一个特点是知识屏蔽(封装),分层可以减少不相关事务间的影响,对于一个成熟的开发团队来说,一定会有人才梯度设计。当团队进入新人的情况下,成熟的分层可以让开发人员不清楚下层细节的情况下,依然可以利用下层技术文档以及 cv 大法进行系统开发。但如果所有的代码都在一个层内,所有人面向同样的问题。虽然我们已经很努力的让新人处理简单的问题,但是错综复杂的调用依然会降低实际开发效率。所以分层模式会帮助团队提效。同时也起到一定代码保护的作用。

分层模式也可以帮你分析实际问题,当你清楚这个问题属于谁,其实问题已经解决了一大半了。我们当然需要具有主人翁精神,但事实上,找到更了解它的人无疑是更有效的方案。

从架构上来说,我们也尽可能的从下层解决问题,因为下层的代码有强大的复用能力。虽然越接近代码细节,修改越有效,性能提升越高。但是对于系统架构来说,细节的解决方案反而是最后考虑的。

我们再回头看一下 boolean 值属性。able 适合与基础组件设计,用于表示基础组件拥有的能力。

can 表明权限控制,在业务块(business block)中使用,利用基础组件,但往往有一定的业务属性,但还可以提炼出一套通用的逻辑。例如 Vant 地址选择 这种,有添加,删除,排序以及修改默认地址的业务逻辑。

最后的 is 适合于是业务系统(页面),我们可以基于不同的角色等构建不同的业务,利用基础组件和业务块来构建。同时我们也可以看出,我们不应该在基础组件和业务块中使用 redux 等状态管理库,以避免耦合。

不过在业务系统上,我们更要分析出当前的代码重复是否是知识的重复。在很多团队编程规则中,都会列举 DRY 原则,甚至 CI 系统中,会指出代码重复,并且禁止你提交代码。这时候,你也需要告诉他们你的理由,代码的确相同,但是当前代码所表示的知识并不相同,这仅仅是一个巧合罢了。

在实际项目开发中,我们可以逐步前进,先在代码中使用 components 文件夹封装组件和块。发展到一定阶段后,然后再利用 monorepo (多项目一个仓库管理)去管理当前系统,最终在稳定之后,提取各个层级形成 multirepo 以便新的项目复用。

分层架构简单但是十分强大,不过想要用好可不是一件简单的事。

如果你觉得这篇文章不错,希望可以给与我一些鼓励,在我的 github 博客下帮忙 star 一下。

博客地址


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK