15-C#.Net-编程思想(POP-OOP-AOP-DDD)-学习笔记

编程_三大编程思想:POP、OOP、AOP 简单介绍POP、OOP、AOP三大编程思想的区别和优缺点~ 阅读详情

本文以"用户注册"这个业务场景为主线,逐步演示四种编程思想的演进过程,帮助理解每种思想解决了什么问题、又带来了什么新的局限。

一、POP —— 面向过程编程

核心思想

面向过程(Procedure-Oriented Programming)是最直接的编程方式:把要做的事情按步骤一行一行写下来,从上到下顺序执行。思维方式是线性的,适合逻辑简单、不需要扩展的小程序。

示例

// 用户注册的面向过程写法
Console.WriteLine("用户注册,提交信息");
Console.WriteLine("1 参数检查");
Console.WriteLine("2 数据入库");
Console.WriteLine("3 记录日志");

问题在哪

  • 所有逻辑堆在一起,代码越写越长,越来越难维护
  • 需求一变,就要到处改代码,牵一发动全身
  • 无法复用,同样的逻辑在不同地方重复出现
  • 不能应对变化,扩展性极差

二、OOP —— 面向对象编程

核心思想

面向对象(Object-Oriented Programming)把程序拆分成一个个"对象",每个对象负责自己的事情。三大特性:封装、继承、多态。

  • 封装:把细节藏起来,外部只看接口
  • 继承:子类复用父类代码
  • 多态(面向抽象):上层代码只依赖接口,不依赖具体实现,这是 OOP 扩展性的核心

示例演进

第一步:封装对象

// 把用户信息封装成对象
UserInfo userInfo = new UserInfo()
{
    Account = "Administrator",
    Name = "张三",
    Password = "888888"
};

第二步:面向抽象(依赖接口而非具体类)

// 定义接口
public interface IDBHelper
{
    int Save(UserInfo userInfo);
}

// MySQL 实现
public class MySQLDBHelper : IDBHelper
{
    public int Save(UserInfo userInfo)
    {
        Console.WriteLine("数据入MySQL");
        return 0;
    }
}

// SQLServer 实现
public class SqlServerDBHelper : IDBHelper
{
    public int Save(UserInfo userInfo)
    {
        Console.WriteLine("数据入SqlServer");
        return 0;
    }
}

第三步:用简单工厂解耦

public class SimpleFactory
{
    public static IDBHelper CreateDBHelper()
    {
        // 只改这一行,上层代码完全不用动
        return new MySQLDBHelper();
        // return new SqlServerDBHelper();
    }
}

// 调用方
IDBHelper dbHelper = SimpleFactory.CreateDBHelper();
dbHelper.Save(userInfo);

OOP 的价值

  • 封装屏蔽了细节,上层代码不关心底层怎么实现
  • 面向抽象(接口 + 多实现)让切换实现变得简单,这是 80% 设计模式的核心套路
  • 依赖注入(DI)、工厂模式、策略模式……都是这个思路的延伸

OOP 的局限

OOP 的扩展性靠的是对象替换对象。但如果我不想换掉整个对象,只是想在某个方法执行前后加点通用逻辑(比如日志、权限检查、性能统计),OOP 就显得力不从心了。

最直接的做法是修改原来的类,但这违反了开闭原则(对扩展开放,对修改关闭)。


三、AOP —— 面向切面编程

核心思想

面向切面(Aspect-Oriented Programming)解决的问题是:在不修改原有对象、不替换原有对象的前提下,给它额外扩展功能。

这些额外的功能通常是横跨多个业务模块的通用逻辑,比如:

  • 日志记录
  • 权限验证
  • 性能统计
  • 异常处理
  • 事务管理
  • 缓存

AOP 不能做业务逻辑,它只负责这些"横切关注点"。

实现方式一:静态代理

手动写一个代理类,实现同一个接口,内部持有真实对象,在调用前后插入额外逻辑。

public class DBHelperProxy : IDBHelper
{
    // 持有真实对象
    private IDBHelper _iDBHelper = new MySQLDBHelper();
    private ILogHelper _logger = new LogConsole();

    public int Save(UserInfo userInfo)
    {
        // 方法执行前
        _logger.Log("Prepare Save");

        // 调用真实方法
        int result = _iDBHelper.Save(userInfo);

        // 方法执行后
        _logger.Log("After Save");

        return result;
    }
}

// 使用时,把代理对象当作真实对象用
IDBHelper dbHelper = new DBHelperProxy();
dbHelper.Save(userInfo);

优点:简单直观,不需要任何框架支持。

