如果变量可以取n个值,我们应该检查值的有效性,或者假设如果所有n-i检查都失败,那么它将是第n个值。
例如,如果我们有一个将性别存储为M或F的变量。请使用:
If gender = "M"
do male_processing
else
do female_processing
endif
或者这个:
If gender = "M"
do male_processing
else
if gender = "F"
do female_processing
else
print "Something has gone wrong Gender has a value " Gender
endif
endif
答案 0 :(得分:10)
对于那个例子,我根本不会使用IF,我会使用SWITCH作为你的第二个例子
switch (gender)
case "M":
do male_processing
break
case "F":
do female_processing
break
default:
print "Something has gone wrong Gender has a value " Gender
endswitch
或者对于您的第一个示例,我只是使用ASSERT将异常视为错误
assert (gender = "M" or gender = "F")
答案 1 :(得分:4)
很快 - 这取决于变量的类型。如果它是某种类型的布尔值或枚举,并且没有其他值(包括null
),则一个简单的else
子句就足够了。
你甚至可以添加一个简单的评论:
if male:
do_male_stuff()
else: #obviously female
do_female_stuff()
有这样的事情似乎错了:
bool = SOME_BOOLEAN_VALUE
if bool:
do1()
elif not bool:
do2()
else:
huh() #?!?!
底线:为每种可能的方案都有if
/ else
/ else if
子句,但不超过,并保持可读性。< / p>
答案 2 :(得分:2)
...或者,在OO世界中,您可以创建一个基类,比如Gender
并使用Male
和Female
类扩展它。您可以分配一个男性或女性类的实例,而不是将值“M”或“F”赋值给变量。然后只需调用基类中指定的方法,例如doGenderSpecificStuff()
。那里不需要if-elses。
答案 3 :(得分:1)
对于这种类型的构造,我喜欢使用switch语句。不是因为它更短(它不是),而是更具可读性(恕我直言):
switch(gender) {
case "M":
doMaleSpecificStuff();
break;
case "F":
doFemaleSpecificStuff();
break;
default:
throw AnyError;
}
答案 4 :(得分:1)
如果gendre的值只能是“M”或“F”,那么您可以使用断言来明确这一点:
Assert(gender = "M" OR gender = "F")
If gender = "M"
do male_processing
else
do female_processing
endif
答案 5 :(得分:1)
如果您使用枚举类型,那么它将只具有您期望的值,并且您不必在IF中处理意外值,仅在分配时。
答案 6 :(得分:0)
如果可以使用除M或F之外的第三个值,则应使用第二个表格。如果被测变量属于只能取值M和F的类型,则应使用第一个。
答案 7 :(得分:0)
在枚举处理数据类型的各种可能形式的方法时,如果语言支持,则应使用模式匹配,否则,应使用switch语句(穷人的模式匹配)。这样做的主要原因是,如果使用更多可能的表单扩展数据类型,则需要在编译时警告不完整的模式匹配(或switch语句)。因此,如果数据类型需要扩展,您可以轻松地知道你很快就会发现它。
不幸的是,使用默认情况会撤消此类好处,因此在大多数情况下,您应该更明确地枚举所有已知的可能性。
答案 8 :(得分:0)
如果有'F'或'M'的用户输入,那么你应该威胁3个场景,即。 F,M等。如果没有用户输入,您可以使用两个并具有bool值,即。 if语句的isMale,因此它更具可读性。
答案 9 :(得分:0)
尝试检查输入并尽快标准化,然后您可以安全地使用第一个选项。
如果您的用户界面允许输入此变量(例如文本框),那么在您的示例中,您可以获得“M”,“男性”,“男性”,“男孩”或“Männlich”在考虑到有人可能会提供一个愚蠢的答案之前,尽可能为男性提供诚实的投入。通过在需要使用这些值之前检查(并规范化)这些值,您可以向用户提供更具响应性的反馈。
如果您的用户界面将其限制为单选按钮,则它甚至更早就会标准化。
如果从某种数据存储中获取值,则根据应用程序以及您对该数据存储的完整性的了解,在执行操作之前检查记录的有效性可能有也可能没有任何价值根据其中的价值观。
如果大多数记录可能符合,并且各种值调用的操作便宜且可逆,我将使用第二个选项,并在值不合适时抛出异常。