如果之前曾詢問過,請致歉;我甚至用正確的術語來解決問題/目標。重構複雜FlagsAttribute按位檢查
我Person
對象...
public class Person
{
public string FullName { get; set; }
public HeroAbilities Abilities { get; set; }
public SuperHero Hero { get; set; }
}
...每個Person
有一系列的能力,使他們潛在的超級英雄:
[FlagsAttribute()]
public enum HeroAbilities : long
{
None = 0,
Strong = 1,
Fly = 2,
WarpSpeed = 4,
Crazy = 8
}
一旦我知道他們的能力是,我可以讓他們成爲一個合適的英雄:
public class SuperHero
{
public string Name { get; set; }
}
對於e xample,這裏是我聲明瞭兩個Person
對象,檢查每一個:
// Simple check: person should travel at warp speed
var p1 = new Person() { FullName = "Barry Allen", Abilities = HeroAbilities.Strong | HeroAbilities.WarpSpeed };
if(p1.Abilities.HasFlag(HeroAbilities.WarpSpeed))
{
p1.Hero = new SuperHero() { Name = "The Flash" };
}
// Complex check: person should either be crazy, or be strong AND can fly
var p2 = new Person() { FullName = "Mr F. Bar", Abilities = HeroAbilities.None };
if (p2.Abilities.HasFlag(HeroAbilities.Crazy) || p2.Abilities.HasFlag(HeroAbilities.Strong) && p2.Abilities.HasFlag(HeroAbilities.Fly))
{
p2.Hero = new SuperHero() { Name = "SuperFooB" };
}
的目標是採取檢查一個Person
是否適合是英雄的邏輯,並把它的每個各自SuperHero
類中,所以我可以做這樣的事情:
var sh = new SuperHero() { ... };
var p = new Person() { .... };
if(sh.PersonSuitable(p)) { p.Hero = sh };
我真的很掙扎的部分是,一些檢查是複雜的(例如, X or (Y and Z)
),所以[Enum.HasFlag][1]
不足。我處於我的相當有限的面向對象的經驗的極限,所以也許錯過了一些簡單的東西。
解開它的一個簡單方法是向類中添加屬性。像IsStrong,CanFly,HasWarpSpeed,IsCrazy一樣。屬性獲得者只是一行,if語句的可讀性更高。 –