从写死到写活

1.背景

本来菜鸟一枚,也是刚离开母校的学生,最近在接触依赖注入框架,看到它的好处之后,突然回忆起自己写代码的道路,虽然还走得不长,确实有自己的代码从写死到写活的体会,愿能帮助到有需要的人,也愿能博大牛一笑。

2.死代码

拿最熟悉的一个例子来说明吧,数据库连接访问。下面是执行SQL数据库操作的代码:

        public void Insert(string sqlstr)
        {
            SqlConnection con = new SqlConnection("连接字符串");
            con.Open();
            SqlCommand cmd = con.CreateCommand();
            cmd.CommandText = sqlstr;
            cmd.ExecuteNonQuery();
            con.Dispose();
        }

现在客户的要求变了,“我要换oracle数据库,oracle数据库比较高级!”,客户说道。那么以前的我会怎么做呢?答案是直接在函数(不止是这个函数,所有跟访问数据库的函数)上修改咯,看到sql就换成oracle咯

        public void Insert(string sqlstr)
        {
            OracleConnection con = new OracleConnection("连接字符串");
            con.Open();
            OracleCommand cmd = con.CreateCommand();
            cmd.CommandText = sqlstr;
            cmd.ExecuteNonQuery();
            con.Dispose();
        }

加班改好之后,客户又说“oracle用得不习惯,还是mssql好~”.......哭瞎,这下又要乖乖把全部代码修回去。

显而易见这种写法的缺点是有多严重,而且面向对象原则是少改代码啊,下面来看看改良版的。

3.半死半活代码

面向对象有个很重要的特性就是多态,一个基类的引用变量,可以指向多个不同的派生类对象,就叫多态。

有什么用呢?看看下面的代码。

        public void add(string sqlstr)
        {
            IDbConnection con = new SqlConnection("连接字符串");
            con.Open();
            IDbCommand cmd = con.CreateCommand();
            cmd.CommandText = sqlstr;
            cmd.ExecuteNonQuery();
            con.Dispose();
        }

因为SqlConnection实现了IDbConnection接口,而SqlCommand实现了IDbCommand接口,所以可以用这些接口来指向具体对象。

客户这时候用嚷嚷:“某某公司都用了oracle,我们怎么能输,我们还是得用!!”,这时候改代码就只需要把具体对象改成关于oracle的数据库操作对象即可,是不是比起上面那个工作量少了一半?好像还不止......

4.依赖注入

依赖注入是ioc模式的一种实现,具体的概念我也不太清楚,请各位大侠指点。

        IDbConnection con;
        public void add(string sqlstr)
        {
            con.ConnectionString = "连接字符串";
            con.Open();
            IDbCommand cmd = con.CreateCommand();
            cmd.CommandText = sqlstr;
            cmd.ExecuteNonQuery();
            con.Dispose();
        }

然后要在一个文件上注册接口与实现类的关系

builder.Register<oracleConnection>().As<iDbConnection>();

注册之后相当于让iDbConnection接口指向了oracleConnection的实例对象

这样运行时就会执行对oracle数据库的操作。

这时候客户又说道:“什么?oracle数据库费用很高?那谁用啊,改回mssql吧~”这时候只需要改注册的关系即可。

5.总结

本随笔记录了我的一些认识,关于依赖注入框架很多东西公司都是封装好的,还要继续深入的学习,最后还是求指教~~

时间: 2024-10-14 06:01:03

从写死到写活的相关文章

切割模型固定写死了切平面方程是y=0.1

上一篇讲到3d模型切割我遇到的问题(切面的纹理会混乱),经过这段时间的琢磨,有了解决方案,当然我这里只给出我的解决思路,投入到实际项目中还需要做许多工作,比如我在上一篇中切割模型固定写死了切平面方程是y=0.1.实际项目中,我们应该是根据手指滑动来得出空间平面方程式.纹理之所以会混乱,根本上的原因是因为我们切割模型后生成出来的新的顶点是混乱无序的,所以我在这片文章里做的,就是把新生成的纹理重新排序,事实上,模型切割的关键点就只有上一篇讲的生成横切面的新顶点以及本篇解决的切口纹理,理论上解决了这两

使用&lt;jsp:include&gt;,不想写死URL,动态生成URL的解决办法

