这个问题的动机是我最近开始看到的有点过于if..else if..else结构的东西.虽然它很简单并且有其用途,但它的一些东西不断告诉我它可以用更精细,优雅和通常更容易保持最新的东西代替.
为了尽可能具体,这就是我的意思:
if (i == 1) {
doOne();
} else if (i == 2) {
doTwo();
} else if (i == 3) {
doThree();
} else {
doNone();
}
Run Code Online (Sandbox Code Playgroud)
我可以想到两种简单的方法来重写它,或者通过三元(这只是编写相同结构的另一种方式):
(i == 1) ? doOne() :
(i == 2) ? doTwo() :
(i == 3) ? doThree() : doNone();
Run Code Online (Sandbox Code Playgroud)
或使用Map(在Java中,我认为在C#中)或字典或任何其他K/V结构,如下所示:
public interface IFunctor() {
void call();
}
public class OneFunctor implemets IFunctor() {
void call() {
ref.doOne();
}
}
/* etc. */
Map<Integer, IFunctor> methods = new …Run Code Online (Sandbox Code Playgroud) 所以我有3个不同的变量。
model 是一个字符串并定义了 iPhone 模型。
storage 是一个定义电话存储的整数。
最后是价格,它是一个定义手机价格的整数。
例子:
model = iPhone 7
storage = 64 (GB)
price = 700 ($)
Run Code Online (Sandbox Code Playgroud)
另一个例子:
model = iPhone 5s
storage = 16
price = 150
Run Code Online (Sandbox Code Playgroud)
现在我想让我的程序通知我是否可以通过购买和转售来达成一笔好交易,我的问题是我如何以最有效的方式做到这一点?
我知道我可以使用 if 语句,但是有什么方法可以避免我编写大量不同的 if 或 elif 语句?
例子:
if model == "iPhone 7" and storage == 64 and price <= 700:
print("do_something")
Run Code Online (Sandbox Code Playgroud)
这只是 1 个模型和存储选项的大量代码。如果我要使用这种方法,我将不得不再写 29 个。
我已经阅读了很多关于代码重构和避免if else语句的主题.实际上,我有一个班级,我使用了很多if - else条件.
private static String getXSIType(String fieldType) {
if ("_freeFormText".equals(fieldType) || "_eMailAddress".equals(fieldType) || "_help".equals(fieldType)
|| "_hyperlink".equals(fieldType) || "_inlineText".equals(fieldType) || "_longText".equals(fieldType)
|| "_password".equals(fieldType) || "_phoneNumber".equals(fieldType) || "_richText".equals(fieldType)
|| "_textArea".equals(fieldType)) {
return "platformCore:StringCustomFieldRef";
} else if ("_integerNumber".equals(fieldType)) {
return "platformCore:LongCustomFieldRef";
} else if ("_multipleSelect".equals(fieldType)) {
return "platformCore:MultiSelectCustomFieldRef";
} else if ("_document".equals(fieldType) || "_listRecord".equals(fieldType) || "_image".equals(fieldType)) {
return "platformCore:SelectCustomFieldRef";
} else if ("_currency".equals(fieldType) || "_decimalNumber".equals(fieldType)
|| "_percent".equals(fieldType)) {
return "platformCore:DoubleCustomFieldRef";
} else if ("_checkBox".equals(fieldType)) {
return "platformCore:BooleanCustomFieldRef";
} else if ("_date".equals(fieldType) …Run Code Online (Sandbox Code Playgroud) 在我的程序中,我需要检查变量是否等于1,2或3,并根据结果执行不同的方法:
if (phase.equals("1")) {
PhaseOne.performPhase(inputParser.getSource(), inputParser.getTarget());
} else if (phase.equals("2")) {
PhaseTwo.performPhase(inputParser.getSource(), inputParser.getTarget());
} else {
PhaseThree.performPhase(inputParser.getSource(), inputParser.getTarget());
}
Run Code Online (Sandbox Code Playgroud)
这段代码非常简单和基本,但我真的不喜欢它.当然我可以使用切换条件,但在我看来,它会以不同的方式显示相同的基本功能.
我的问题是:有没有办法以优雅和可扩展的方式实现该功能?
仅供参考,我已经发布了这篇文章,但我没有找到适合我的问题的答案.