面向对象思想

面向对象之期中总结

写在前面:下面是从一个渣渣从自己的角度写出这半个学期来的理解收获感想困惑的,大神们若有不同之见欢迎提出,渣渣很荣幸能够得到大神们的教诲!

一、   对OO的理解

根据我去年暑假做java大作业的浅薄经验,“面向对象编程”无非就是建几个类,添几个属性,然后把一些函数从C程序里直接搬到类里作为方法,随着课程的推进渐渐发现这里面大有学问。

面向对象远不止将一些类堆积在一起那么简单,它是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建满足客户需求的软件系统。说白了就是在程序构造的世界中像现实世界一样对各类事物分门别类,然后进行模拟,以求设计并实现一些功能。

它与面向过程编程的区别是程序设计体裁上的差别,正如文学作品体裁多种多样——诗歌、散文、小说等等。

由于还未有过使用C语言写规模较大、相对复杂的程序的经验(比如像OS实验这种近千行的C程序),因此根据肤浅的认识,私以为面向过程的程序设计就是先考虑要实现什么总体功能,然后将大功能目标分解成几个步骤,设计出对应的方法去实现某一步功能的这样一种思想。而OO则并不是从计算机的角度去思考问题解,而是充分利用人的分类思维,以对象为抽象单位,通过操作这些对象来完成目标,同时还增强了代码的可重用性。

因为设计思维上符合人类的自然思维习惯,OO思想在建模复杂系统层次模型,开发大规模工程上得到广泛应用,而要想写出一个优秀、规范的OO程序并不容易,有很多需要遵循的原则和关注的细节。比如第七次ppt中讲到的SOLID 原则,此外还应该遵循“高内聚,低耦合”原则、显式表达原则以及命名方面让人“望名生义”的原则。

二、   收获

半个学期过去了,想要很好地完成这5、6次编程作业的确需要付出很大的精力承受很大的痛苦,但是在程序设计能力上的确有显著的提高,让我认识到下面这几点在程序实现过程中的重要性。

1.    鲁棒性

这个名字不太让人适应,但是它描述的却是你的程序能否适应用户纷繁复杂的输入,并保持程序的稳定性、提供持续的服务,这的确是程序员走向市场前应该掌握的基本功。大家在对Crash的恐惧中已经基本实现了这一特性——采用正则表达式匹配恐怕是最好的方法,然而与实际的程序开发其实还是有差距的。正常情况下,用户应该有多种有效输入方式,我相信大多数人(包括我)都是一个正则加一个readme粗暴解决的。当然这一部分并不是面向对象建模这门课的重点。

2.    清晰明朗的程序结构

第一次的多项式作业对于现在的我们来说层次可能算是很简单了,然而当时却依旧沉醉在C体裁中无法自拔,一个主类是程序入口,而另一个类(其实就是一个方法)则是包办了一切功能的实现,保不定某个地方就出错了(实际上确实出现了bug),后来才慢慢从教主的推荐结构设计中体会到好的程序应该是一张图几条明朗的线就能让别人了解你的逻辑你的设计的!

而到后面的更加复杂的程序,比如JVM与第三次电梯,有一个清晰明了的结构那就更为重要了,否则调试时乱的自己就无从下手,再加上多线程运行的不确定性,调试时又只能自己去控制线程执行的顺序,与实际运行是有区别的,这种情况下即便是脑袋炸了也无济于事。

3.    线程安全

提出线程的概念是为了提高程序的响应效率和CPU资源的利用效率,然而并发的线程十有八九都是需要共享资源(也就是临界区)的,那也就带来了安全问题,谁先用谁后用?一不小心就会陷入死锁!因此想要提高效率不是那么容易的,我们需要时刻提防着安全问题的出现——设置原子操作、添加同步互斥机制等等。现在回过头来看第五讲提出的生产者-消费者模式实际上是非常有用的机制。用好了这一模式相信很多问题都能够迎刃而解了(好吧,我就没用好出现了问题)!

三、   困惑

1.    原子操作

