前言

“真正的勇士敢于面对惨淡的人生,敢于面对淋漓的鲜血”

我是谨慎拜读了鲁迅先生的名言,怀着崇敬的精神去接触这门课程的。

而当我真的经历了这门课程以后,我才发现,刘和珍君这样的觉悟,我们普通人,果然还是达不到啊....

第一次作业(多项式加减法)

第一次作业,听学长说,是很水的,水到了闭着眼睛写别人都很难找出错,想调试刁难你都很难刁难的地步。

听到这话的我,自然是十分的放心的,毕竟我是早就预先学习了java的,几百行的程序也有所试手,编程能力虽菜,但自认也只是菜狗水平,于大菜狗还是望尘莫及,外加多项式加法不知道写过多少次,随便把一个C的代码拿出来咔咔一改,面向过程的版本就算完成了。

然后,我满怀自信的打开eclipse,想写完了赶紧去玩两把游戏。

再然后,这个周末我就和游戏告别了。

按照预先的设计,我一开始完美的构造出了项,系数,多项式等类,并且为他们的属性尽全尽美的写了调用方法,等到真正写主干程序的时候,发现基本都用不着

因为先前没用过正则表达式,直接就去CSDN上搜了一篇教学,十几分钟就模仿着写出一个像模像样的来了,等到调试的时候用了俩小时才发现那教程写的是不对的,赶紧换一个对照的改,改出了一个一二百字符的史诗长串,结果最后还是没改对(因为这个出了BUG)

看了指导书,我完美的抓住了幂次只能为正的这点,心想那不有符号也只能有正号,于是写了一个超级偷懒的多项式分析算法,结果当学姐在客服群里告诉我-000也是合法输入的时候,我的心情是崩溃的。

到了周三,我舍友告诉我正则可能爆栈,我一想谁这么无聊用大数据炸我,我Catch了Readme还不行嘛...结果发现我自己的史诗长串连大的正常范围内的例子都会爆....于是改改改改改,最后改不了的部分就只能把头扎在北航教书育人的土地上当鸵鸟....

最后果然没写好的部分还是被查出了两个问题,正则匹配写的不对居然没法检测字符‘|’,某些地方多正号不会报错....

第一次作业给我的教训:

1.再简单的东西,设计都是很重要的,设计的可行性固然是第一位,简明性也极为重要,不要有了一种自我感觉对的想法就去写,不然冗余的代码会严重拖累你的思想和程序。

2.用到什么学什么是没错的,照猫画虎也是我们学习的主流,但请务必比对着学明白了试一试再干,不然调试会浪费你更多的时间

3.不要看了指导书的要求就像钻没写部分的空子,否则会被你“友善”的同学用鲁棒锤成棒槌。

4.不要完全相信学长的话。尤其是在自己是菜狗而学长是julao的情况下

PS:

还要以下一些道听途说到的事情....

线性代数很简单,数据结构不用听课,概率统计每年题一样, 操作系统很水....

第二次作业(傻瓜电梯)

为了避免第一次作业的惨剧,这次我提前做了设计,构思了几种方案,脑内估摸了一下,选择了相对最适合这次作业的。

当时我构思的几种策略有:

1.elevator跑时间轴,每0.5一跑,按信息相应(方便后面于多线程接轨)

2.电梯内置在调度系统里,全知全能监控

3.电梯负责运转和记录时间,调度器来控制和发出电梯指令

最后毫无疑问我选择了3,因为1现在写起来的确由于难度,就算完成了多线程的时候也势必要按照要求去重构,二的话可扩展性是在是太差了,而且到了后期的时候调试也会有很大的问题,更是不太符合面向对象的思想。

这次作业由于是气势十足,加上难度也是试手级别,所以完成并没有花费太多时间,主要的难点在于同质请求的判断理解上,而这个问题则再一次像我强调了好好阅读辅导书的重要,如果不能清晰的理解题意的话,哪怕是一个小于号改成小于等于号的举动,都可能导致一整类难以被发现的错误。

在用自己写的样例构造工具进行测试并和舍友互相沟通了理解以后,这次我提前的信心满满的提交了。

然后,结果还是被对面亲爱的同学查出了两个错....

依旧是一个边界情况,是一个样例内很难出现的问题,是一个看到了以后不用三十秒就完全可以改正的小错,然而我压力测试居然没有覆盖到。

这次的经历告诉我,努力是必须的,而完美是永远需要追求的,如果真正想要达到无懈可击,还需要在程序的逻辑结构的严谨性上再下功夫才行。

第三次作业(稍微有点聪明的电梯)

这次作业无疑是上一次作业的承接版,完成的难度很大程度上有上一次作业的用心程度而定。不过从这次作业开始值得注意的是,指导书变得有些不像前两次那么可以直观理解了。

其实依据本次作业的要求,实现方法可以由很多很多种类,但是由于我为了契合指导书以按图索骥,没有采用蜗牛背着重重的壳,一层层往上爬的思想,自己写了一个“执行块”以按头调度,结果在调试的过程中付出了很多的代价。

相信对于以后的作业,单纯弄懂指导书的要求,然后像机器人一样照做肯定是不够的了。理解与转化将是一个非常重要的主题,否则你会发现自然语言易于描述的部分,换成真正一行行代码实现以后,很容易漏洞百出。

