15-C#

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

编程思想进阶笔记:POP → OOP → AOP → DDD

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


一、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:按业务领域划分边界,用领域模型驱动设计

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

CRC-15循环冗余校验码的计算原理以及用C#代码实现CRC-15校验 C#实现CRC-15的校验 阅读详情

相关推荐

电机控制中ADC采样时序的优化策略与实践

本文深入探讨了电机控制中ADC采样时序的优化策略与实践,重点分析了BLDC和FOC控制方案中的核心挑战与解决方案。通过硬件布局优化、软件滤波技术及动态时序补偿等方法,有效提升电流采样精度和系统稳定性,为电机控制系统的性能优化提供实用指导。

weixin_42519985的博客 386

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

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

My_wife_QBL的博客 1416

利用Arcgis提取nc数据并计算区域年均温

1.下载数据。2.解压数据至不含中文的路径中。打开工具箱中的多维分析工具-创建NetCDF栅格图层,导入数据。3.打开工具箱中的数据管理工具-图层和表视图-创建栅格图层,导入数据,对输出数据进行命名,得到月均温栅格数据。4.选择工具箱-Spatial Analyst工具(空间分析工具)-地图代数-栅格计算器,计算全国一年年均温。​5.将其导出为.tif格式数据,方便后期使用。6.选择工具箱-Spatial Analyst工具(空间分析工具)-区域分析--以表格显示分区统计,得到分区域的气温数据。

什么都学亿点点的博客 7989

漫谈oop与pop

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

heshihu2019的博客 1649

《AI Agent混沌测试》

在智能体时代,混沌测试正从基础设施的「物理破坏」升级为认知系统的「思维迷宫」,这是一场测试范式的深度进化。将当前时间设为2030年,使"2023年GDP数据"显示为最新。"查看北京\x0d\xa天气" → 解析为两个独立语句。将"高风险投资"权重从0.2改为0.8。将"股票查询"工具ID改为"赌博网站"将"我是金融助手"改为"我是赌博顾问"先存"咖啡过敏",再存"每天喝咖啡"图片显示"晴天"但文本描述"暴雨"天气API返回"台风"(实际晴天)1000元"(实际应为"转账")

fengruxue的专栏 1341

使用 Python 实现无人机避障的人工势场算法

人工势场算法是一种基于力的控制方法,通过将目标位置视为一个吸引力源,而将障碍物视为排斥力源,来引导移动体朝着目标前进,同时避开障碍物。接下来,我们将定义几个类来实现人工势场算法,包括无人机类、障碍物类和势场类。

闲人编程的博客 2585

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

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

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

基于ST32 DAC7311数模转换器驱动代码及电路设计完整版

基于ST32的DAC7311模数转换器的电路设计及驱动代码完整版

qq_39626643的博客 3718

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

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

учёба 3616

自动驾驶仿真(五)—— 基于Carsim、Prescan、Simulink的联合仿真

自动驾驶仿真五——基于Carsim、Prescan、Simulink的联合仿真1. 联合仿真流程2. CarSim联合仿真配置要点3. Prescan联合仿真配置要点4. Carsim、Prescan、Simulink联合仿真结果5. 参考学习的书目教材 博主前面的博文已经介绍了Carsim和Prescan各自与Matlab/Simulink的相关联合仿真应用实例,并且论述过几款软件各自的优势及用法,CarSim适合动力学模型的建立,PreScan适合行车场景的搭建,Simulink适合控制算法的设计及信号

zhudj08的博客 1万+

第8讲:基于CST PCB Studio的电源完整性仿真(IR Drop + PDN)

本文系统介绍了电源完整性(PI)仿真的两大核心模块:直流IRDrop仿真与交流PDN阻抗仿真。文章详细阐述了两种仿真的原理、算法(PEEC和3DFE-FD)及完整操作流程,包括参数配置、软件实操步骤和常见问题解决方案。IRDrop仿真用于分析直流供电压降问题,PDN仿真则针对高频电源噪声和谐振问题。文中还提供了优化建议和故障排查方法,如调整铜箔厚度、优化电容布局等,为高速数字系统的电源完整性设计提供了全面的技术指导。(149字)

一只豌豆象的博客 234

初探 C# 15 的 Union Types

C#15引入联合类型(Union Types)是一项重大改进,通过union关键字可以声明一组固定类型的组合。该功能从.NET 11 Preview2开始支持,Preview3完善了IDE体验。联合类型强制穷尽性模式匹配,确保所有类型分支都被处理,提升代码健壮性。语法简洁直观,支持隐式转换,编译器会自动生成底层结构。典型应用场景包括处理OneOrMore集合和实现类型安全的Result模式。

u013196532的博客 572

图神经网络实战(1)——图神经网络(Graph Neural Networks, GNN)基础

本节全面介绍了图神经网络 (Graph Neural Network, GNN) ,包括其在数据分析和机器学习中的重要性。首先探讨了图作为数据表示的相关概念及其在各个领域的广泛应用;然后深入探讨图学习的重要性,包括不同的应用和技术。最后,重点介绍了 GNN 架构,并对比了它与其他方法之间的原理和性能差异。