在第三次电梯实现过程中产生了一个疑问,就是假如我要使下面这块代码执行过程中不受中断(这段代码并不是临界区,只是必须一下执行完毕才能不出安全问题,这或许是我这个渣渣设计的结构不好开出来的脑洞):

if(!queue.isEmpty()){

      req= queue.peek();

      if(req.getTime()<=time)

             req= queue.poll();

             queueHappened.add();

}

在这一段程序中我先判断queue是否为空,如果不为空的话就取出(peek)队头元素并查看时间,然而我在另一个线程中也对queue判断了是否为空并进行其他判断然后有可能会将队头元素取出(poll),因为线程之间的执行不确定性有可能造成这个线程中取出来的req是null,然后再对req查看时间时就出现了Crash,很显然如果只对peek进行同步操作是无法避免这个问题的,因此我设想对这一段代码进行控制,使得该进程必须要把这几句代码执行完毕之后才能够切换到其他进程(没有相同方法),敢问各路大神这是否是属于原子操作呢?如果能实现这样的操作应该如何实现呢?烦劳各位大神解答了。

2.    对于多线程电梯

对于教主推荐的多线程电梯结构图,从愚人的角度来看是要用时钟去驱动所有的电梯的运行以及请求模拟器的工作,此外又由调度器线程去更改时钟,各种线程交织在一起,很难不出现问题,最后愚人无奈驾驭不了那么多线程,之后取消将调度器实现为线程才勉强出了一些结果。渣渣承认设计上存在很多问题,但是我就是顺着教主的结构图去一步一步构建的多线程电梯啊!后来我脑洞一开,这种靠时间驱动的多线程恐怕用Verilog来实现是更容易得多的,因为即便面向对象思想竭力去模拟这个真实的世界,但是计算机毕竟只能顺序执行指令,必须要在指令之间分出个先后顺序,而这个世界呢?用线程来衡量是根本衡量不了的!因此我才会想出Verilog实现电梯的调度才是最好的选择,用真实的时间去驱动电梯运行。而大家平时乘坐的电梯肯定也是靠硬件电路去实现信号控制任务调度的!如果教主的确想训练一下我们多线程编程的能力,我倒觉得实现简易JVM是一个很好的磨练。

《Java程序设计》课程实验指导书程序代码(答案)(实验一),个人原创,仅供参考与交流。 实验一 Java开发环境的安装与配置,熟悉Java程序结构 一、实验目的: 1. 掌握JDK的安装步骤。 2. 理解环境变量PATH, CLASSPATH的作用,以及它们的设置方法。 3. 熟悉Editplus(或TextPad,JCreator)编辑环境,编写简单的Application程序和Applet程序,并编译和执行。 二、实验内容: 熟悉JDK的安装和配置,学习如何编写并运行简单的Application程序和Applet程序(能输出一条简单的问候信息); 三、实验要求: 1. 能正确地安装JDK 2. 熟悉环境变量PATH, CLASSPATH设置方法,熟悉编辑环境 3. 调试程序、编译,运行后得到正确的结果 4. 写出实验报告,要求记录编译和执行Java程序当中的系统错误信息提示,并给出解决办法。 四、实验步骤: 1.从http://java.sun.com 上下载最新版本的JDK,并安装。 2.设置环境变量PATH, CLASSPATH, 使得Java程序能正确编译和执行。 3.在Editplus(或JCreator ,Textpad)环境下编写一个HelloWorld.java程序, (1)在主方法static public void main(String[ ] args)中调用System.out.println()方法,使程序输出一条问候信息; (2) 编译运行程序,观察运行情况和输出结果。(使用JDK环境,调用javac.exe和java.exe编译和执行程序) 4.在Editplus(或JCreator ,Textpad)环境下编写一个HelloWorldApplet.java程序。 (1)在public void paint(Graphics g)方法中调用g.drawString()方法,使程序输出一条问候信息; (2) 编译运行程序,观察运行情况和输出结果。(使用JDK环境,调用javac.exe编译和浏览器解释执行Applet程序)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值