缺点:每个类都要手写一个代理类,代码量大,维护成本高。

实现方式二:动态代理(.NET Core 版)

.NET Core 提供了 DispatchProxy,可以在运行时动态生成代理,不需要为每个类手写代理代码。

// 真实代理:拦截所有方法调用
public class MyRealProxy<T> : DispatchProxy
{
    public T _Instance = default;

    protected override object? Invoke(MethodInfo? targetMethod, object?[]? args)
    {
        // 方法执行前的通用逻辑
        Console.WriteLine("方法执行前可以加入的逻辑");

        // 调用真实方法
        var result = targetMethod?.Invoke(_Instance, args);

        // 方法执行后的通用逻辑
        Console.WriteLine("方法执行后可以加入的逻辑");

        return result;
    }
}

// 透明代理:负责创建代理对象
public static class TransparentProxy
{
    public static T Create<T>(T instance)
    {
        dynamic proxy = DispatchProxy.Create<T, MyRealProxy<T>>()!;
        proxy._Instance = instance;
        return proxy;
    }
}

// 使用
IDBHelper dbHelper = new MySQLDBHelper();
dbHelper = TransparentProxy.Create<IDBHelper>(dbHelper);
dbHelper.Save(userInfo); // 自动触发前置/后置逻辑

注:.NET Framework 时代用的是 RealProxy(基于 .NET Remoting),.NET Core 之后已移除,统一用 DispatchProxy。

动态代理的进阶用法

在 Invoke 方法里,可以通过反射读取方法上的自定义特性(Attribute),实现更细粒度的控制:

// 比如:只有标了 [Log] 特性的方法才记录日志
if (targetMethod.IsDefined(typeof(LogAttribute), true))
{
    // 记录日志
}

AOP 的价值

  • 业务代码只关注业务逻辑,通用逻辑统一在切面里处理
  • 代码复用,一处修改,全局生效
  • 方便团队协作,业务开发和基础设施开发分离

实际框架中的 AOP

在实际项目中,AOP 通常通过以下方式实现:

方式代表框架
动态代理Castle DynamicProxy、AspectCore
IL 编织PostSharp
中间件管道ASP.NET Core Middleware
过滤器ASP.NET Core Filter(ActionFilter、ExceptionFilter 等)

四、DDD —— 领域驱动设计

核心思想

领域驱动设计(Domain-Driven Design)不是一种编程语法,而是一种软件架构方法论,适用于复杂业务系统的设计。

它的核心理念是:软件的核心复杂性来自业务领域本身,代码结构应该反映业务模型。

关键概念

限界上下文(Bounded Context)

把一个大系统按业务边界拆分成多个子域,每个子域有自己独立的模型和语言。比如"订单系统"和"库存系统"是两个不同的限界上下文,它们对"商品"的理解可能不同。

聚合根(Aggregate Root)

一组相关对象的入口,外部只能通过聚合根来操作内部对象,保证数据一致性。

实体(Entity)

有唯一标识的对象,即使属性相同,只要 ID 不同就是不同的实体。比如两个同名用户,是两个不同的实体。

值对象(Value Object)

没有唯一标识,只靠属性值来区分。比如"地址",两个地址只要内容相同就认为是同一个。

领域服务(Domain Service)

不属于任何实体的业务逻辑,放在领域服务里。

仓储(Repository)

负责聚合根的持久化,隔离领域层和数据访问层。

DDD 与 OOP/AOP 的关系

DDD 是更高层次的架构思想,它告诉你如何组织代码结构;OOP 是实现手段,DDD 的各种概念(实体、值对象、聚合根)都用 OOP 来实现;AOP 则负责处理横切关注点,在 DDD 架构中同样适用。

适用场景

DDD 适合业务逻辑复杂、团队规模较大的项目。对于简单的 CRUD 应用,引入 DDD 反而会增加不必要的复杂度。


五、四种思想的对比总结

维度POPOOPAOPDDD
关注点执行步骤对象和职责横切关注点业务领域模型
扩展方式修改代码替换对象(接口+多实现)切面拦截领域模型演进
适用规模小脚本中小型项目通用功能增强复杂业务系统
核心原则无开闭原则、依赖倒置不破坏封装领域模型驱动

六、一个贯穿全文的演进脉络

以"用户注册"为例,四种思想的演进是这样的:

POP:把注册步骤写成一段顺序代码
  ↓ 问题:难以维护,无法复用
OOP:把用户、数据库操作封装成对象,用接口解耦
  ↓ 问题:想加日志,只能修改对象或替换对象
AOP:用代理模式在方法前后插入日志,不动原有代码
  ↓ 问题:系统越来越大,业务边界模糊
