浅谈计算机编程的学习与面向对象的思想

 

一、什么是程序

1、程序=算法+数据结构;

好的程序离不开好的数据结构。好的数据结构能够精简程序所使用的数据,方便程序的编写、算法的实现。好的算法就是怎么高效的处理这些数据,得到自己想要的结果。

2、从表现形式看:程序(program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。为实现预期目的而进行操作的一系列语句和指令。

3、从最终结果看:程序是用汇编语言、高级语言等开发工具编制出来的可以运行的文件,在计算机中称可执行文件(后缀名一般为.exe)。

4、通俗的说,程序就是一个由数据、功能语句按照一定的执行结构(顺序、循环和条件)组成的执行序列。大家一定会想,这些简单的东西能组成现在计算机这么复杂的系统么?答案是肯定的。其实再复杂的程序最基本的语言要素也是由这些组成的。当年的阿波罗登月计划(1961-1972年)中飞船用到的控制程序,其实就是这些基本元素组成的。

二、编程语言的选择

我们常听到或看到这样的信息:计算机领域技术进步太快,需要不断学习新技术,这句话不要太信以为真。世界上最先进的产品和软件,都在大量使用二三十年前的技术(就像现在的人不也还在学孔子、老子的著作的道理一样,真正的经典是不会过时的,基本的思想也不是那么容易变的)。学习任何一种新技术,一定要花点时间追溯其源,否则很容易就乱花渐欲迷人眼了。

 

实际上,大家想过没有电脑只会识别0101的机器码。那么所有的语言最终都是要转化为机器码的,所以编程的语法是学习编程语言的关键,只要掌握了语法你就可以同时经通几种语言了。换句话说如果你能精通一门语言,那么你可以在很短的时间内学习精通另一门语言,因为你需要学习的只是新语言的语法和新语言为你提供的新特性。所以,这里我所讲的语言的选择不是考虑学习什么语言好,而是如果想成为真正的程序员需要走过的路。

1、从C/C++开始

虽然C是面向过程的,但整个Windows系统内核都是C语言写出来的。

C/C++的参考资料最多,现在很多的软件系统都是用C或C++写出来的。

C/C++的操作比较接近底层,有利于以后反过头来对底层技术的探索。

2、Windows API编程

从中可以了解很多操作系统提供给我们的对底层操作的函数和接口。例如:驱动的开发、对系统资源的管理和控制等。

有资料表明:微软底层实际提供的API大概有八千个,公开的有大概三千个,但经过黑客的破解又得到一两千个,也就是说剩下的那三千个函数能做什么只有微软自己知道。谁能保证其中没有后门程序,所以,为了绝对保密,真是除了物理隔离,一点办法也没有。

3、面向对像(OO)的语言(C#或JAVA)

在这个阶段主要选择C#,因为C#是微软开发的,有得天独厚的先天条件,可以从这些开发语言中了解到新的开发架构和新特性,这里包含的思想基本都是IQ在160以上的IT精英们,站在操作系统最前沿想出来的,并体现在开发平台上。

但当你对面向对象的思想掌握的非常深入,对C#提供的新特性都吸收化为自己的东西之后,你可以考虑学习JAVA,不为别的,就因为它是开源的。

4、对编译原理和编译器的认识

了解你所使用的开发语言的编译器,从根本上明白高级语言到IL(Intermediate Language)再到机器语言的转换过程。要想真正的精通编程,你就不但要会编写源代码,还要知道这些源代码是如何变成机器所能识别的机器语言。

学习编译原理,对你了解、认识一种语言的编译器,优化自己的代码,提高执行效率,了解程序的来龙去脉,能起到很关键的作用!

 

这里重点推荐C++,有如下理由:

1、它即可以是面向过程的,又可以是面向对象的;有人说它是中间语言,因为它不是完全的高级语言,还包含不少低级语言的要素。

2、一旦你的程序往下多挖了一层,你就会非常体会到MFC的可贵之处,另外在执行效率上,MFC绝对是一流的。

3、C++中由于有较完整的微软基本类库,因此它的功能强大,使用方便。使开发Windows应用程序变得简单而高效。它提供的复杂的资源编辑器,可以很方便地编辑对话框、菜单、工具栏以及其他组成元素。

4、通过学习高级语言了解到的开发架构和好的编程思想,可以在C++的学习和开发过程中有很大的助益,比如你可以使用C/C++开发自己的类库。

三、怎么学习编程

1、扎实的理论基础

计算机十大专业课:数学,离散数学,数据结构,编译原理,汇编,数据库,计算机体系结构,操作系统,计算机网络,软件工程。当然外加一门英语,这个我不说,大家也是懂的。把理论基础打扎实了,在以后的学习和研发过程中会受益无穷。

举个简单的例子:数学。前些天看到一个同学的签名是这么写的:今天数学老师写满一黑板解了一道题后,双手支在桌子上语重心长的对我们说:我真不知道你们学这有啥用!听着是不是很熟悉,小时候的我们应该也都问过这样的问题吧,可现在还会这么问吗?

2、掌握一门编程普遍语言

当然尽量是主流的语言,而且方便以后向其他语言转型的。重点是掌握语言的语法和基本的编程技巧。

3、掌握一种编程工具

当然要与前面所选的编程语言相关。重点是掌握这个编程工具基本用法,如菜单、程序跟踪调试等功能的用法。

4、实现一个模拟的小型工程项目

重点掌握软件开发的基本过程和方法。将所学知识系统的应用其中:纸上得来终觉浅,需知此事要恭行。

5、附一些经验总结

1、学习编程最忌的就是纸上谈兵,因为这是一门实践性很强的学科。

2、多看大牛写的开源的代码,从中了解其软件设计的框架和思想。

3、学会使用MSDN: MSDN是微软自己出版的技术文档,Visual Studio 2010的配套MSDN有2.36G,都是文档资料,大家可以想像一下究竟有多大。如果一个人自称是C++或C#程序员而不会使用MSDN,你绝对有理由认为他是一个初学者。

4、多上CSDN网站,这个网站自称是全球最大的中文IT社区,目的是:为IT专业技术人员提供最全面的信息传播和服务平台。在这里可以解答别人提出的问题,也可以自己发贴求助。还有很多的源代码,电子书籍等资源。

5、写代码是件很苦差事,一来不容易出成果,二来经常容易碰壁。所以一定要坚持。

6、要多交流,真正大的项目一般不会是一个能完成的,必须依靠团队的力量。

7、培养计算机的思维,用程序设计的眼光来看待问题。机器毕竟是死的,而且从根上说,只能识别0和1,因此如何通过它能理解的逻辑来实现功能才是我真正在考虑的。

这里举一个大家都熟悉的例子:RGB三元色。如果直接给你一个颜色,让你在计算机上显示出来,你肯定会觉得一头雾水。实际上大家都知道,只需给三个基色指定相应的数值就可以得到。所以我们要做的事就是建立适当的模型,把现实问题转化成计算机能理解的模型。

下面简单介绍一下面向对象的思想,实际就是创造了一种模型,来表达这个纷繁复杂的世界。

四、面向对象

1、传统的面向过程的开发架构存在的问题

(1)软件重用性差

重用性是指同一事物不经修改或稍加修改就可多次重复使用的性质。软件重用性是软件工程追求的目标之一。

(2)软件可维护性差

软件工程强调软件的可维护性,强调文档资料的重要性,规定最终的软件产品应该由完整、一致的配置成分组成。在软件开发过程中,始终强调软件的可读性、可修改性和可测试性是软件的重要的质量指标。实践证明,用传统方法开发出来的软件,维护时其费用和成本很高,代码的可修改性差,维护困难。

(3)开发出的软件不能满足用户需要

用传统的结构化方法开发大型软件系统涉及各种不同领域的知识,在开发需求模糊或需求动态变化的系统时,所开发出的软件系统往往不能真正满足用户的需要。

造成上面问题的主要原因是:传统面向过程的开发架构的本质是功能分解,而功能分解通过问题空间的转换来获得。从代表目标系统整体功能的单个处理着手,自顶向下不断把复杂的处理分解为子处理,这样一层一层的分解下去,直到仅剩下若干个容易实现的子处理功能为止,然后用相应的工具来描述各个最低层的处理。因此,结构化方法是围绕实现处理功能的“过程”来构造系统的。然而,用户需求的变化大部分是针对功能的,因此,这种变化对于基于过程的设计来说是灾难性的。用这种方法设计出来的系统结构常常是不稳定的 ,用户需求的变化往往造成系统结构的较大变化,从而需要花费很大代价才能实现这种变化。

2、面向对象的基本思想

面向对象(Object Oriented ,OO)是当前计算机界关心的重点,它是90年代至今,软件开发方法的主流。在计算机语言中,最直接的表现形式就是类,整个.NET就是一个庞大的类库。面向对象是一个非常大的概念体系,我这里讲到的主要是这个模型的基本思想。

概念:根据客户需求抽象出业务对象;然后对需求进行合理分层,构建相对独立的业务模块;之后设计业务逻辑,利用多态、继承、封装的编程思想,实现业务需求;最后通过整合各模块,达到高内聚、低耦合的效果,进而满足客户要求。

注意:面向对象是一种思想模型。通常我们考虑事情的方法,表现为是将问题的解决按照过程方式来解决呢,还是将问题抽象为一个个对象来解决它。很多情况下,我们会不知不觉的按照过程方式来解决它,而不是考虑将要解决问题抽象为对象去解决它。也就是“面向对象”和“基于对象”的区别。从事面向对象编程的人按照分工来说,可以分为“类库的创建者”和“类库的使用者”。使用类库的人并不都是具备了面向对象思想的人,通常知道如何继承和派生新对象就可以使用类库了,因此我们需要明白,使用类库只是在形式上是面向对象,而实质上只是库函数的一种扩展。

(1)所涉及的基本概念

一、对象:是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。

对象的状态:一个对象用数据值来描述它的状态。

对象的行为:用于改变对象的状态的操作。

二、类:具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象。

类具有属性:是对象的状态的抽象,用数据结构来描述类的属性。

类具有操作:是对象的行为的抽象,用操作名和实现该操作的方法来描述。

三、消息和事件。

消息:对象之间进行通信的结构,它可与用户行为或系统行为相关联。

事件:事件是某时刻发生的某件事,会激发相应的消息发送给系统的消息链,查找适当的处理函数响应事件。

(2)面向对象的主要特征

假如动物是基类,有需要吃饭的属性,包含能动这个行为。那么鸟可以继承此类,马也可以继承此类,他们都有需要吃饭的属性,但鸟的动是用飞的,而马的动则是用跑的。它们继承了的动物都具有的属性(继承性),但其行为却不相同(多态性)。

一、封装性:封装是一个概念,它的含义是把方法、属性、事件集中到一个统一的类中,并对使用者屏蔽其中的细节问题。一个关于封装的实例是小汽车——我们通过操作方向盘、刹车和加速来操作汽车。好的封装不需要我们考虑燃料的喷出、流动问题等。

二、继承性:继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。继承性是面向对象程序设计语言不同于其它语言的最重要的特点。

这样至少有以下两个好处:在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重用性。另外,提供了类的规范的等级结构,通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。

三、多态性:多态性是指相同的操作或过程可作用于多种类型的对象上,但可以获得不同的结果。即不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。

多态性允许每个对象以适合自身的方式去响应共同的消息。多态性增强了软件的灵活性和重用性。

(3)接口、抽象

接口跟抽象主要为了面向对象的设计而出现。

接口本身反映了系统设计人员对系统的抽象理解。接口从深层次理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。

接口应有两类:第一类是对一个体的抽象,它可对应为一个抽象类(abstract class);第二类是对一个体某一方面的抽象,即形成一个接口(interface),一个抽象类可能有多个接口。

(4)面向对象设计的准则

模块化:面向对象开发方法很自然地支持了把系统分解成模块的设计原则,对象就是模块,它是把数据结构和操作这些数据和方法紧密地结合在一起所构成的模块。分解系统为一组具有高内聚和松耦合的模块是模块化的本质。

抽象:面向对象设计方法不仅支持过程抽象,而且支持数据抽象。

信息隐藏:在面向对象方法中,信息隐藏通过对象的封装性来实现。

低耦合:在面向对象方法中,对象是最基本的模块,因此,耦合主要指不同对象之间相互关联的紧密程度。低耦合是设计的一个重要标准,因为这有助于使得系统中某一部分的变化对其它部分的影响降到最低程度。

高内聚:尽量将模块中对数据处理的方法都包含在内,或者说处理方法可以本身或经过适当的组合之后完成对模块内数据的所有操作。

五、开发语言的未来

1、面向对像的思想是王道

2、程序设计语言是软件的重要方面,其发展趋势是模块化、简明化、形式化、并行化和可视化,如果最终能用自然语言编程是最好的。

3、Java因其是开源代码,在中国很有发展潜力。

一、在一个新的环境下,编造一个类似微软的企业还是有可能的

大家都在用的QQ,原型是MSN;

百度的原型是雅虎、谷歌;

淘宝也是参考国外的架构开发的么。

虽然这些都只是应用层面上的,但还是很能说明问题的。

二、中国现在是一个网民4.5 亿的国家,中国不会永远没有自己的操作系统和开发语言的,IT业是一个更新换代非常快的行业,苹果的传奇就告诉我们在IT界没有不可能的事。

Ipod的出现颠覆了人们听音乐的习惯;

Iphone手机的出现同样使手机市场上的巨无霸诺基亚感到了压力。

也就是说如果有一个非常好的架构,一群非常厉害的人物,在IT界短时间内颠覆一个行业完全是有可能的。

4、做为程序员,终极目标应该是架构师,从顶层设计整个软件或系统的未来。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值