目录
概念
需求
贫血模型
充血模型
总结
概念
- 贫血模型:一个类中只有属性或者成员变量,没有方法。
- 充血模型:一个类中既有属性、成员变量,也有方法。
需求
定义一个类保存用户的用户名、密码、积分;用户必须具有用户名;为了保证安全,密码采用密码的散列值保存;用户的初始积分为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("登录失败");
}
总结
贫血模型是站在开发人员的角度思考问题,充血模型是站在业务的角度思考问题。