JSP中文件包含有2种方式,静态包含和动态包含.静态包含使用<%@ include file="" %>,动态包含使用<jsp:include page="" />.本文不打算介绍这2种方式的区别和使用场景,主要关注page和file属性的路径问题. 如果事先知道被包含页面的url,那么直接写死到page或file属性中即可.这种写死url的方式,没有什么不好,但是非常不灵活,不能满足动态生成url的需求.考虑这种场景,A.jsp访问B.js

给select设置默认值,在option在页面上已经写死的情况下

从后台传来数据 request.setAttribute("time", time), time有year.month属性, 而前台页面上的select中的option却已写死, 可以通过 jstl 表达式来进行判断. 这种写法只可以对简单的数据进行判断.  <select id="month" name="month">      <c:forEach var="item" begin="1&qu

C++作业代写,C++代写,代写C++,编程代写(微信leechanx)

C++作业代写,C++代写,代写C++,编程代写(微信leechanx) 概念区分之线程安全VS可重入 可重入:当被多个线程调用的时候,不引用.操作任何共享数据. 线程安全:被多个线程并发调用,最终会产生正确的结果. 可重入->由于绝对不引用任何共享数据->所以肯定是线程安全的. 线程安全->如果引用了共享数据,即使最终结果正确,也不是可重入的. 虽然引用了共享数据,但最终结果是正确的 这种引用了共享数据的线程是怎么保证安全的呢?->同步,唯一手段! 线程不安全如何改为线程安全?

C++代写,C++作业代写,代写C++,编程代写(微信leechanx)

C++代写,C++作业代写,代写C++,编程代写(微信leechanx) 主要的GC算法 三种基本方法:标记清除法.复制收集法.引用计数法 高级方法:分代回收法 一.标记清除法 标记阶段:先从根对象开始,以深度遍历的方式对其可达的对象(A可达对象B的意思是:A引用了B)标记,表明这些对象是存活的: 清除阶段:对未标注的对象进行空间回收,同时将所有已标记的对象清理标记状态,为下次标记做准备. 大致过程: 内存空间状态: 缺点: (1)标记-清除算法的比较大的缺点就是垃圾收集后有可能会造成大量的内存

Python代写,Python作业代写,代写Python,代做Python(微信leechanx)

Python代写,Python作业代写,代写Python,代做Python(微信leechanx) Redis:Cannot assign requested address的解决办法 客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端口号,所以新的连接没办法绑定端口,即"Cannot assign requestedaddress".是客户端的问题不是服务器端的问题.通过netstat,的确看到很多TIME_WAIT状态的连接.

像写诗一样写代码,玩游戏一样的开心心情,还能领工资!

[软]上海-Qt侠 2017/7/12 16:11:20我完全是兴趣主导,老板不给我钱,我也要写好代码!白天干,晚上干,周一周五干,周末继续干!编程已经深入我的基因,深入我的骨髓,深入我的灵魂!当我解决一个程序问题,比别人玩王者荣耀拿了第一名还开心!你要想想,能干自己感兴趣的事情,像写诗一样写代码,玩游戏一样的开心心情,还能领工资!真他妈爽!没有比这个更爽的事情!

用Emacs写cnblogs-从此写blog变的很easy!

*/--> 用Emacs写cnblogs-从此写blog变的很easy! Table of Contents 1 需求说明 2 解决问题 3 结语 1 需求说明 在进入正题前还是先扯些废话吧!这Emacs还是大二的时候自己玩linux的时候,我的小学同学给我介绍的,第一次就教我安装,还把他的配置文件分享给我了,[虽然都是很简单的配置,俺这同学不太喜欢弄这些虚无的东西,可我就比较喜欢].Orgmode是大四的时候,自己找老师问关于Emacs的东西的时候,我的好好东老师给我推荐的,这才进入了orgm

《自己动手写CPU》写书评获赠书活动结果

<自己动手写CPU>写书评获赠图书的读者有: 京东:8***2.16号哨兵.magicyu.kk6803.jddickyd.杰出的胡兵 亚马逊:徐贺.马先童.jaychen.farmfarm007 当当:几何老师 上述童鞋将获赠<步步惊芯--软核处理器内部设计分析> 还有那位童鞋发了评论,可是这里没有列出的,麻烦和我联系哦,能够站内信箱,也能够给我发邮件,邮件地址在书中给出了 2014-1-5 <自己动手写CPU>写书评获赠书活动终于名单出炉了,出版社已经寄出赠书,各位