另一个投票,如果/否则。我不是一个案例或转换陈述的超级粉丝,因为有些人不使用它们。如果使用 case 或 switch,则代码的可读性较差。也许对您来说不是不易读,而是对那些从来不需要使用命令的人来说。
对象工厂也是如此。
If/else 块是每个人都会得到的一个简单构造。有一些事情你可以做,以确保你不会造成问题。
首先——不要尝试多次缩进 if 语句。如果你发现自己在缩进,那么你就做错了。
if a = 1 then
do something else
if a = 2 then
do something else
else
if a = 3 then
do the last thing
endif
endif
endif
真的很糟糕-这样做,而不是。
if a = 1 then
do something
endif
if a = 2 then
do something else
endif
if a = 3 then
do something more
endif
让优化见鬼去吧,它对你的代码速度没有太大的影响。
其次,只要有足够多的 break 语句分散在特定的代码块中,使其显而易见,我并不反对突破 If 块
procedure processA(a:int)
if a = 1 then
do something
procedure_return
endif
if a = 2 then
do something else
procedure_return
endif
if a = 3 then
do something more
procedure_return
endif
end_procedure
关于 Switch 以及为什么我认为它很难理解:
下面是 switch 语句的一个例子..。
private void doLog(LogLevel logLevel, String msg) {
String prefix;
switch (logLevel) {
case INFO:
prefix = "INFO";
break;
case WARN:
prefix = "WARN";
break;
case ERROR:
prefix = "ERROR";
break;
default:
throw new RuntimeException("Oops, forgot to add stuff on new enum constant");
}
System.out.println(String.format("%s: %s", prefix, msg));
}
对我来说,这里的问题是,应用于类似 C 语言的正常控制结构已经完全被打破了。如果想在控件结构中放置多行代码,一般规则是使用大括号或 start/end 语句。
例如:。
for i from 1 to 1000 {statement1; statement2}
if something=false then {statement1; statement2}
while isOKtoLoop {statement1; statement2}
对于我来说(如果我错了,您可以纠正我) ,Case 语句将这条规则抛出窗外。有条件执行的代码块不放在 start/end 结构中。正因为如此,我相信 Case 在概念上的不同足以不被使用。
class RequestHandler {
public void handleRequest(int action) {
switch(action) {
case LOGIN:
doLogin();
break;
case LOGOUT:
doLogout();
break;
case QUERY:
doQuery();
break;
}
}
}
interface Command {
public void execute();
}
class LoginCommand implements Command {
public void execute() {
// do what doLogin() used to do
}
}
class RequestHandler {
private Map<Integer, Command> commandMap; // injected in, or obtained from a factory
public void handleRequest(int action) {
Command command = commandMap.get(action);
command.execute();
}
}
int state;
String getString() {
switch (state) {
case 0 : // behaviour for state 0
return "zero";
case 1 : // behaviour for state 1
return "one";
}
throw new IllegalStateException();
}
double getDouble() {
switch (this.state) {
case 0 : // behaviour for state 0
return 0d;
case 1 : // behaviour for state 1
return 1d;
}
throw new IllegalStateException();
}
public class Animal
{
public abstract void Speak();
}
public class Dog : Animal
{
public virtual void Speak()
{
Console.WriteLine("Hao Hao");
}
}
public class Cat : Animal
{
public virtual void Speak()
{
Console.WriteLine("Meauuuu");
}
}
下面是如何使用它(用你的代码) :
foreach (var animal in zoo)
{
echo animal.speak();
}
function getItemPricing(customer, item) {
switch (customer.type) {
// VIPs are awesome. Give them 50% off.
case 'VIP':
return item.price * item.quantity * 0.50;
// Preferred customers are no VIPs, but they still get 25% off.
case 'Preferred':
return item.price * item.quantity * 0.75;
// No discount for other customers.
case 'Regular':
case
default:
return item.price * item.quantity;
}
}