DDD:按业务领域划分边界,用领域模型驱动设计

每一步都是在解决上一步遗留的问题,没有哪种思想是万能的,关键是在合适的场景用合适的工具。

[编程思想] POP OOP AOP 【编程思想】与语言无关,是一种程序设计思想 面向过程编程 面向对象编程 面向切面编程 POP(Procedure Oriented Programming) OOP(Object Oriented Programming) AOP(Aspect Oriented Programming) 如果下雨了,我打开了雨伞 - 给"天气"对象赋予下雨的动作- 实例一个对象:“我”,并赋予... 阅读详情

相关推荐

华为2024机考真题集合

2.中位数是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以 2,所得的结果就是中位数。在实际考试中会随机抽三道题目进行考察,其中两道100分卷题和一道200分卷题,总共400分。幼儿园组织活动,老师布置了一个任务:每个小朋友去了解与自己同一个小区的小朋友还有几个。3.查找整型数组中元素的众数并组成一个新的数组,求新数组的中位数。1.众数是指一组数据中出现次数量多的那个数,众数可以是多个。

qq_25360769的博客 5092

面向对象编程(OOP)与面向过程编程(POP):理解两种主要编程范式

封装是指将数据和操作封装在对象中,只通过对象的接口与外界交互,从而保护对象的内部状态。它通过将现实世界中的事物抽象成对象,每个对象都有其特定的属性和行为,使得代码更加模块化、易于理解和维护。它关注的是解决问题的步骤和过程,将程序分解为一系列按顺序执行的步骤和函数。在实际应用中,我们需要根据具体情况选择最合适的编程范式,以实现高效、可维护的代码。因为POP的代码结构通常是线性的,很难在代码中添加新的功能或修改现有功能。其中,面向对象编程(OOP)和面向过程编程(POP)是两种常见的、主要的编程范式。

My_wife_QBL的博客 1416

漫谈oop与pop

在我们的编程生涯中,不得不面对两种编程思想oop与pop。啥是opp?oop全称暂且不表,你知道它是叫做面向对象的东西就对了。至于pop就是面向过程。两者区别:面向过程适合小项目,它的执行效率高,毕竟是从上到下,有前后顺序依次执行,过程相对来说简单干脆,不过程序拓展性不好,维护成本较高。面向对象适合中大型项目,它的执行过程可谓曲折,总是爱new个对象再去实现,即便如此它的继承,封装,多态的特性,使得程序易拓展易维护。......

heshihu2019的博客 1649

项目回顾一:《高速多端口共享缓存模块》

本帖子仅为了回顾一下一年前自己动手完成的第一个数字ic设计项目的历程,为复试做一下准备,完成的这个sramc模块花了整整四个月的时间,从0到12个模块的代码产出以及模块的验证,虽然没有拿奖,也没有进入复赛,设计过程中使用的技术手段和算法也不太成熟,但这这是一个值得记录的过程!

weixin_60261760的博客 1253

【项目实战】YOLOV5 +实时吸烟目标检测+手把手教学+开源全部

本原创项目长期更新,旨在完成校园异常行为实时精检测,做到集成+N次开发+优化(不止局限于调包)为止,近期将不断更新以下模型+数据+标注文件+教程。关注博主,Star 一下github,一起开始美妙的目标检测之路吧~~ 文章目录本原创项目长期更新,旨在完成校园异常行为实时精检测,做到集成+N次开发+优化(不止局限于调包)为止,近期将不断更新以下模型+数据+标注文件+教程。关注博主,Star 一下github,一起开始美妙的目标检测之路吧~~一、项目展示二、项目资源共享1:训练图片:香烟图片+吸烟手势+烟雾三、

cv君的博客 13万+

15-C#

维度POPOOPAOPDDD关注点执行步骤对象和职责横切关注点业务领域模型扩展方式修改代码替换对象(接口+多实现)切面拦截领域模型演进适用规模小脚本中小型项目通用功能增强复杂业务系统核心原则无开闭原则、依赖倒置不破坏封装领域模型驱动。

噢~ 266

2026年全国青少年信息素养大赛复赛真题(算法应用主题赛C++初中组:带解析)(7月4日试卷一)【文末附答案和解析】

2026年全国青少年信息素养大赛复赛真题(算法应用主题赛C++初中组:带解析)(7月4日试卷一)【文末附答案和解析】

王老师青少年编程 1732

关于如何理解POP、OOP、AOP之间的关系

