架构,改善程序复用性的设计~第五讲 复用离不开反射和IOC续(大白话IOC)

反射——框架设计的灵魂 java基础中反射是很重要的一部分,现在市面上的大部分框架都或多或少的使用了反射的机制,博主最近面试找工作,大部分公司的技术人员都会问你反射相关的问题,对于反射之前我确实了解的不是很多,面试的时候也说不出什么所以然来,所以痛定思痛好好的学习了反射方面的知识。 一、反射的概念 JAVA反射机制是在程序运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调... 阅读详情

转自:http://www.cnblogs.com/lori/archive/2012/06/03/2533399.html

要研究的问题:IOC是什么?它解决了什么?我们的项目中为何要用IOC?反射对性能真的影响很大吗?不用反射,谁意见最大?

来吧,开始说问题

1,IOC是什么?不用说什么容器,框架,大白话其实IOC就是将一些接口与它的各种实现的类名配置在一个文件中,可以是XML,也可以是.config配置文件中,然后在程序“运行时”去根据配置的信息去动态得到(resolved)这个对象,然后程序中就可以使用这个对象了,所IOC就是用来建立对象的。

2,它解决了什么?一个接口,有三种实现,如sql实现,oracle实现,access实现等,那当前环境下用哪种方式来进行实现呢,这时可以由IOC来实现它。

复制代码
 1 // 统一规范
 2 public interface IRepository<TEntity> where TEntity : class
 3 {
 4   void Insert(TEntity entity);
 5 }
 6 
 7 // sql 实现
 8 public class SqlRepository<TEntity> : IRepository<TEntity>
 9 {
10   public void Insert(TEntity entity)
11   {
12     ...
13   }
14 }
15 
16 // Access实现
17 public class AccessRepository<TEntity> : IRepository<TEntity>
18 {
19   public void Insert(TEntity entity)
20   {
21     ...
22   }
23 }
复制代码

3,我们的项目中为何要用IOC?在项目中用IOC的目的很简单,就是让程序松耦合,说的有点抽象,看一个小代码

1 class UserService
2 {
3     var userRepository=new UserRepository();
4 }

我们可以看到userRepository对象它依赖于UserRepository的实现,当我们需要改变userRepository的实现方法时,很困难,只能去代码中改变,这样导致程序的扩展性很低,这是项目中引入IOC的原因,也就是说:“当程序模块有多种实现方式时,可以引用IOC方式来创建对象的实例”。

4,反射对性能真的影响很大吗?这个问题有无数个人做了无数次实验,反射和不用反射的程序,差距不好确定,因为它与数据复杂度还有关系,一般数据量小时,可能几十倍,数据量时,可能上百倍(反射在底层实现时),我们可以从微软的原码中看到,它在一些时候使用了很多反射,是的,我本人不反对使用反射,因为我是一个面向对象的忠实信仰者。

5,不用反射,谁意见最大?这个问题很有意思,谁意见最大?我看因为是“面向对象”意见最大,因为我们无法去想像一个没有反射的程序是如何面向对象的,当一个需求被更改时,就要去修改你的程序代码,这对于程序员是一种痛苦,也违背了面向对象的原则,我想,即然C#是一个完全面向对象的语言,那我们在写程序时,是否应该面向对象更多一些,而不是那么一点点的性能,而且这种性能的浪费我认为是完成值得的。

信仰C#,信仰面向对象

感谢各位!

 

1.6 C++踩坑排雷手册——未初始化内置类型读取:未定义行为 未初始化的内置类型变量(如 `int`、`float`、`bool` 等)没有确定的初值,读取它们的行为是 C++ 标准明确规定的未定义行为。编译器不会给局部栈变量自动赋零——它的初值就是栈帧上该位置在分配前的残留字节内容(取决于之前的函数调用在该栈位置留下的数据)。更严重的是,在 `-O2` 优化下,编译器可能基于"变量已被初始化"的假定做路径分析,如果发现存在未初始化读取路径,可能将整个分支优化为恒真、恒假,甚至删除后续代码,导致难以追踪的运行时异常。验证方法:用 `-O0` 和 `-O2` 分别编译运 阅读详情

