解决气味

有时我们可能会在代码库中遇到一些巨大的if语句。 这些语句必须维护并一次又一次地更改相同的代码块。 在if语句检查变量是否属于某个值范围内的情况下,这也是常见的。

假设您有一个枚举

public enum FoodType {FRUIT,VEGETABLES,RED_MEAT,WHITE_MEAT,FISH,DIARY,CERIAL
}

并且您有一个功能可以提出一些建议

public String recommend(FoodType foodType) {if(foodType==FoodType.FISH||foodType==FoodType.RED_MEAT||foodType==FoodType.WHITE_MEAT) {//execute a procedure} else if(foodType==FoodType.FRUIT||foodType==FoodType.VEGETABLES) {//execute a procedure} else {//execute a procedure}}

如您所见,现在已做出决定。 该决定与碰巧属于特定人群的某些类型的食物有关。
鱼,红肉和白肉对那些偏爱蛋白质的用户有益,而水果和蔬菜更适合以纤维为基础的饮食。
在将来的情况下,可能会增加该枚举,并添加更多的食物类型。 如果代码块必须更改。 同样,如果在其他文件中使用了这种复杂的if语句,则必须更改每个文件。 不仅您将拥有巨大的if块,而且还必须在每个文件上维护一个块,这可能容易出错。

为了避免这种情况,您可以将if语句的内容更改为一个函数。

package com.gkatzioura;import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;import static com.gkatzioura.FoodType.*;public class DietFilter {private static final Set FOODS_WITH_PROTEIN = Collections.unmodifiableSet(new HashSet(Arrays.asList(FISH,RED_MEAT,WHITE_MEAT)));private static final Set FOODS_WITH_FIBER = Collections.unmodifiableSet(new HashSet(Arrays.asList(FRUIT,VEGETABLES)));public static boolean proteinBased(FoodType foodType) {return FOODS_WITH_PROTEIN.contains(foodType);}public static boolean fiberBased(FoodType foodType) {return FOODS_WITH_FIBER.contains(foodType);}}

因此,我们没有在if语句中添加每种食物类型的案例,而是创建了一个函数来检查给定的参数是否属于特定组。

因此,您的if语句将变为此。

public String recommend(FoodType foodType) {if(DietFilter.proteinBased(foodType)) {//execute a procedure} else if(DietFilter.fiberBased(foodType)) {//execute a procedure} else {//execute a procedure}}

如果将更多食物类型添加到枚举中,则开发人员将只需更改集合的结构并添加额外的食物类型。
这将比更改代码的多个部分容易得多,并且可读性更高。

翻译自: https://www.javacodegeeks.com/2018/07/fixing-if-smell.html

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

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

相关文章

「协方差」与「相关系数」的概念

一、协方差: 可以通俗的理解为:两个变量在变化过程中是同方向变化?还是反方向变化?同向或反向程度如何? 你变大,同时我也变大,说明两个变量是同向变化的,这时协方差就是正的。 你…

【渝粤题库】国家开放大学2021春3929电气安全技术题目

试卷代号:3929 2021年春季学期期末统一考试 电气安全技术 试题(开卷) 2021年7月 一、单选题(每小题3分,共30分) 1.定时过电流保护的动作电流应躲过( )。 A.线路末端的最大短路电流 B.线路末端的最小短路电流…

【渝粤题库】国家开放大学2021春4010渠道管理题目

试卷代号:4010 2021年春季学期期末统一考试 渠道管理 试题 2021年7月 一、单项选择题(在备选答案中,有一个正确答案,请将正确答案的字母填入括号内。每小题2分,共20分) 1.渠道管理人员一般位于企业的中低层…

在matlab中输出、读取多个文件

%% 输出及读取多个文件 % filepathD:\new\;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 输出多个文件 t_start 1; % start time t_end 100; % ending time min arr_rate 50; % data arrival rate at HAP******* for k1:5 M int2str(k); N .txt.; L ./; output [L M N];…

【渝粤题库】广东开放大学 外贸会计1 形成性考核

选择题 题目: 题干 下列选项中,属于反映会计信息的基本过程和手段的是()。 选择一项或多项: 题目: 当受益人对信用证开证行能否有效执行付款缺乏信心时,受益人可以要求开证申请人另外申请一家…

垃圾收集 java_关于Java垃圾收集

垃圾收集 java本文讨论的是使用的最流行的框架之一带来的开销–我敢打赌,几乎没有应用程序不使用java.util.Collections。 本文基于以下事实:框架为例如集合的初始大小提供了默认值。 因此,我们有一个假设,即大多数人不会费心地自…

在git bush中如何退出vim编辑器

编辑器有三种模式: 命令行模式末行模式输入模式 常用命令 按Esc退出输入模式进入命令行模式也是系统默认模式。 o,i,a都可以进入输入模式。在命令模式下键入ZZ或者:wq保存修改并且退出 。如果只想保存文件,则键入:w&#xff0c…

【渝粤题库】广东开放大学 互联网营销 形成性考核

选择题 题目:下面的哪个调研内容属于经济环境调研?() 题目:()的目的就是加强与客户的沟通,它是是网络媒体也是网络营销的最重要特性。 题目:4Ps策略中4P是指产品、价格、…

【渝粤题库】广东开放大学 信息安全数学基础 形成性考核 (2)

选择题 题目:2.设a,b都是非零整数,若a|p,b|a, 则( ) . 题目:3.大于20且小于50的素数有()个. 题目:4.下列四个选项中,( ) 是安全素数. 题目:5.设b6,则余数r ( )为最小正余数. 题目:16…

带Spring Boot的GWT

介绍 我最近一直在研究用Java编写UI代码的选项。 在我以前的文章中,我研究了Eclipse RAP,发现它可以与Spring Boot集成在一个可执行jar中。 这次我想对GWT做同样的技巧。 每个人都喜欢Spring Boot。 它使很多事情变得更加干净和容易。 但是从历史上看&a…

matlab中统计数组中各数字(元素)出现的次数

1. tabulate 调用MATLAB自带的函数tabulate统计一个数组中各数字(元素)出现的频数、频率 【例1】统计数值型数组中各元素出现的频数、频率。 >> x [2 2 6 5 2 3 2 4 3 4 3 4 4 4 4 2 26 0 4 7 2 5 8 3 1 3 2 5 3 …

【渝粤题库】广东开放大学 大学英语B 形成性考核

选择题 题目: Do you still get free plastic bags from the supermarkets? Things have changed. China has banned free plastic bags at shops and supermarkets, and people have to pay for using plastic bags. The rule started on June 1. It came becaus…

Latex \bibliographystyle+修改字体字号的大小

1. bibliography style LaTeX 标准选项及其样式共有以下8种: plain ,按字母的顺序排列,比较次序为作者、年度和标题. unsrt ,样式同plain,只是按照引用的先后排序. alpha ,用作者名首字母年份后两位作标号…

【渝粤题库】广东开放大学 文化产业经济学 形成性考核

选择题 题目:受传统文化影响,中国的父母生孩子的意义和其他国家截然不同。父母一方面节衣缩食给孩子提供最好的物质条件,一方面对孩子"四体不勤”给予最大的宽容。这说明()。 题目:当今国际竞争的实质…

【渝粤题库】广东开放大学 标准的研制与编制 形成性考核

​👉关注我,看答案👈 选择题 题目:采纳( )制定为本国标准,可将国外先进标准转化为国内标准。 题目:标准的编制包括了标准的( )及标准三稿的形成过程。 题目:编制标准通常在此前已有标…

boxplot

1. 简介 箱形图,又称为盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分散情况资料的统计图。箱形图于1977年由美国著名统计学家约翰图基(John Tukey)发明。它能显示出一组数据的最大值、最小值、中位数、上下四分位数及…

【渝粤题库】广东开放大学 社会学基础 形成性考核

选择题 题目: 在1838年出版的《实证哲学教程》第四卷中,孔德第一次提出了"社会学”这一术语。( ) 选择一项: 题目: 家庭这种群体之所以经久不衰,就在于它具有满足人类个体和社会需求的一…

Java 11的期望

过去的几年对Java世界一直是动荡不安的,在相当多的发行版中添加了各种各样的功能。 在开发人员社区中,人们逐渐意识到Java的开发速度不够快。 在最初的20年中,Java平台和Java开发工具包(JDK)经历了庞大,不…

MATLAB 在一个数组中随机选择n个数

MATLAB 中在一个数组内随机选择n个数。 例如:在 A [10, 50, 80, 100, 130, 260] 中随机选择5个数。 允许重复: n 5; A [10, 50, 80, 100, 130, 260]; random_num A(randi(numel(A),1,n)); random_num sort(random_num);不允许重复: …

【渝粤题库】广东开放大学photoshop图像处理 形成性考核

题目: 使用变换命令中的缩放命令时,按住哪个键可以保证等比例缩放?( ) 题目: 将前景色和背景色恢复为默认颜色的快捷键是()? 题目: Photoshop中“图像尺寸”…