绝味食品:一季度净利润2.36亿元,同比增长275%
06-17
如何消除代码中庞大的参数列表?有经验的程序员应该都知道,一个方法有几十个、几百个参数。 1 为什么方法有参数?因为信息需要在不同的方法之间共享。
但方法之间共享信息的方式不仅仅是参数列表,还包括全局变量。但全局变量总能带来意想不到的惊喜,因此取消全局变量也是一大语言趋势。
所以参数列表就成了唯一的选择。所以,只要想到有什么信息要传递给一个方法,就会直接添加到参数列表中,导致参数列表越来越长! 2 参数列表太长怎么办?一旦参数列表太长,粗孩子就很难完全掌控逻辑了!所以问题的关键是数量多,解决的关键是减少参数的数量。
3 解决方案 3.1 一个简单的创建博客的方法: 代码语言:javascript copy public void createActicle(final String title, Final String opening, Final URL coverUrl, Final ActicleType type, Final ActicleColumn column, Final String protagonists, Final String Tags, Final boolean已完成) { ... Acticle acticle = Acticle.builder .title(标题) .introduction(简介) .coverUrl(coverUrl) .type(type) .column(column) .protagonists(主角) .tags(tags) .已完成(已完成).build(); this.repository.save(acticle); }参数列表包含了一个博客必须有的各种信息,比如:博客标题、简介、封面网址、类型、归属栏、主角名、标签、是否完成……如果你只是想了解其中的逻辑,你可能也觉得这个参数列表相当不错。它将创建博客所需的所有信息传递给该方法,这就是大多数人的想法。
查看一段代码时了解问题的最初视角。虽然这样写代码很容易让人理解,但是还不足以让你发现问题。
现在产品要求在博客中添加一条信息来表明这个博客是否免费。我应该怎么办?很简单!我直接添加一个参数。
很多屎就是这样来的,一点点积少成多,量变引发质变!这里的所有参数都是创建博客所必需的,所以可以做的就是将这些参数封装成一个类,一个创建博客的参数类: 代码语言:javascript copy public class NewActicleParamters { private String title; } private String介绍;私有 URL coverUrl;私有 ActicleType 类型;私人 ActicleColumn 专栏;私人弦乐主角;私有字符串标签;私有布尔值已完成; ... }参数列表中只剩下一个参数: 代码语言:javascript copy public void createActicle(final NewActicleParamters parameters) { ... }那么,将参数列表封装成一个对象!只要将一个参数列表封装成一个类,然后在使用这些参数的时候,就需要将它们一一取出来。这不是没有必要吗?像这样: 代码语言: javascript copy public void createActicle(final NewActicleParamters parameters) { ... Acticle acticle = Acticle.builder .title(parameters.getTitle()) .introduction(parameters.getIntroduction()) .coverUrl(parameters. getCoverUrl ()) .type(parameters.getType()) .channel(parameters.getChannel()) .protagonists(parameters.getProtagonists()) .tags(parameters.getTags()) .completed(parameters.isCompleted()) .build(); this.repository.save(acticle); } 如果你这样想,说明我们还没有形成对软件设计的理解。
我们不仅仅是简单地将参数封装到类中。从设计的角度来看,这里介绍的是一种新的模式。
模型的封装应该基于[行为]。以前没有这样的模型,所以我无法想象它应该有什么行为。
现在模型已经制作出来了,它应该有自己的支持行为。该模型的行为是构造一个博客对象,代码可以进一步重构: 代码语言: javascript copy public class NewActicleParamters { private String title; private String介绍;私有 URL coverUrl;私有 ActicleType 类型;私人 ActicleColumn 专栏;私人字符串主角;私有字符串标签;私有布尔值已完成; public Acticle newActicle() { return Acticle.builder .title(标题) .introduction(简介) .coverUrl(coverUrl) .type(type) .column(column) .protagonists(主角) .标签(标签) .completed(完成) .build(); } }创建博客的方法大大简化: 代码语言:javascript copy public void createActicle(final NewActicleParamters parameters) { ... Acticle acticle =parameters.newActicle( ); this.repository.save(acticle);这样一旦后续需求扩展,需要添加创建博客所需的内容,参数列表就保持不变,也就稳定了! 3.2 动静分离 如果这个品类继续扩大,变成一个大品类怎么办?毕竟,并不是所有场景下所有参数都属于同一个类: 代码语言:javascript copy // 根据博客ID获取对应的章节信息 public void getSections(final long acticleId,最终HttpClient httpClient,最终SectionProcessor处理器) { HttpUriRequest request = createChapterRequest(acticleId); HttpResponse 响应 = httpClient.execute(request); List
如果只看这个方法,很难发现直接问题。绝对数量不是核心,参数列表应该尽可能小。
但是注意传入的每个参数:acticleId随着不同的请求而变化,但是httpClient和processor这两个参数是一样的,因为他们的逻辑是一样的,没有变化。即acticleId的变化频率与httpClient和processor这两个参数的变化频率不同。
不同方向的数据变化也带来不同的关注点。这里显示的是典型的动态数据(acticleId)和静态数据(httpClient、processor)。
它们是不同的关注点,应该分开。对于这种情况:静态且未改变的数据完全可以成为该方法所在类的字段。
只需将每个更改作为参数传递即可。因此,代码可以重构如下: 代码语言:javascript copy public void getSections(final long acticleId) { HttpUriRequest request = createChapterRequest(acticleId); HttpResponse 响应 = this.httpClient.execute(request); List
虽然很长的参数列表可以用一个类来封装,但是封装到这个类中的前提是这些参数属于同一个类,并且有相同的变化原因!如果该方法的参数有不同的变化频率,则视情况而定。对于静态部分,本节的案例已经表明它可以成为软件结构的一部分,如果有多个变化频率,还可以封装多个参数类。
3.3 再见,马克!代码语言: javascript copy public void editSection(final longsectionId, Final String title, Final String content, Final boolean apporved) { ... }要修改的章节的ID、标题和内容。最后一个参数表示是否直接审核此修改。
经过。前几个参数是修改章节的必要信息,重点是最后一个参数。
从业务角度来说,如果是作者编辑,后面就会审稿,但是如果是编辑编辑,审稿会直接通过,因为编辑自己就扮演了审稿人的角色。于是,你发现这个参数其实是一个flag,表示后续的处理流程会有所不同。
使用标记参数是程序员在刚接触编程时常用的一种技术。正是这种简单易用的方法使得标志可以在代码中自由浮动。
不仅变量中有标记,参数也有标记。许多长参数列表包含各种标记参数。
在实际代码中,必须仔细确定每个标签的当前值,然后才能对其进行正确处理。解决标记参数问题的一个简单方法是将标记参数表示的不同路径进行分割。
这里的一种方法可以分为两种方法,一种方法负责“普通编辑”,另一种方法负责“可直接审核批准的编辑”。代码语言: javascript copy // 普通编辑需要审核 public void editSection(final longsectionId, Final String title, Final String content) { ... } 代码语言: javascript copy // 直接审核编辑 public void editSectionWithApproval( Final longsectionId, Final String title, Final String content) { ... }标签参数在代码中以多种形式存在,其中一些是布尔值、枚举值、字符串或整数。
它们可以通过分裂方法分开。在重构中,这种技术称为删除标志参数。
只有短代码我们才能更好的掌握,而写短代码就需要能够“分离关注点”。 4 总结 处理长参数列表的主要方法是减少参数数量。
最直接的方式就是将参数列表封装成一个类。但这并不意味着所有情况都可以通过封装成类来解决。
我们还需要分析所有参数是否具有相同的变化频率。如果变化频率相同,则封装成一个类。
变化的频率不同:静态的、不变的,可以成为一个软件结构;分为多个变化频率,可以封装成几个类。标记参数经常出现在参数列表中。
根据这些标记的参数,可以将该方法拆分为多个方法。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-17
06-18
06-17
06-17
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用