相关推荐

1.2 对象切片:将派生类按值赋给基类,派生部分被截断 ——C++踩坑排雷手册:派生类对象按值赋值给基类时为什么会丢失派生成员数据

将派生类对象按值赋给基类类型变量或函数参数时,编译器仅拷贝基类子对象的内存区域——从对象起始地址起长度为 sizeof(Base) 的字节。派生类新增的成员变量位于该区域之外,不会被拷贝;同时目标对象的 vptr(虚表指针,指向虚函数表的运行时指针,决定了实际调用的函数版本)被设为基类的 vtable(虚函数表,存储类所有虚函数地址的结构),因此后续虚函数调用走基类版本。这就是对象切片。验证手段:sizeof 比较两者大小差异,GDB 观察内存拷贝范围(前 sizeof(Base) 字节被复制,之后字节被丢

chuangshitianzun的博客 42

反射是否真的会让你的程序性能降低?

早上看到了《【强烈谴责】博客园园友随意抄袭他人文章并作为自己原创的行为》这篇博文,实在是让人气愤,我相信大部分文章作者都是用心去写的,就这么随便被抄袭了,还抄袭得这么彻底,实在是让人无语,而我竟然也上去赞了一下这篇抄袭的文章,实在罪过。在这里希望各位能够真正尊重一下他人的劳动成果,抄袭不道德,万万使不得! 好了,正题开始。早两天写了《从把三千行代码重构成15行代码谈起》这篇文章,看到评论中有一些同...

weixin_30306905的博客 1026

2.7 C++实战100例——:unique_ptr 拷贝被禁用:只能移动

的拷贝构造函数和拷贝赋值运算符被显式删除(deleted function),这是其设计语义的物理实现——独占所有权智能指针在任何时刻只有一个实例拥有被管理对象的生命期控制权。拷贝语义意味着两个unique_ptr同时指向同一对象,这直接违反独占所有权的核心约束。编译器通过删除拷贝操作在编译期阻止此类非法行为,替代手段包括:使用std::move显式转移所有权(源变为nullptr)、改为传递裸指针(ptr.get())且不负责释放、改为传递引用(*ptr)不涉及所有权、或改用实现共享所有权。

chuangshitianzun的博客 16

深入理解IOC控制反转及应用实例

一、IOC雏形 1、程序V1.0 话说,多年以前UT公司提出一个需求,要提供一个系统,其中有个功能可以在新春佳节之际给公司员工发送一封邮件。邮件中给大家以新春祝福,并告知发放一定数额的过节费。      经分析,决定由张三、李四和王五来负责此系统的开发。     其中:由张三负责业逻辑控制模块 LogicController的开发,此处简化为UT.LogicContro

wayne liu 的博客 6811

1.12 C++踩坑排雷手册——基类析构函数非 virtual 导致资源泄漏:派生类析构不被调用

当通过基类指针删除派生类对象时,如果基类的析构函数不是 virtual,C++ 标准规定行为是未定义行为。在实践中,大多数实现表现为:只调用基类析构函数,派生类析构函数完全不被调用。其物理原因是析构函数的调用决议基于静态类型而非动态类型——delete ptr 中的 ptr 类型是 Base*,编译器生成的析构调用代码直接调用 Base::~Base(),不会通过 vptr(虚表指针,指向虚函数表的运行时指针)查找派生类的析构函数。派生类对象的内存被释放(operator delete 作用于完整对象),但

chuangshitianzun的博客 15

3.5 C++实战100例——有符号与无符号混用比较:符号提升陷阱

本文通过汇编对比 cmp 与 cmpu 指令差异证明转换规则,并给出 -Wsign-compare 拦截命令和 __builtin_add_overflow 安全算术检测。

chuangshitianzun的博客 22

框架原理那点事--不就反射嘛。

记得之前写了一篇json转实体的文章 记得之前写了一篇json转实体的文章,里面就用到了java反射的文章,但是当时只是了解到反射这个知识点,并没有深入的了解,寒假闲来无事觉顶深入整理一下java 反射的知识,一下都是个人学习反射的总结,不到之处,还望大神指点!!! 反射顾名思义就是和java编译相反的过程,这里实现的效果就是通过类名来进行实例化类对象并对类进行操作。具体看下 获取父类...

weixin_30568591的博客 316

百度智能云ASR实战:5分钟搞定Unity语音转文字(含完整代码)

本文详细介绍了如何在Unity中集成百度智能云ASR服务,实现高效的语音转文字功能。从环境配置、音频处理到服务端通信,提供完整代码示例和实战优化技巧,帮助开发者快速实现语音交互功能,适用于游戏开发、XR应用等场景。

ujm56789012的博客 215

#2020寒假集训#C++STL-vector代码笔记

#include<stdio.h> #include<iostream> #include<bits/stdc++.h>//万能头文件 #include<vector>//vector头文件 using namespace std; int main() { printf("\n"); int x; vector<int> v;/...

薄荷糖·琳的博客 225

10-142 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格

分数 10全屏浏览题目切换布局作者 lhm单位 河北农业大学本题目要求编写SQL语句,查询厂商D生产的PC和便携式电脑的平均价格。

dqd66的博客 2748

LIN总线从入门到精通:低成本汽车通信协议原理与实战

在汽车电子和嵌入式系统中,串行通信协议是实现分布式控制的关键技术。其中,LIN(Local Interconnect Network)总线作为一种专为低成本应用设计的单主多从网络协议,其核心原理在于通过简化的“领导-汇报”通信模式,在满足车身控制、传感器数据采集等场景需求的同时,将硬件与布线成本降至最低。LIN总线采用标准化的帧结构,包含间隔场、同步场和受保护标识符场,并依赖调度表来管理通信时序,确保了网络的确定性与可靠性。其技术价值在于为车窗、座椅、灯光等非安全关键系统提供了高性价比的解决方案,是构建分层

weixin_29185167的博客 260

#算法#C/C++#排序--快速排序

void quicksort(vector<int>& nums,int left,int right){ //judge if illegal if(left <right) { //two pointer int i = left,j=right; //define base int base = nums[left]; ...

Happy_Yu_Life的博客 185

Docker网络教程(四)macvlan 网络教程

在这种网络下,Docker 宿主机在它的IP之上,允许接受多个 MAC 地址的请求,然后再将这些请求路由至对应的容器里。流通,Docker 会用它的 MAC 地址,把流量路由进你的容器里。对于网络上的网络设备来说,你的容器似乎是物理上连接到网络上的。),Docker使用其MAC地址将流量路由到你的容器。对于网络上的网络设备来说,你的容器似乎是物理上连接到网络上的。你需要 3.9 或者更高版本的 Linux 内核,4.0 以及以上的版本是更好的。如果你的设备叫别的名字,用对应的名字代替。

weixin_42445065的博客 4132

C++零基础全套教程(从C过渡·全知识点完整版)

如果你已经熟练掌握 C 语言,学习 C++ 不需要从零开始重学基础语法。C++ = 完整 C 语言语法 + 面向对象 + 泛型模板 + STL 标准库 + 现代化内存安全机制所有标准 C 代码均可直接在 C++ 编译器中编译运行,本教程按照「C 语言差异→基础扩展语法→面向对象核心→高级语法→STL 容器→C++11 及新标准→嵌入式工程实战」完整分层讲解,兼顾在校学习、面试笔试、实际产品开发场景,看完无需再查找其他零散资料。宏定义缺陷:无类型检查、运算符优先级错乱、容易产生副作用;

2301_80638110的博客 566

瑞芯微rv1126 rtsp+mpp+rga取流

瑞芯微rv1109 rtsp+mpp+rga取流

ZuoSeDiao的博客 6339

ubuntu18.04安装xenomai3.1(百分百成功版)

ubuntu18.04安装xenomai3.1(百分百成功版),保姆级教学!!!

h542812556sdu的博客 2064

暑期ACM-Week1(7.15-7.21)

万能头文件、sort()基本使用方法、vector动态数组、auto语法、stack栈、pair、记忆化搜索等

weixin_72724507的博客 1491

C2000ware介绍

C2000的下载安装指南C2000目录。

小柚子的博客 2796

C++篇:C++学习笔记02

#该文章参考华文慕课——&gt;程序设计实习# C++学习笔记——STL库(标准模板库) 标准模板库(STL)就是一些常用数据结构和算法的模板的集合。其中有两个概念比较重要,一个是容器,一个是迭代器。 容器:类模板    迭代器:用来去容器中的元素,类似于指针 1.容器 容器分为三种:顺序容器、关联容器、容器适配器。 1.1顺序容器 vector:动态数组,可随机存取,可在尾部增删,...

朋诚的博客 330

【Google Play 上架】内部 / 封闭 / 开放 测试全解 — “只跑一个就能上架”?不行!

Google Play新规要求个人开发者账号在2023年11月13日后必须通过封闭测试(Closed testing)才能上架应用。封闭测试需要至少12名测试者连续14天保持参与状态,而内部测试和开放测试不能替代这一要求。三类测试轨道各有特点:内部测试用于快速内部验证,封闭测试是上架必经环节,开放测试面向更广泛用户但非必需。上架流程建议先内部测试修复问题,再启动封闭测试满足14天要求,最后申请生产发布。组织账号和早期个人账号可能不受此限制。开发者应提前规划测试人群,确保持续测试周期,并关注Play Cons

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 2799

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

c++ STL容器与算法复习笔记

本文总结了C++ STL的核心容器和常用算法,重点内容包括: 容器分类与特性: 序列式容器:vector(动态数组)、list(双向链表)、deque(双端队列)、array(静态数组)、string(字符串) 关联式容器:set/map(红黑树实现,有序)、multiset/multimap(允许重复) 无序容器:unordered_set/unordered_map(哈希表实现,高效查找) 容器适配器:stack(栈)、queue(队列)、priority_queue(优先队列) 核心算法: 排序算法:

c2634654478的博客 383

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

为什么说反射是框架的“灵魂”?

前导: 反射中获取class对象的三种形式: 1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象 多用于配置文件,将类名定义在配置文件中。读取文件,加载类 2. 类名.class:通过类名的属性class获取 多用于参数的传递 3. 对象.getClass():getClass()方法在Object类中定义着。 多用于对象的获取字节码的方式 同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的C

kepengs的博客 1094

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

第6章第4节:自定义分词器

本节详解Elasticsearch自定义分词器,解析analyzer三段式结构(char_filter→tokenizer→filter),掌握常用组件如ik_max_word、synonym_graph、ngram等。通过_analyze API调试分词效果,实现“索引时扩展同义词、搜索时不带”的生产级方案,提升中文搜索与智能提示体验。

啊渊的专栏 300

C#使用opencv和Yolo模型识别车牌号

本文基于OpenCVSharp与OnnxRuntime,结合YoloV8n-pose_plate模型(检测车牌位置)和OCR模型(识别车牌文字),实现高效车牌识别。通过预处理、目标检测、NMS筛选及文字识别流程,最终输出车牌框位置与识别文本。代码封装良好,支持自定义路径与置信度阈值,具备实际应用价值。

lweiyue的专栏 172

C# NAFNet 图片去模糊

基于NAFNet与ONNX Runtime的C# WinForms图片去模糊工具,支持DirectML GPU加速与CPU回退,实现一键去模糊、大图分块处理、并排对比及拖拽打开。具备高DPI适配、自绘圆角界面、命令行批量处理等功能,适用于Windows 10/11系统,可灵活配置模型路径与分块大小,解决显存不足与边缘接缝问题。

hixiong123的博客 259
上一篇: 基础才是重中之重~老赵写的CodeTimer是代码性能测试的利器
下一篇: 使用RML Utilities for SQL Server对性能进行分析
ArvinStudy
博客等级 码龄15年 83粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值