仅当条件时,我如何重构多个
how can i refactor multiple only if condition
在这里,我想一一检查对象的所有属性,并检查它是否 NAN
而不是应用一些逻辑,否则跳过每个属性。
为此我必须做多个如果。有更好的方法吗?
internal class cls_pro
{
public double A;
public double B;
public double C;
public double D;
public double E;
public double F;
}
class Program
{
static void Main(string[] args)
{
cls_pro obj = new cls_pro();
obj.A = 1;
obj.B = 3;
obj.C = 1;
obj.D = 23;
obj.E = double.NaN;
obj.F = double.NaN;
// If propertie is not null some logic will apply
if (!double.IsNaN(obj.A)) { ;}
if (!double.IsNaN(obj.B)) { ;}
if (!double.IsNaN(obj.C)) { ;}
if (!double.IsNaN(obj.D)) { ;}
if (!double.IsNaN(obj.E)) { ;}
if (!double.IsNaN(obj.F)) { ;}
Console.ReadLine();
}
}
嗯,领域像A
,...,F
是私事 cls_pro
class;这就是为什么我建议 moving all
if (!double.IsNaN(obj.A)) { ;}
和类似调用 cls_pro
(让我们 将其重命名 为 ClsPro
):
internal class ClsPro {
//DONE: do not expose fields, but properties
public double A { get; }
public double B { get; }
public double C { get; }
public double D { get; }
public double E { get; }
public double F { get; }
public ClsPro(double a = double.NaN,
double b = double.NaN,
double c = double.NaN,
double d = double.NaN,
double e = double.NaN,
double f = double.NaN) {
A = a;
B = b;
C = c;
D = d;
E = e;
F = f;
}
public void PerformA() {
if (double.IsNaN(A)) return;
/* Some logic here*/
}
...
public void Perform() {
PerformA();
...
PerformF();
}
}
执行时间:
class Program
{
static void Main(string[] args)
{
ClsPro obj = new ClsPro(
a : 1,
b : 3,
c : 1,
d : 23
);
obj.Perform();
Console.ReadLine();
}
}
您应该使用没有更好的方法。
应用程序的每个基于条件的逻辑都可以用 3 种不同的方法构建:
If-else 分支
if (appliable) { /* do something */ }
else { /* do something different */ }
If-else 最适合短逻辑分支。如果你没有那么多条件,这是一个很好的工具。
切换分支
switch (logLevel)
{
case LogLevel.Fatal:
errorLogger.Fatal(exception);
break;
case LogLevel.Error:
errorLogger.Error(exception, message);
break;
case LogLevel.Warning:
logger.Warn(message);
break;
case LogLevel.Info:
logger.Info(message);
break;
case LogLevel.Debug:
logger.Debug(message);
break;
case LogLevel.Trace:
logger.Trace(message);
break;
default:
throw new ArgumentOutOfRangeException(nameof(level), level, null);
}
通常,switch
用于中等逻辑分支或模式匹配(C# 8.0 对此有更好的语法)。如果我有中等大小的逻辑分支 - 我更喜欢使用它。
策略模式
如果你有一个大的逻辑分支 - 你必须使用策略模式。
这个模式很简单:
public class StrategyUser
{
private IStrategy strategy;
public StrategyUser(IStrategy strategyToUse)
{
this.strategy = strategyToUse;
}
public void SetNewStrategy(IStrategy newStrategy)
{
this.strategy = newStrategy;
}
}
策略可用于摆脱 if-else 地狱。您也可以直接在运行时更改 stretegy 以更改对象行为。
我认为您的任务最好的方法是使用 if
分支。比较合适。
在这里,我想一一检查对象的所有属性,并检查它是否 NAN
而不是应用一些逻辑,否则跳过每个属性。
为此我必须做多个如果。有更好的方法吗?
internal class cls_pro
{
public double A;
public double B;
public double C;
public double D;
public double E;
public double F;
}
class Program
{
static void Main(string[] args)
{
cls_pro obj = new cls_pro();
obj.A = 1;
obj.B = 3;
obj.C = 1;
obj.D = 23;
obj.E = double.NaN;
obj.F = double.NaN;
// If propertie is not null some logic will apply
if (!double.IsNaN(obj.A)) { ;}
if (!double.IsNaN(obj.B)) { ;}
if (!double.IsNaN(obj.C)) { ;}
if (!double.IsNaN(obj.D)) { ;}
if (!double.IsNaN(obj.E)) { ;}
if (!double.IsNaN(obj.F)) { ;}
Console.ReadLine();
}
}
嗯,领域像A
,...,F
是私事 cls_pro
class;这就是为什么我建议 moving all
if (!double.IsNaN(obj.A)) { ;}
和类似调用 cls_pro
(让我们 将其重命名 为 ClsPro
):
internal class ClsPro {
//DONE: do not expose fields, but properties
public double A { get; }
public double B { get; }
public double C { get; }
public double D { get; }
public double E { get; }
public double F { get; }
public ClsPro(double a = double.NaN,
double b = double.NaN,
double c = double.NaN,
double d = double.NaN,
double e = double.NaN,
double f = double.NaN) {
A = a;
B = b;
C = c;
D = d;
E = e;
F = f;
}
public void PerformA() {
if (double.IsNaN(A)) return;
/* Some logic here*/
}
...
public void Perform() {
PerformA();
...
PerformF();
}
}
执行时间:
class Program
{
static void Main(string[] args)
{
ClsPro obj = new ClsPro(
a : 1,
b : 3,
c : 1,
d : 23
);
obj.Perform();
Console.ReadLine();
}
}
您应该使用没有更好的方法。
应用程序的每个基于条件的逻辑都可以用 3 种不同的方法构建:
If-else 分支
if (appliable) { /* do something */ }
else { /* do something different */ }
If-else 最适合短逻辑分支。如果你没有那么多条件,这是一个很好的工具。
切换分支
switch (logLevel)
{
case LogLevel.Fatal:
errorLogger.Fatal(exception);
break;
case LogLevel.Error:
errorLogger.Error(exception, message);
break;
case LogLevel.Warning:
logger.Warn(message);
break;
case LogLevel.Info:
logger.Info(message);
break;
case LogLevel.Debug:
logger.Debug(message);
break;
case LogLevel.Trace:
logger.Trace(message);
break;
default:
throw new ArgumentOutOfRangeException(nameof(level), level, null);
}
通常,switch
用于中等逻辑分支或模式匹配(C# 8.0 对此有更好的语法)。如果我有中等大小的逻辑分支 - 我更喜欢使用它。
策略模式
如果你有一个大的逻辑分支 - 你必须使用策略模式。
这个模式很简单:
public class StrategyUser
{
private IStrategy strategy;
public StrategyUser(IStrategy strategyToUse)
{
this.strategy = strategyToUse;
}
public void SetNewStrategy(IStrategy newStrategy)
{
this.strategy = newStrategy;
}
}
策略可用于摆脱 if-else 地狱。您也可以直接在运行时更改 stretegy 以更改对象行为。
我认为您的任务最好的方法是使用 if
分支。比较合适。