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

简介: 前两天写了一个 “使用了继承、多态还有工厂模式和反射,但是还是没有OO的感觉。  ”,看到了很多同学的回复,自己又反思了几次,终于有所感悟,写下来做个记录。 一、先说一下我学程序的经历。       我是97年在高一的计算机课程里第一次接触编程语言——QBasic。

前两天写了一个 “ 使用了继承、多态还有工厂模式和反射,但是还是没有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 > 11)                //去掉前面的86
                    Mobile = Mobile.Substring(Mobile.Length - 11,11);

                msg 
= dr["Msg"].ToString().Trim().Split(' ');        //获取短信的标志
                
                
//根据标志加载处理短信的实例,在这里省去了 case 。
                msgRecv = (HBS.SMSReceive.MessageReceive)Assembly.Load("HBS.SMSReceive").CreateInstance("HBS.SMSReceive.MessageOperation" + msg[0].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 == 0)
                
{
                    
//正确执行,发确认短信。
                    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就是这么个东东,学的时候根本就不能想具体的实现代码,只能想大体的情况。如何设置基类,设计几个属性、设置几个函数、几个事件,这样就完事了,至于如何实现是另一回事了,呵呵。

还是要感谢一下伍迷,多亏了他的小菜系列。
相关文章
|
2月前
|
程序员
从代码中感悟生活的哲理
【9月更文挑战第12天】本文以编程为引子,探讨了技术背后的哲学思考。文章通过深入浅出的方式,结合生活中的小故事和简单的代码示例,引导读者理解在看似冰冷的代码背后所蕴含的热情与智慧。文章旨在启发读者,无论面对何种挑战,都应保持初心,勇于探索,不断学习,最终找到属于自己的人生方向。
|
6月前
|
数据采集 大数据 Python
学Python静不下来,看了一堆资料还是很迷茫是为什么
学Python静不下来,看了一堆资料还是很迷茫是为什么
62 2
学Python静不下来,看了一堆资料还是很迷茫是为什么
|
存储 编译器 C语言
重生之我要学C++第三天(类和对象)
重生之我要学C++第三天(类和对象)
69 0
|
人工智能 前端开发 JavaScript
没想到真有此书!!!《一个程序员的自我修养》
最近在看程序员的自我修养 (豆瓣),作者陈逸鹤,一本写给程序员的思考书,其实市面上类似题材的书也不少,比如我看过的另外两本内外兼修:程序员的成长之路 (豆瓣)、程序员必读的职业规划书 (豆瓣),我只是后悔自己看的太晚,很多道理明白的太晚,要多看看此类书,给自己寻找点方向感和动力,我也一直在努力践行书中的一些方法和认识,本文是此书的第一部分内容的归纳,希望对你有帮助,感兴趣的朋友可以买来此书详细学习。
|
运维 Java Shell
复习shell编程规范与变量看这篇就够了(孤独前是迷茫,孤独后是成长)
复习shell编程规范与变量看这篇就够了(孤独前是迷茫,孤独后是成长)
256 0
复习shell编程规范与变量看这篇就够了(孤独前是迷茫,孤独后是成长)
|
自然语言处理 程序员 数据库
过年了,给亲朋好友解释「啥是程序员」
前言 一年一度的春节又到了,作为程序员的你是怎么告诉亲朋好友自己日常到底是做什么工作的呢? 程序员是一个新兴的职业,我在上大学以前不了解程序员到底是做什么的,对编程语言也一窍不通,也不关心玩过的「游戏」和天天逛的「网站」究竟是怎么来的。
1640 0
|
Python 机器学习/深度学习
听过很多道理,依然过不好这一生?
网上有一个经典的段子“听过很多道理,依然过不好这一生”。同样的道理我们也可以问问自己“学过这么多年英语,依然开不了口”,“看了这么多书,依然编不了程序”。
1084 0
|
SQL 程序员
这个程序员太厉害了,上帝要学编程,于是带走了他
1944年,詹姆斯·格雷出生在美国的旧金山,上大学时,凭借不错的数学功底,拿到了数学和工程双学位,并在1969年取得了计算机博士学位。他是结构化查询语言(SQL)的发明者。如果没有他,世界大概不会是今天的样子,自动提款机、网上购物,甚至是Google Earth的问世都要推迟。
1584 0
|
前端开发 Java 程序员
【程序媛晒83行代码】认真工作的程序媛原来是这样,你想到了嘛?
据说认真工作的程序员魅力值加10,这段代码你能猜的出来嘛。
3152 0