OO——从不知到知道一点,从迷茫到豁然开朗 (迟来的我的2002到2007)

前两天写了一个 “使用了继承、多态还有工厂模式和反射,但是还是没有OO的感觉。  ”,看到了很多同学的回复,自己又反思了几次,终于有所感悟,写下来做个记录。

一、先说一下我学程序的经历。

      我是97年在高一的计算机课程里第一次接触编程语言——QBasic。刚接触根本就是什么都不知道,菜到什么程度就不说了,但是对编程很感兴趣,高中三年也多少写了几行的代码吧,都是basic的,都是一行一行地,写函数都很少用。写程序呢也都是自己写着玩的。

     由于对计算机感兴趣,又加上成绩也不怎么地,所以呢我是选专业而不是选学校(也没有那个能力:))。最后考到了市电大的计算机专业。第二学期开始学习汇编语言,幸亏有basic的基础,还能看得懂。第三学期学习C++、数据结构,第四学期学习VB6.0。

     所以编程方面一直都是面向过程的思路,只是在C++里面知道了有个类(class)的东东,其他的关于面向对象就不知道了。

     02年初开始上班了,用的还是vb6.0,作sp的开发,也就是短信,业务逻辑也很简单,也还是面向过程。这时候我才会使用SQL 2000。

    03年换了一家公司,开始使用asp.net了。那时还是 vs2002呢。一开始使用C#。面试我的技术经理使用的是C#,给了我一段他写的代码让我去读懂(当时我还不会.net呢)。读了不到一周,大体上是看懂了。很幸运居然通过了面试,开始正式使用和学习.net。

    上班后发现一个问题,除了经理,其他的程序员都在用vb.net,于是又改用vb.net来写程序,毕竟以前一直在用vb,所以感觉很亲切。写的程序是一个有点像OA的东东,给一个公司定制开发的。写的代码也都是事件驱动,根本就没有类的感念。

    04年上半年又换了一家(好像换的有点勤),这个就不说了,失败呀。 上半年又换了一家,感觉这时候才开始“正式”学习.net(这时已经使用vs2003了)。对于程序不仅仅停留在会用就行了的阶段了,开始研究更高一点的东东了,具体点说呢就是基本类库,服务器控件等。

   我一开始使用.net的时候(03年)就是使用类似于sqlHelp的自己写的help来操作数据库,现在有时间来完善和扩充功能了。一开始是很简单的了,然后是一点一点地增加功能。

   完成任务之余开始编写服务器控件,主要有两个:分页控件和联动下拉列表。一开始是根本就不会用控件,找了一本书开始试着写。控件是使用vb.net来编写的。原因很简单:一是亲切、而是vb.net的IDE很友善,很适合于初学者自己琢磨,因为提示很多很详细,很多在C#里没有的提示在vb.net里面都有。比如说枚举的提示。

    我写的分页控件和吴旗娃的那个不同,吴旗娃的只工作在UI层,分页的算法和访问数据库的功能都不在他的控件内部实现,需要在控件外部实现,当然这样就很容易兼容不同的数据库。而我的呢把分页的算法和访问数据库的功能都包含在控件内部了,所以调用起来是很方便和简单的。好像有点跑题了。

    总之前几年是根本就没涉及到面向对象的东东,流行的三层我也是不用的,感觉三层要写很多的代码,太累了,因为是我一个人写代码嘛,写那么多的代码多累呀(那时候代码生成器还没有现在这么流行呢)。而我自己早就有了自己熟悉的写代码的方式,为什么要改变呢?

