我的代码中有一些逻辑,我想知道是否有更好的方法来重写它。我有两个用户定义的服务器对象(serverA和serverB),如果它们都是enum ServerType
Web
或Database
,我想继续。
目前的代码很笨:
if((serverA.ServerType == ServerType.Web || serverA.ServerType == ServerType.Database) && (serverB.ServerType == ServerType.Web || serverB.ServerType == ServerType.Database))
{
// do stuff
}
我正在以优雅简洁的方式写作。
答案 0 :(得分:5)
我在用户定义的服务器对象中有一个新属性
public class Server
{
public ServerType ServerType { get; set; }
public bool IsDatabaseOrWeb
{
get
{
return ServerType == ServerType.Web || ServerType == ServerType.Database;
}
}
}
然后你的功能看起来像这样
if (serverA.IsDatabaseOrWeb && serverB.IsDatabaseOrWeb)
{
// do stuff
}
答案 1 :(得分:2)
这样就可以更明确地说明您正在询问有关两台服务器的相同问题,并允许您根据需要在一个地方更改条件。
if(IsRightType(serverA) && IsRightType(serverB))
{
// do stuff
}
bool IsRightType(Server server)
{
return server.ServerType == ServerType.Web || server.ServerType == ServerType.Database;
}
答案 2 :(得分:0)
也许以下解决方案会更优雅。实现一个抽象类,以便所有服务器对象都从它继承。
public enum ServerType
{
Web,
Database,
SomethingElse
}
public class ServerA : ServerObject
{
}
public class ServerB : ServerObject
{
}
public abstract class ServerObject
{
public ServerType ServerType { get; set; }
}
然后实现一个方法来检查一个对象是否符合你的条件。
public bool IfWebOrDatabase(ServerObject so)
{
return so.ServerType == ServerType.Web || so.ServerType == ServerType.Database;
}
然后使用更短版本的If
。
if (IfWebOrDatabase(serverA) && IfWebOrDatabase(serverB))
{
// do stuff
}
答案 3 :(得分:0)
类似的方法是使用enum ServerType
的扩展方法。编写代码的可能方法如下:
public enum ServerType
{
Web,
Database,
Bi
}
public static class Extensions
{
public static bool IsOperational(this ServerType st)
{
var operationalTypes = new List<ServerType> { ServerType.Web, ServerType.Database };
return operationalTypes.Contains(st);
}
}
class Program
{
static void Main(string[] args)
{
var st1 = ServerType.Web;
var st2 = ServerType.Database;
var st3 = ServerType.Bi;
bool isSt1Operational = st1.IsOperational();
bool isSt2Operational = st2.IsOperational();
bool isSt3Operational = st3.IsOperational();
}
}
答案 4 :(得分:0)
向包含ServerType的类添加属性:
public bool IsDatabaseOrWeb
{
get
{
return (ServerType == ServerType.Web || ServerType == ServerType.Database);
}
}
然后使用它:
if(ServerA.IsDatabaseOrWeb && ServerB.IsDatabaseOrWeb)
{
}
答案 5 :(得分:0)
您应该在这些答案中注意到的趋势是解决方案比问题更糟糕。如果你想在linq中使用lambda表达式,那就更糟了:
if (new Server[] { serverA, serverB }.All(s => new ServerType[] { ServerType.Web, ServerType.Database }.Contains(s.ServerType)))
{
}
即使你把它分开:
var badIdea = new Server[] { entity, serverB };
var alsoBad = new ServerType[] { ServerType.Web, ServerType.Database };
if (badIdea.All(s => alsoBad.Contains(s.ServerType)))
{
}
有时候最简单的表达方式仍然很混乱。你的if语句没有改变。也许只是在中间放一个回车,这样你就可以一次在屏幕上看到它。
答案 6 :(得分:0)
Bitflags可能会有帮助。
[Flags]
public enum ServerType
{
None = 0,
Web=1,
Database = 2,
Other = 4
}
使用它
var flags = ServerType.Web | ServerType.Database;
var bothWebOrDb = (serverA.ServerType & flags)
& (serverB.ServerType & flags);
if (bothWebOrDb != ServerType.None)
{
}
将其简化为以下
var flags = ServerType.Web | ServerType.Database;
var bothWebOrDb = serverA.ServerType & serverB.ServerType & flags;
if (bothWebOrDb != ServerType.None)
{
}