当前位置: 首页 > article >正文

ASP.NET Core的贫血模型与充血模型

目录

概念

需求

贫血模型

充血模型

总结


概念

  1. 贫血模型:一个类中只有属性或者成员变量,没有方法。
  2. 充血模型:一个类中既有属性、成员变量,也有方法。

需求

定义一个类保存用户的用户名、密码、积分;用户必须具有用户名;为了保证安全,密码采用密码的散列值保存;用户的初始积分为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("登录失败");
}

总结

贫血模型是站在开发人员的角度思考问题,充血模型是站在业务的角度思考问题。


http://www.kler.cn/a/542671.html

相关文章:

  • 【设计模式】【行为型模式】模板方法模式(Template Method)
  • ffmpeg -demuxers
  • Go语言的内存分配原理
  • python-leetcode 25.环形链表
  • 什么是Java虚拟机(JVM)?它的作用是什么?
  • 深度学习-交易预测
  • JavaScript系列(69)--安全编程技术详解
  • DeepSeek模型架构及优化内容
  • Leetcode 3448. Count Substrings Divisible By Last Digit
  • 更新无忧:用 Docker 数据卷确保 Open WebUI 数据持久化
  • java项目部署到linux读取properties中文乱码
  • 超全前端面试(全!全!全!!!)
  • LeetCode 每日一题 2025/2/3-2025/2/9
  • 2024.1.2版本Android Studio gradle下载超时问题处理
  • python基础入门:6.2JSON与CSV数据处理
  • SkyWalking 10.1.0 实战:从零构建全链路监控,解锁微服务性能优化新境界
  • qt QCommandLineOption 详解
  • 蓝桥杯算法日记|2.11二分算法
  • 【目标检测xml2json】label从VOC格式xml文件转COCO格式json文件
  • PostgreSQL 数据库压力测试指南
  • 普通用户授权docker使用权限
  • docker和docker compose版本太低问题的解决方案
  • 16.React学习笔记.React更新机制
  • 大模型被偷家?CNN结合多模态!
  • 2025.2.11——一、[极客大挑战 2019]PHP wakeup绕过|备份文件|代码审计
  • 前端设计模式介绍及案例(单例模式、代理模式、工厂模式、装饰者模式、观察者模式)