二、开始说OO了

    开始学习面向对象还是在去年吧。又换了一家公司,这个公司比较奇怪,来了之后先学习OO的基础,借着这个机会才把封装、继承、派生、多态、委托、接口学习了一遍,其中委托、接口还是一知半解,前面的几个也没有完全理解。可能使学习的不好吧,被炒了。这还是头一回呀。

    以为自己已经被淘汰了,已经到了不会OO就没有工作了的时代了。但是还得有个工作来糊口哇,于是又找了一家。在这里才渐渐恢复了自信。发现原来OO的时代还没有到来,不会OO还是可以找到工作的。

    但是OO还是要会一点的,设计模式也是要学习一下的。于是呢在工作之余继续学习OO和设计模式。理解了封装、继承之后呢,在自己的程序里面使用了一下,感觉还是比较方便的。于是继续学习。但是这之后就感觉内什么进展了,因为换成了OO的方式,我的代码会成倍的增加,没有必要吧。

    好了终于说到了前几天的事情了。我们遇到了这么一个需求:我们公司有好多客户,每个客户用的软件都不太一样,有的是OA,有的是CRM,有的是OA + 定制开发。但是呢每个客户都可能需要实现收发短信的功能。于是就有了那篇帖子。

    客户的需求是不断变化的,短信的种类也是不定的,会不断地增加短信种类,和修改短信的处理过程(也就是业务逻辑了)。我们有好几个组,每个组都负责不同的项目和客户,每个组都有可能会涉及到短信的处理这一块。

    很显然短信的处理方式要写成一个通用的,就是每个小组都可以用,每个项目(OA、CRM、定制开发),每一个客户都可以使用。短信处理有固定的部分(接收短信和发送短信)和变化的部分(短信的具体的处理方式)。于是我就想把固定的部分写成一个 winfrom 程序(A项目),在服务器上运行;变化的部分写成一个单独的项目(A项目),然后编译成dll,在由A项目来引用(通过反射来调用)。这样A就可以大家一起用,一起升级;B项目根据具体的情况具体编写。

   这样就方便多了,谁也不会影响谁,既可以各干各的又可以“共享”通用部分的代码。

   实现的代码已经在那篇文章了写了。可能题目写得不明确吧,“没有OO的感觉”说的是,写完了之后感觉并不是OO的方式,还是用的面向过程的思路,于是有了这个题目。

     有同学说要使用触发器来实现,触发器是可以实现的,这点我承认,但是有很多的缺点:代码多,不便于阅读;不便于扩展、不便于分工。说具体点:如果用了触发器的话,那么以后关于短信处理的或就都归我了,因为别人看不懂,想帮都帮不了忙。

    关于触发器我就不多说了,昨天晚上和他QQ聊了很久,太累了。

   最后说一下我对OO的理解吧。记得神雕侠侣里面有一段情节,就是杨过学了好多的武功,感觉每一种武功都有优点,同时也都有其缺点,不知道该用哪一种武功好,自己一个人在山石上和几,练习,思索,甚至会发狂。几天过去了,最后终于领悟到:管他是哪门哪派的武功,对方发什么招式,我用什么招接最好,我就用什么招。管这一招是哪一门那一派的呢,管他的上一招是什么下一招是什么呢,完全拆开来为我所用。那么我们写程序是不是也可以这样呢?

    现在回过头来看看那段代码,如果使用case 来实例化不同的子类的话,那是不是就成了简单工程了呢?如果使用了接口那是不是就成了策略模式了呢?如果A是发布者,B来订阅,那是不是有成了观察者模式了呢?但是实际上什么模式都不是,只是一个使用了反射来调用子类的一段代码。

    实现功能、实现我想达到的目的就行了,管他用的是什么呢?有关系吗?

#region 处理接收到的短信

        private void monitorInSMS()

        {

            string strSQL = "select * from inbox ";    

            DataTable dt = dal.RunSqlDataTable(strSQL);

            string Mobile = "";            //去掉 86 的手机号

            string[] msg = null;        //短信的类型。

            string re = "";                //处理短信后的结果。""表示正确执行。

            

            //遍历短信

            foreach (DataRow dr in dt.Rows)

            {

                Mobile = dr["mbno"].ToString();

                if (Mobile.Length > )                //去掉前面的86

                    Mobile = Mobile.Substring(Mobile.Length - ,);



                msg = dr["Msg"].ToString().Trim().Split(' ');        //获取短信的标志

                

                //根据标志加载处理短信的实例,在这里省去了 case 。

                msgRecv = (HBS.SMSReceive.MessageReceive)Assembly.Load("HBS.SMSReceive").CreateInstance("HBS.SMSReceive.MessageOperation" + msg[].Trim());



                if (msgRecv == null)

                {

                    //没有找到对应的分析短消息的类,设置默认选项

                    msgRecv = new HBS.SMSReceive.MessageOperationOther();

                }



                msgRecv.dal = dal;        //设置“数据访问层”的实例



                //处理接收到的短消息

                re = msgRecv.SaveMsg(Mobile,dr["ArriveTime"].ToString(),dr["Msg"].ToString().Trim().Replace("  "," "));



                if (re.Length == )

                {

                    //正确执行,发确认短信。

                    msgSend.SendMsg(Mobile,"我们已经收到了您发的短消息,并且保存成功!");

                }

                else

                {

                    //没有正确执行,发送错误信息。

                    msgSend.SendMsg(Mobile,re);

                }

                

                //移动短信,把短信移动到历史记录里面

                msgRecv.LogMsg(dr["ID"].ToString());

                

            }

            

        }

        #endregion

  有同学说这段代码是“DAL和BLL”混在一起的,这个对于我来说是比较特殊的,

