目录
概念
需求
贫血模型
充血模型
总结
概念
- 贫血模型:一个类中只有属性或者成员变量,没有方法。
- 充血模型:一个类中既有属性、成员变量,也有方法。
需求
定义一个类保存用户的用户名、密码、积分;用户必须具有用户名;为了保证安全,密码采用密码的散列值保存;用户的初始积分为10分;每次登录成功奖励5个积分,每次登录失败扣3个积分。
贫血模型
优点:简单清晰,适合小型项目或简单业务逻辑。
缺点:业务逻辑分散,不利于复杂业务场景的维护。
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("登录失败");
}
充血模型
符合“单一职责原则”
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("登录失败");
}
总结
贫血模型是站在开发人员的角度思考问题,充血模型是站在业务的角度思考问题。