这次我跑了很多不同的样例,也接受了舍友很多理解解读的帮助,也正是从这一次我才真正的明白了,发现自己错了然后去改错的被动Debug方法不总是行之有效的,当你想要实现一个功能却需要东拼西凑乃至从新特殊写一个很别扭的方法时,真的没有对自己一开始搭建的策略有所怀疑嘛?写代码开始时设计好固然很重要,而写代码中间适当的停一停反思也是必须的,毕竟,当你程序中需要一行一行敲去判断的特例太多的时候,出不出BUG已经不是你所能控制的了。

尽量减少游离于主体之外,专门为特殊情况服务的语句,做好真正意义上的封装,是防BUG于未然的最好方法。

我与OO (1)的更多相关文章

  1. GLUT的简洁OO封装

    毕业设计用到了OpenGL,由于不会用MFC和Win32API做窗口程序:自然选用了GLUT.GLUT很好用,就是每次写一堆Init,注册callback,觉得有点恶心,于是对他做了简单的OO封装.记 ...

  2. Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结

    Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结 1. Sql语言应该得到更大的范围的应用,1 1.1. 在小型系统项目中,很适合存储过程写业务逻辑2 1.2. 大型 ...

  3. OO中,先有对象还是先有类?

    就是问,在面向对象思想里,先有对象还是先有类,乍一看和先有鸡蛋还是先有鸡是一类问题,其实不然!这个问题,在lz考研复试的时候被面试官问过,一模一样,如今又在一个笔试题里看到了类似的题目,眨一下,有人会 ...

  4. OO方式下,ALV TREE和ALV GRID的不同之处

    作为大部分报表程序的基础,ALV GRID差不多是每个ABAP开发者必须了解和掌握的内容,因此网上也不乏相关资料,而ALV TREE的应用相对较少,中文资料也就比较少见了.实际上,ALV TREE和A ...

  5. 从人类社会的角度看OO(独家视角)

    引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的"社会"关系,从而让我们抛弃书 ...

  6. HDU5288 OO’s Sequence

    Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number o ...

  7. lua下的简单OO实现

    笔者学习了当前(文末各文献)lua下的各种OO实现方法.略作笔记. 也提出了一些自己的想法.主要还是记录供将来着之参考.   1.概述   首先[2]PIL第二版中给出了OO的基于table的实现方式 ...

  8. OO的五大原则是指SRP、OCP、LSP、DIP、ISP。

    OO的高层原则,面向对象设计的基本原则 设计模式之六大原则--开闭原则(OCP) 设计模式之六大原则--迪米特法则(LoD,LKP) 设计模式之六大原则--接口隔离原则(ISP) 设计模式之六大原则- ...

  9. OO.A.D.P

    OO/A/D/P 对象和类 三大特征 对象: 对象是面向对象语言的一个极为重要的特点,所有的面向对象语言都有对象的共性. 1. 职责(单一) 2. 属性(数据.可改变的) 3. 函数(行为.方法.业务 ...

  10. Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js

    Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js 1.1. 封装性是面象对象编程中的三大特性之一  三个基本的特性:封装.继承与多态1 1.2. 魔 ...

随机推荐

  1. Linux 6.8 源码安装MySQL8.0

    搭建环境说明: 系统版本:Red Hat Enterprise Linux Server release 6.8 (Santiago) 内核版本:Linux 2.6.32-642.el6.x86_64 ...

  2. python中常见的报错,总结一下,以后看。

    AttributeError 试图访问一个对象没有的属性,比如,乔峰.nameIOError 输入.输出异常:基本上无法打开文件ImportError 无法引入模块或者是包:基本上是路径问题,或者是名 ...

  3. JavaScript调用上下文(第九天)

    call与apply用法 使用哪个对象去调用相应的方法: var name="window"; var obj={ name:"obj" } function ...

  4. linux下禁用网卡的启用网卡的一些方法

    第一种方法: 这种方法主要是在不重启的情况下会一直生效,适用于服务器. #禁用网卡eth0 sudo ifconfig eth0 down #启用网卡eth0 sudo ifconfig eth0 u ...

  5. XSS(四)攻击防御

    XSS Filter XSS Filter的作用是过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果 XSS Filter作为防御跨站攻击的主要手段之一,已经广泛应用在各类Web系统之中, ...

  6. sqlite 使用 cte 及 递归的实现示例

    1.多级 cte 查询示例. with cte as ( select pageid from cm_bookpage ) , cte2 as ( as content from cte ) sele ...

  7. Django学习笔记之数据库-模型的操作

    模型的操作 在ORM框架中,所有模型相关的操作,比如添加/删除等.其实都是映射到数据库中一条数据的操作.因此模型操作也就是数据库表中数据的操作. 添加模型 添加模型到数据库中.首先需要创建一个模型.创 ...

  8. request&response

    /* request&response 1.什么是HttpServletRequest HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP ...

  9. 【C++】static关键字的总结

    转自 https://www.cnblogs.com/BeyondAnyTime/p/2542315.html C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的s ...

  10. Sql case when 示例

    SELECT       单元编号,年,月,   项目编号='11111',   sum(case  when 项目编号= 'ZB010201' then [当月额] else 0 end ) 医疗收 ...