信息產(chǎn)業(yè)部網(wǎng)站備案查詢新聞頭條最新消息摘抄
目錄
概念
需求
貧血模型
充血模型
總結(jié)
概念
- 貧血模型:一個類中只有屬性或者成員變量,沒有方法。
- 充血模型:一個類中既有屬性、成員變量,也有方法。
需求
定義一個類保存用戶的用戶名、密碼、積分;用戶必須具有用戶名;為了保證安全,密碼采用密碼的散列值保存;用戶的初始積分為10分;每次登錄成功獎勵5個積分,每次登錄失敗扣3個積分。
貧血模型
優(yōu)點:簡單清晰,適合小型項目或簡單業(yè)務(wù)邏輯。
缺點:業(yè)務(wù)邏輯分散,不利于復(fù)雜業(yè)務(wù)場景的維護。
class User
{public string UserName { get; set; }//用戶名public string PasswordHash { get; set; }//密碼的散列值public int Credit { get; set; }//積分
}
User u1 = new User(); u1.UserName = "ljy"; u1.Credit = 10;
u1.PasswordHash = HashHelper.Hash("123456");//計算密碼的散列值
string pwd = Console.ReadLine();
if(HashHelper.Hash(pwd)==u1.PasswordHash)
{u1.Credit += 5;//登錄增加5個積分Console.WriteLine("登錄成功");
}
Else
{if (u1.Credit < 3)Console.WriteLine("積分不足,無法扣減");else{u1.Credit -= 3;//登錄失敗,則扣3個積分}Console.WriteLine("登錄失敗");
}
充血模型
符合“單一職責(zé)原則”
class User
{public string UserName { get; init; } public int Credit { get; private set; }private string? passwordHash;public User(string userName){this.UserName = userName;this.Credit =10;}//修改密碼public void ChangePassword(string newValue){if(newValue.Length<6){throw new Exception("密碼太短");}this.passwordHash =Hash(newValue);}//比較密碼散列值public bool CheckPassword(string password){string hash = HashHelper.Hash(password);return passwordHash== hash;}//扣除積分public void DeductCredits(int delta){if(delta<=0){throw new Exception("額度不能為負值");}this.Credit -= delta;}//增加積分public void AddCredits(int delta){this.Credit += delta;}
}
User u1 = new User("ljy");
u1.ChangePassword("123456");
string pwd = Console.ReadLine();
if (u1.CheckPassword(pwd))
{u1.AddCredits(5);Console.WriteLine("登錄成功");
}
else
{u1.DeductCredits(5);Console.WriteLine("登錄失敗");
}
總結(jié)
貧血模型是站在開發(fā)人員的角度思考問題,充血模型是站在業(yè)務(wù)的角度思考問題。