一、概念 1、POP 面向过程(procedure oriented programming) 面向过程编程是以功能为中心来进行思考和组织的一种编程方法,它强调的是系统的数据被加工和处理的过程,在程序设计中主要以函数或者过程为程序的基本组织方式,系统功能是由一组相关的过程和函数序列构成。面向过程强调的是功能(加工),数据仅仅作为输入和输出存在。这种过程化的思想是一种很朴素和普遍的思想和方法,人类很...

qq_41636730的博客 405

图神经网络实战(25)——基于A3T-GCN预测交通流量

本节重点讨论了使用 TGNN 进行交通预测任务。首先,我们介绍了 PeMS-M 数据集,并将其从表格数据转换为具有时间信号的静态图数据集。在实践中,我们根据输入距离矩阵创建了加权邻接矩阵,并将交通速度转换为时间序列。最后,我们构建了 A3T-GCN 模型,这是一个专为交通预测设计的 T-GNN 模型,并将结果与两个基线模型进行了比较,验证了模型的预测结果。

盼小辉丶的博客 8540

YOLOv12改进策略【注意力机制篇】| 2024 PPA 并行补丁感知注意模块,提高小目标关注度(二次改进A2C2f)

本文记录的是利用改进检测精度,详细说明了优化原因,注意事项等。原论文在红外小目标检测任务中,小目标在多次下采样操作中容易丢失关键信息。通过替代编码器和解码器基本组件中的传统卷积操作,更好地保留小目标的重要信息。HCF-Net: Hierarchical Context Fusion Network for Infrared Small Object Detection采用多分支特征提取策略,通过不同分支提取不同尺度和层次的特征。利用局部、全局和串行卷积分支,对输入特征张量进行处理。通过控制 patch si

Limiiiing的博客 1886

2024 .Net 面试题

装箱:从值类型转换到引用类型。拆箱:从引用类型转换到值类型。虚函数:可由子类重写父类的函数。抽象函数:非抽象子类必须重写的函数。多个线程在并行执行且使用到了共享数据,最终得到了正确结果的就是线程安全的,如果结果不正确就是非线程安全允许程序在等待耗时操作完成时,不阻塞执行线程,提高应用程序的响应性。通过async标记异步方法,在异步方法内部使用await等待异步操作完成,在此期间,控制权会返回给调用者,以便执行其他任务,直到异步操作完成后再继续执行await之后的代码。可空类型。通过使用?

dxh0515的博客 9300

基于YOLOv5/v8/v10的答题卡填涂识别与评分系统(附数据集+UI界面+完整代码)

在教育信息化的大背景下,传统的手工阅卷方式正在被智能化技术所取代。答题卡识别作为标准化考试的核心环节,其准确率和效率至关重要。本文将详细介绍如何利用YOLO系列目标检测算法(YOLOv5、YOLOv8、YOLOv10)构建一个答题卡填涂识别与评分系统。文章从数据集的制作与标注开始,逐步深入到模型的训练、评估与对比,最后基于PyQt5设计了一个用户友好的桌面端UI界面,实现了从图像输入到得分输出的全流程自动化。

YOLO 634

面向对象(OOP)和面向过程(POP)编程区别

面向对象(OOP)和面向过程(POP)编程说明和区别

程序媛的一些日常随手记录博客 2165

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

三大编程思想(POP、OOP、AOP、FOP)及oop 五大设计原则

POP:面向过程编程(Procedure Oriented Programming)OOP:面向对象编程(Object Oriented Programming)AOP:面向切面编程(Aspect Oriented Programming)FOP:面向函数式编程(Functional Oriented Programming)

учёба 3616

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【小家java】POP(面向过程编程)、OOP(面向对象编程)、AOP(面向切面编程)三种编程思想的区别和联系

前言 现在很多语言都是面向对象(OOP)的编程思想,比如Java、Python、JS等为代表。然后聊起面向对象,虽然我们一直在用,但真的问起你什么叫面向对象时,还是很难有一个具相的回答,因此本文尝试以OOP为中心,以讲解和对比的方式,聊聊这三种编程思想。 OOP前夕:POP 谈起了OOP,我们就不得不了解一下POP即面向过程程序设计,它是以功能为中心来进行思考和组织的一种编程方式,强调的是系统的数...

架构师:通透,才能写出好代码! 3422

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

OOP和POP之间的区别

oop和popHere you will learn about difference between OOP and POP. 在这里,您将了解OOP和POP之间的区别。 Object Oriented Programming and Procedure Oriented Programming are two most popular programming paradigms. In t...

culing2941的博客 2408

POP与OOP