string strSQL ="select * from inbox ";    

       DataTable dt = dal.RunSqlDataTable(strSQL);

这段代码是  DAL还是BLL呢?我现在是写在了 所谓的 BLL里面了,但是如果要把它分出去写在DAL里面会怎么样呢?DAL里面只有一行,BLL里面再调用一下(还是只有一行),我感觉这样是很没有必要的。

如果他说的不是要把这样的代码分离出去的话,那我也找不到要把什么样的代码分离到 DAL里面了。

另外  dal.RunSqlDataTable 是类似于 SQLHelp这样的help 是通用的。所以对于我来说基本上是没有DAL的概念了。

好像还有点什么要说的,想不起来了。太晚了先写这点吧。

ps:

我一开始学OO的时候,看到大家举的例子,什么猫了、狗了、汽车了什么的,这个郁闷呀,我的代码里哪里来的什么猫叫、狗叫的,这叫我怎么写呀。其实OO就是这么个东东,学的时候根本就不能想具体的实现代码,只能想大体的情况。如何设置基类,设计几个属性、设置几个函数、几个事件,这样就完事了,至于如何实现是另一回事了,呵呵。

还是要感谢一下伍迷,多亏了他的小菜系列。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android 技术栈

Android 面试资料集锦

14340
来自专栏Java学习网

每个程序员都需要学习 JavaScript 的7个理由

每个程序员都需要学习 JavaScript 的7个理由 最近在和招聘经理交流现在找一个好的程序员有多难的时候,我渐渐意识到了现在编程语言越来越倾重于JavaS...

24690
来自专栏Java学习网

10个使用Java最广泛的现实领域

10个使用Java最广泛的现实领域 如果你是一个初学者,刚刚开始学习Java,你可能会想Java有什么用呢?除了Minecraft貌似也看不到其他用Java写的...

36280
来自专栏跨界架构师

如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车

之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能。本篇准备把剩下的购物车的基本概念一次处理完。

15630
来自专栏大数据挖掘DT机器学习

利用pthon爬虫和数据分析在618抢购Macbook pro

好久没玩点有意思的了,这次借618这个购物节,自己也要搞台mbp,顺便搞一波大新闻. 对某宝的其中四家店,再加上某东一家店,对比同一款机型,对价格进行监控...

64970
来自专栏杨建荣的学习笔记

go语言学习初体验

我们暂时先抛开go语言,咱们说下行业里近两年的哪些技术发展最火,毫无疑问是Docker和Kubernetes,没错,他们是go语言的顶级项目。

16820
来自专栏程序员的诗和远方

20180826_ARTS_week09

第一种方法,把数字转成字符串,再变成数组,倒转,然后再变回字符串。 很明显,这个方法效率不高。

10510
来自专栏上善若水

007-golang-GO 编程高手的五个阶段

第一个阶段(菜鸟): 刚刚学习了这门语言。 已经通过一些教程或者培训班了解基本的语法,可以写短的代码片段。

28730
来自专栏coding

写下这行代码时,只有我和上帝知道是怎么回事01.烂代码的路径依赖02.对于烂代码应采取零容忍03.代码规范的重要性04.文档的重要性

"算了,这里的代码有说不清的玄机,重构相当于在给自己挖更大的坑,还是按照原来的写法吧..."

10430
来自专栏程序人生

为什么SOA如此重要

SOA是Service Oriented Architecture的缩写,希望你知道其大概意思。在上一篇文章「测量」中,我引用了Bezos的一段将Amazon的...

33760

扫码关注云+社区

领取腾讯云代金券