0. 前言
第一阶段 java 作业分为 3 次.
第一次作业是简单得一些语法和一些简单得逻辑思维, 主要内容有求三角形是什么三角形的, 还有就是求坐标点所在范围的, 也涉及到了数字和字母的转换, 总之相相当于是给 java 初学者得一次入门练习, 但是这个是基于在有 C 语言的基础之上;
第二次作业是关于日期求下 n 天还有上 n 天以及两个日期之间相差多少天, 里面涉及得比第一次多了一点, 涉及到了日期的基本逻辑判断以及简单算法的设计, 同时还用到了方法, 以及方法之间的调用;
第三次作业主要是对类的理解和运用, 作业题目还是跟第二次作业是一样的, 也是有一个一元二次方程解的, 还有 3 个日期的题目, 题目是一样的, 但是 3 个题目之间类之间的关系和类图是不一样的, 根据不同的类图来写出不同的代码.
1. 作业过程总结
(1)三次作业之间的知识迭代关系
1. 三次作业之间有明显的迭代关系, 每次作业中的每小题作业里面也有明显的迭代, 所以做作业的时候老师也是建议我们要一个题目一个题目按顺序来.
2. 第一次作业是最简单的, 完全就是基于我们大一学过的 C 语言, 比如使用简单的 for 循环, while 循环, 还有 if 判断语句, 还有一些用了 swtich..case.. 语句就能解决, 就迭代关系来说, 第一次作业里面的各个题目, 是没太大的联系的, 第一次作业就是让我们通过练习来适应 java 里面的一些语法, 让我们的编程习惯从 C 语言转变过来, 适应适应这么新的语言.
3. 第二次作业相对于第一次作业来说 , 又增加了难度, 不过还是没有涉及到面向对象思想, 仍然是面向过程的思想, 这次作业用到了的结构有选择, 循环, 方法, 数组, 依然还是方法的调用. 主要是求日期类的, 不过这里面的三个日期题目之间也是有着联系, 第一个日期题目是求某一日期是星期几的, 第二个题目是求下一天的, 第三个题目是求前 n 天的, 求下 1 天或者上 1 天其实跟求前 n 天或者后 n 天相联系的, 搞懂了下 1 天, 下 n 天也就可以解决了, 所以说作业内的题目也存在迭代关系.
4. 第三次作业还是求关于日期的, 但是这次是面向对象而不是面向过程了, 涉及到了类, 单一职责原则, 理论上是一个类处理一个功能, 尽量类之间关系不要太复杂. 这次的日期题目一个题目里面要实现求下 n 天, 上 n 天, 以及两个日期之间相差多少天的功能. 3 个题目测试的功能都是同一个, 但是之间的区别是类的区分不同.
第一个日期题是只有一个类 DateUtil, 全部写在这个类 DateUtil 里面;
第二题日期题是设计了 4 个类 DateUtil,Year,Month,Day, 类之间有着聚合的关系, 并且关系比较复杂, 是 DateUtil 包含 Day 类, Day 类包含 Month 类, Month 包含 Year 类, 关系复杂, 并不是一个好的设计, 耦合性比较高.
第三题日期题也是同样的是类之间聚合的关系, 也是有 4 个类 DateUtil,Year,Month,Day 这个但是相当于是 Year,Day,Month 这个 3 个类围着 DateUtil 这个类, 也是一种聚合, 这种聚合比第二题的那种聚合好多了, 数据参数的调用没有那么复杂, 不用通过一层一层的类调用再去拿来数据用, 代码会更简单, 编程人员的思路也更简单;
这 3 题之间就是属于迭代的关系, 是 3 种不同的设计, 3 种设计里面可以说各有优点, 但总的来说最后一个设计是更好的.
(2)如何通过作业逐步从面向过程过渡到面向对象
刚开始接触 java, 写 java 作业完全还是按照 C 语言的路子来, 就是写一大段代码, 然后把代码弄到相应的方法里面去, 结果正确就 ok 了, 但是后来因为老师的要求, 以及这门语言本来就是面向对象的语言, 我开始看 bilibili 里面的视频, 知道了对象这个东西, 知道了 new 的用法, 写代码的时候慢慢发现了面向过程虽然写起来思路不复杂 (这是相对于写代码本人来说), 但是如果你把这个代码给另一个人, 可能别人就理解不了你代码是用来干嘛的, 而面向对象里面的类, 刚好可以满足这个需求, 比如一个类就只有一个功能, 这样使用这个代码的人员(对象) 就能比较容易的得出你这个代码的具体功能是用来干嘛的. 开始慢慢的开始写类, 去 new 对象, 以及慢慢的去学会用对象去调用类里面的属性和方法, 作业里面的要求也是要用到类, 然后就通过写作业 , 来完成作业的要求来慢慢的理解了一点面向对象的皮毛.
(3)作业过程中自己的思路和遇到的问题及解决方法
第一次作业
思路: 题目刚出来把 5 道题目都看了一遍, 于是大概判断了难度和代码量, 果断把税率计算的放到了最后, 因为代码量比较大, 其次就是把判断三角形类型放到倒数第二, 因为虽然这个逻辑比较多, 要考虑到很多种情况, 其他的就可以按照顺序来了.
遇到的问题:
1最基础的问题, pta 里面的主方法要写成 Main 而不能是 main.
2没有注意代码的严谨性, 一些空格输出没有控制好, 导致一系列格式错误.
3电话键盘复制模数字转换题目里面没有把字母强制类型转换, 导致运行结果错误.
解决方法: 在 char 类型变量前面加(int), 强制转换为数字, 然后通过 if ..else.. 语句来控制输出.
4做三角形判断类型题目中出现 double 类型的 a*a+b*b==c*c 来判断直角三角形会出现误差, 然后导致测试点会通过不了.
解决方法: 百度了没找到, 咨询了同学, 发现我们可以用把误差范围减少到很小其实也可以约等于 ==, 也可以达到判断直角三角形的效果, 比如 a*a+b*b-c*c<=1e-10, 然后发现就解决了问题.
第一次作业比较简单, 一般错的都是比较基础的错误, 加上 eclipse 有自动纠错功能, 一般语法错误不会出现, 算法这次作业也没有, 所以算得上是入门的 java"面向过程".
第二次作业
思路: 刚出题目就看了一下全部题目, 把第一题一元二次方程做了, 这个属于级别为 1 的题目, 然后发现后面 3 个题目都是跟日期有关的, 并且题目说了不准用日期有关的类, 所以肯定是要先把这些算法想出来, 再进行敲代码.
遇到的问题:
1一元二次方程 b,c 均为 0 的情况没有考虑到, 因为我以为这个包含在 1 个实数根这个测试点里面了.
解决方法: 在代码 里面多加了一个 if(b==0&&c==0)语句, 在运行就解决了问题.
2计算求当前日期距离 1 年 1 月 1 日的天数出了问题, 当时没有取解决这个问题, 只得到了该题的 27 分.
3求下一天的时候出现跨年的情况没有考虑清楚导致出现 13 月的情况, 闰年 29 非闰年 28 的这种错误并没有出现
解决方法: 加上了 if(month==12&&day==31), 就有 year++; 使得年份可以加 1, 然后月和日复位到 1.
4刚看到第四题求下 n 天的时候思路是跟第三题求下一天的思路是一样的, 但是又不太一样, 当时遇到的问题是 n 天, 我要解决的同样还是跨月, 跨年问题, 不同于一天, 而是 n 天(n 是有范围的, 属于(-10,10), 显然, 负数跟正数的算法是不太一样的, 当时就卡在那里了.
解决方法: 考虑到这种算法的抽象想象是比较难想得, 于是我打算用几个具体的例子来设计算法, 于是我就想到了用 2 月 29(闰年),12 月 31 日, 这个来设计求 n 为正数的情况, 还有 1 月 1 日用来求 n 为负数的情况, 然后我假定 n 为一个具体的数, 然后找出 day 跟 n 的关系, 然后有些是 day=day+n, 有些是需要 day=31-(day-n)的, 大概就是这些类型的, 然后就还是把代码给补全就 ok 了.
第三次作业
遇到的问题:
1首先类的传参数问题, 我不知道怎么传参数, 不会构造有参方法.
解决方法: 我百度, 然后解决了, 就是将 this. 属性 = 特定的参数.
2第一次提交第二题的作业, 发现只有 10 分, 只有边界测试和非法数据的测试过了测试点, 求下 n 天, 求上 n 天, 求两个日期之间间隔多少天都没有通过测试点.
解决方法: 发现这里的 n 不像第二次作业的那样有范围, 这里的 n 可以是很大, 所以我就发现我之前的那个算法出现了问题, 之前的那个算法并没有考虑 n 过大的情况, 于是我重新设计了算法, 就是从 i = 0 一直加到 n, 这样一天一天的算, 遇到跨月跨年, 就按照之间的算法来, 发现最后前 n 天, 后 n 天的答案是正确的.
3运行超时问题.
解决方法: 运行超时是因为我循环的次数太多了, 所以我就想到了如果 n 大于 366 天, 我是不是可以按照一年一年的减少或者增加来算, 然后我就设计了如果 n 大于 366 的时候, 就每一次减少 365 或者 366,year-1 或者 year+1, 当 n 小于了 366 的时候, 就按照之前那个一天一天啊的算的算法, 发现运行没有超时了, 成功通过了 .
4不知道怎么从其他类里面调用方法, 也不知道怎么把属性传到其他类里面去.
解决方法: 咨询了同学, 举个例子, 可以 year = new Year(y); 这样, 然后调用方法后来我发现了如果你打了一个点(.), 他后面会出现提示, 然后我就是这样摸索摸索完成了第四题和第三题.
(4)每次作业花费的时间比例
第一次作业: 花费时长大概一共是 2 个小时, 第一题: 0.8h; 第二题: 0.3h; 第三题: 0.3h; 第四题: 0.3h; 第五题: 0.3h;
第二次作业: 花费时长大概一共是 12 个小时, 第一题: 0.5h; 第二题: 4h; 第三题: 3.5h; 第四题: 4h;
第三次作业: 花费时长大概一共是 30 小时, 第一题: 1h; 第二题: 23h; 第三题: 2h; 第四题: 4h;(我先做第四题, 做第三题发现简单了许多, 错误也少了许多)
(5)对编程过程的逻辑严谨性的认识及教训
1首先字母的拼写要注意, 尤其是方法的命名, 不然你发现方法不一致, 代码很长的情况下, 你会比较麻烦.
2java 输出格式要特别注意规范, 多一个空格少一个空格都要注意, 还有标点符号也是要注意, 血一般的教训.
3算法的优越性和实用性, 设计一个算法, 要尽可能完美一点, 不然可能代码换一个地方, 换一个题目就不能用了, 就是算法的适用范围可以广一点.
4类之间的关系要注意, 尽量不要出现空指针异常的情况.
2.OO 设计心得
(1)面向过程与面向对象的比较
我觉得面向过程就是简单得把一大串代码放在一起, 虽然小分工有方法来承担但是大分工不是很明确.
面向对象则是用到了类, 一个类有一个大分工, 使得代码更加清楚明了, 不同得程序员看这段代码更容易看得懂, 这就是面向对象得一个优点之一, 单一职责原则.
(2)面向对象设计的基本原则理解
暂时了解的就只有单一职责原则: 就是每一个类一般来说就执行相对应的功能, 不要加其他别的功能, 比如我计算 Day 的 就是计算 day 有关的, 不要计算 year 或者 month 的, 尽量不要在一个类里面把功能搞得这么复杂.
(3)OO 编程思维的理解
我觉得 oo 编程思维主要体现在类的设计, 类之间的关系上, 是聚合还是其他的什么, 同时类之间的耦合度高低都是跟类的设计有关, 我们就是要想办法把类设计得好, 让单一职责原则体现出来, 同时程序能很容易被读懂.
3. 测试的理解与实践
(1)测试对于编码质量的重要性
测试对于编码质量是非常重要的, 就相当于测试游戏的 bug 一样, 如果一个代码, 你不去测试的话, 那可能别人用你的代码都不放心, 你的代码功能这样也是不完全的, 很容易出现得到错误的结论的情况, 所以测试是非常有必要的.
(2)假如让你设计测试用例, 你会如何做
比如这个的作业日期类的, 首先我会设计一个闰年的 2 月 29 日, 非闰年的 2 月 28 日; 超出了时间范围的例子; 非闰年的 2 月 28 日, 2 月 29 日; 输入 n 是 5000 的情况还有 n 是 int 类型最大值的情况
总之, 不管是什么题目的测试, 我们在设置测试用例的时候, 一定要考虑到普通和特殊的情况, 只要把普通和特殊这些情况都考虑到了, 其实测试用例也就差不多了.
4. 课程收获
这一个阶段下来, 还是学到了一些东西, 一开始学的 C 语言学的并不是特别好, 现在经过这一阶段的补习相当于, 算法设计能力提高了, 编程的速度也提高了, 同时还知道了面向过程和面向对象的一点点区别, 知道了类和对象这个东西, 知道了类之间的调用, 明白了算法优化的重要性, 不然会出现超时的情况, 也懂了我们编写的代码要尽可能好一点, 确保能在多处地方用得上, 同时, 知道了怎么去通过单步调试去改进自己的代码, 通过测试用例来知道自己那里的代码出现了问题, 算是培养了一个小小的整体大局观吧.
5. 对课程的建议
(1)希望老师能更多的讲一些例子, 我觉得通过讲例子能更好得帮助我们来学习 java, 这样学起来没有这么抽象.
(2)老师可以多讲一下下次作业有关得内容, 这样下次作业做起来不会这么吃力.
(3)老师可以上课少讲一下理论的, 就是比如一个类的使用, 可以给我们展示一下, 这样我们比较容易记住这个类的具体用法.
来源: https://www.cnblogs.com/c-s-s-forever/p/12597657.html