POP与OOP 1.POP面向过程 面向过程:当遇到一个需求时,首先考虑有哪几步,将实现的步骤按照1234划分好,然后一步步去实现。 比如说把大象放进冰箱需要几步这个问题就是一个典型的面向过程例子。 第一步:打开冰箱---->第二步:把大象装进去---->第三部:关上冰箱 面向过程是线性思维,体现到代码上就是POP。 面向过程编程虽然符合常规思维,但是随着业务的复杂度提升后,无法适应业务的扩展需求。 比如说我现在想把10000头大象放进冰箱,同时在大象装进冰箱前加入10000种条件判断,那么这

TSCCG的博客 615

OOP和POP的区别

Java的oop(面向对象) 一、Java的面向对象学习的三条主线 1、Java类及类的成员:属性、方法、构造器;代码块、内部类 2、面向对象的三大特征:封装性、继承性、多态性、(抽象性) 3、其他关键字:this,super,static,final,abstract,interface,package 二、人把大象放冰箱需要(举例面向对象何和面向过程编程的区别) 1、面向过程:强调的是功能行为,以函数为最小的单位,考虑怎么做 ①把冰箱门打开 ②抬起大象,塞进冰箱 ③把冰箱门关闭 2、面向对象:强调具备了

qq_45859377的博客 812

POP和OOP

首先是面向对象语言的三大基本特性:封装,继承,多态。 封装:将事物的细节隐藏起来,只对外暴露一个接口以供信任的人调用。一个类就是封装了各种数据和操作这些数据的方法的逻辑实体。 继承:指可以让某个类型的对象获得另一个类型的对象的属性的方法,有很多类有相同的属性或者方法,就把相同的属性或者方法封装到一个类当中作为父类,其他类想要获得这些属性或者方法,就可以继承自他。 多态:是指一个类实例的相同方法在不同情形有不同表现形式: 多态就是父类指针指向子类对象。 关于多态:在编译的时候并不知道要调用的是父类还是

qq_55655826的博客 2694

编程思想的理解(POP,OOP,SOA,AOP)

1)POP--面向过程编程(Process-oriented programming ): 面向过程编程是以功能为中心来进行思考和组织的一种编程方法,它强调的是系统的数据被加工和处理的过程,在程序设计中主要以函数或者过程为程序的基本组织方式,系统功能是由一组相关的过程和函数序列构成。面向过程强调的是功能(加工),数据仅仅作为输入和输出存在。这种过程化的思想是一种很朴素和普遍的思想和方法,人类很多...

wodamazi 1451

【动软.Net代码生成器】连接MySQL生成C#的POCO实体类(Model)

首先是工具的下载地址: 动软.Net代码生成器 该工具官网自带完整教程: 文档:http://www.maticsoft.com/help/ 例子:http://www.maticsoft.com/help/maticstudy.htm 需求:项目中需要根据数据库中的表生成相应的C#实体类,通常是一张表对应一个实体类Model。如果不嫌麻烦当然可以一个一个类、属性都手打,但当表很多、类...

weixin_33805743的博客 975

详解POP、OOP、AOP之间的关系

1、POP 面向过程(procedure oriented programming): 一种以过程为中心的编程思想,分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了,它以功能为中心,只要把具体的功能完成就可以了,强调的是数据的加工和处理的过程,注重细节,从而忽视了整体性和边界性,无法模拟显示世界。 2、 OOP 面向对象(object orient...

weixin_44995260的博客 848

面向过程(POP)与面向对象(OOP)的区别

概述 1. 二者都是一种思想,面向对象是相对于面向过程而言的。面向过程的效率一般要高于面向对象。 2. 面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。分析出解决问题的步骤,用函数把这些步骤一步一步的实现。 3. 面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。把构成问题的事物分成一个一个的对象,建立对象的目的不是为了完成某一个步骤,而是描述某个事物在整个解决问题的步骤中的行为。面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、

A798194701的博客 1517

面向过程(POP)与面向对象(OOP)

面向过程(POP)与面向对象(OOP)

weixin_52075272的博客 816

如何理解POP、OOP、AOP之间的关系

如何理解POP、OOP、AOP之间的关系一、面向过程编程二、面向对象编程三大特征1、封装:2、继承:3、多态:三、面向切面编程 一、面向过程编程 POP:(procedure oriented programming)是一种以过程为中心的编程思想,是以什么正在发生为主要目标进行编程。 二、面向对象编程 OOP:(object oriented programming)是一种以事务为中心的编程思想,...

ajm_21_2的博客 583
上一篇: 14-C#.Net-设计模式-学习笔记
下一篇: 16-C#.Net-自研ORM框架-学习笔记
似水明俊德
博客等级 码龄8年 247粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值