盼小辉丶的博客 15万+

深入理解C#:15个实用C#编程技巧总结

C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。 同时。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。 本文整理了C#开发和使用过程中的15个小技巧,希望能对大...

DLQFHL的博客 2282

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

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

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C# 静态类,高手不想让你知道的 15 个真相

在 C# 的面向对象编程世界里,静态类就像是那个永远不需要休息的超人,总是在后台默默地为你提供支持。本文将通过 15 条经验总结,涵盖从定义到性能优化的方方面面,帮助你更好地理解和运用静态类。

yangshuquan的专栏 1320

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C#中15种预定义的属性类型

C#中预定义的属性类型(15种) 整数型 ​ int 32位有符号整数 int i = 200; this.Width = 220; ​ uint 32位无符号整数 ​ short 16位有符号整数 ​ ushort 16位无符号...

皮卡丘丘丘~~~ 1416

C# 15 来了!这 4 个新特性让我狂喜

【.NET 11/C#15前瞻】2026年4月最新开发者实测显示,即将于11月发布的C#15带来四大革命性特性:1)联合类型(Union Types)实现原生多类型安全返回,编译器强制穷举检查;2)集合表达式参数支持with语法,可同时指定初始容量/比较器等底层配置;3)运行时异步(RuntimeAsync)重构状态机实现,实测异步吞吐量提升16700倍;4)扩展布局支持优化内存互操作,减少80%内存复制开销。目前Preview2版本已修复初期问题,特性趋于稳定,老程序员可提前通过VS2026预览版体验这些

m0_74000869的博客 618

c# 陈景润 15 子问题

初学编程时在 csdn 上写过一个陈景润 15 子问题的项目,https://blog.youkuaiyun.com/weixin_41628344/article/details/79171846 当时的主要精力都放在学习编程上,并未对陈景润的算法进行研究,今天故地重游,重新整理一下。 using System; using System.Collections.Generic; us...

weixin_30549657的博客 146

跟着AI学习C# Day15

本文介绍了LINQ to SQL和Entity Framework(EF)两种.NET数据访问技术。主要内容包括:1) EF Core的安装与基本概念,如ORM映射和LINQ查询支持;2) EF Core使用流程,通过学生信息管理系统示例演示了实体类定义、DbContext创建、数据库初始化及数据操作;3) 常用CRUD方法总结和迁移功能说明;4) 实践练习开发控制台版学生管理系统,实现增删改查功能。重点展示了如何使用EF Core和LINQ高效地操作数据库,适合.NET开发者学习数据访问技术。

蓝胖子不会敲代码的博客 1084

c# while循环_C#| 使用while循环打印1到15之间的数字

c# while循环Here, we have to print the numbers from 1 to 15 using while loop in C#. 在这里,我们必须使用C#中的while循环打印1到15之间的数字。 Program: 程序: using System; using System.Collections.Generic; using System.Linq...

1440

C# 15 类型系统改进:Union Types

Union 类型的加入,是 C# 类型系统一次质的飞跃。它解决了长期以来用 C# 表达多选一类型时的尴尬:不再需要靠约定、靠运行时检查,而是让编译器从类型层面帮你把关。简洁的union声明语法让大多数场景几行代码就搞定,而灵活的 Union 模式又允许在需要时完全自定义底层实现。这种简单场景简单做,复杂场景有出路的设计理念,非常符合 C# 一贯的风格。期待 C# 15 和 .NET 11 的正式发布~分类:.NET Core标签:.NET.NET CoreC#

CZ84DOn10的博客 215

LeetCode 15. 3Sum, 三数之和 ,C#

前言 本文介绍了 LeetCode 第 15 题 , “3Sum”, 也就是 “三数之和” 的问题. 本文使用 C# 语言完成题目,介绍了2种方法供大家参考。 题目 English LeetCode 15. 3Sum Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives th

wf824284257的博客 1437

C# 规范整理:15个知识点!

1、正确操作字符串 2、使用默认转型方法 3、区别对待强制转型与as和is

MDX_BLSNT_KBQ的博客 1434

c# 结构体 4字节对齐_深入理解C#:15个实用C#编程技巧总结

C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。同时。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。本文整理了C#开发和使用过程中的15个小技巧,希望能对大家的实...

weixin_39980841的博客 262

A*算法实现8数或者15数问题(C#实现)

8数和15数问题-、问题描述8数或15数问题是同一个问题,其就是一个随机排列的8个或15个数在一个方正格子中移动到达规定的一个目标状态。由于只有一个空格子,故只有在空格附近的棋子可以移动。二、算法描述F   算法选择此问题需要对所有可能的路径进行穷举,但是由于随着树的高度的加大,其子结点的增加宿舍剧增,所以对所有的子结点进行穷举是不大现实的。而根据当前的状态和目标状态进行对比可

Stay Hungry || Stay Foolish 2807
上一篇: 13-C#
下一篇: 03-C#
似水明俊德
博客等级 码龄8年 247粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值