OO的第四单元UML结束了,OO课到此也就全部结束了。
作业架构
这一单元的作业都是实现一个交互处理接口来实现一些查询和检查的功能。
第一次作业
第一次作业仅仅涉及到类图,完成的交互方法也都是一些查询方法。涉及到的元素从上到下为
Class、interface -> attribute、operation -> parameter三层结构
具体架构是从上到下进行建立。在交互类里面,使用HashMap建立Class的id与其所对应的对象的映射。同样接口以及其他的元素。在第二层的架构里面需要建立一个双重Map关系:由其所属上层的id作为key,value则是一个Map对应于和它属于同一个上层的同类元素的集合。第三层的建立同第二层也是双重Map进行管理。
这样的建立数据结构之后,我可以根据任何一个元素的id找到其所对应的对象,以及其下属的所有元素。
顶层的各元素的关系:类与类之间的继承,接口与接口之间的继承、类与接口的实现,类和接口之间的关联关系。我采用了新建一个类来将每一个顶层元素所对应的各种关系进行存储,便于进行搜索和遍历各种关系网图(吸收JML作业的经验)。同时由于接口和类元素在UML中行为很一致,而且id是独一无二的属性,我便将类和接口作为同一个元素行为处理,都可以作为新的类的元素。
第二次作业
第二次作业涉及到了类图、状态图和顺序图。
有了第一次的作业基础之后,我在状态图和顺序图中建立的数据结构和类图的几乎完全一样。
状态图的结构:stateMachine -> region -> state
由于在进行访问的时候需要从stateMachine直接访问到state,所以需要建立stateMachine到Region到state的俩重映射关系。
在关系上,状态图的主要元素是state之间的transition,所以我建造了一个类来进行管理state的各种关系。
顺序图的结构:interaction、attribute -> Lifelines
由于在作业中并未给出Lifeline的爷爷的具体类 ,所以建立数据结构的时候并未建立其对应的结构,只需建造两层数据结构即可。interaction对应于多个LifeLines这样的数据结构,以及每一个元素id与对象的映射。
在关系上是LifeLine之间的Message,我建立一个类来进行管理Message的关系。
在最后由于一个文件的代码行数限制,将一些方法整合出来在另外一个类中进行处理。
第三次作业
第三次作业架构上面没有发生什么变化,只是把更多的方法的处理转移到另外一个类中进行处理。
总的来说这次架构不完美,没有考虑到代码行数的问题,应该给每一种图的处理都建立一个类在不同的类中进行处理,这样架构清晰,代码也不显得臃肿拖沓。
架构总结与方法理解演进
架构
四个单元结束之后,回头看之前的代码,之前的架构确实挺烂的。
第一单元的架构中,由于当初懒并没有建立一系列的数据结构来进行管理数据,比如表达式树等结构,导致类的关系复杂,完全体现不了面向对象的思想,几乎全是面向过程的思想。
第二单元中的架构设计上相比第一次要好一点,采用生产者-消费者模式,生产者负责从输入读取并创建需求,消费者负责从生产者的生成队列中拿出需求。然后进行处理需求。由于需求的处理是随机的,所以架构上缺乏了调度器的实际功能体现。
到了第三单元JML的作业,这单元的实质就是填充方法,由于架构的设计是课程组给好的,按照其架构进行填充方法与数据的管理。架构基本没有什么问题,这一单元的bug是在于填充方法时不细心没有考虑清楚情况也就最惨的一单元。
第四单元,架构的缺点在于没有考虑到代码的长度问题导致后来疯狂修改括号的空行来进行弥补。
OO程序的架构在我们目前写的小项目中体现的还不是很深刻,一般般的架构和随心的设计都可以通过测试。但是这样的设计在稍微大的项目中就很会在实现中遇到很多困难。特别在写第四单元的时候,我研究过课程组给的输入输出的解析处理程序,感觉自己写的代码很烂,自己的代码没有体现出OO的思想。
架构的设计往往决定了项目实现的复杂程度,好的架构可以方便很多数据的管理。
方法的理解
四个单元过程以来,对于方法的理解,从开始的认为方法就是函数就是进行某些操作来得到自己想要的结果,到现在认为方法的本质就是处理和管理数据,我觉得对于方法的理解加深了很多,对于java的设计思想与设计方法也愈发的觉得美妙与神奇。可能目前我的java水平还只是皮毛,我的理解也只是皮毛,但是通过这四个单元确实收获很多java的思想和设计。
课程收获
在OO的这四个单元以来,收获很多。
-
基本的面向对象思想的理解与设计。
-
对于IDEA的熟练使用。
-
对于java线程安全的实现的基本理解,能够实现正确的基本的并发程序
-
了解到java的各种设计模式
-
JML语言的读与写
-
-
对于代码的更加深刻的理解
除了上述以外,OO这门课带来的收获还有很多很多,我相信在未来的某一时间,这些收获会带给我意想不到的惊喜。
修改建议
-
OO这门课的第三单元和第四单元的内容在某种程度限制了我们写代码的思路与想法,不如在第一二单元中那样的自由。在前面我们的代码都是从0开始一点点的设计,我觉得这样更能够锻炼我们处理需求与设计的能力。在后面的代码中往往给定特定方法的功能与用途,我们去填补去实现,虽然实现的时候并没有限制,但是在实际的处理需求中,没有人会给我们建立好大概的接口与架构我们去实现,很多都是需要自己去进行设计。
-
JML单元的内容和博客作业,挺让人为难的,那些工具用处很小,而且配置起来有点复杂,有点得不偿失。
-
建议稍微加强中测与弱测的强度,毕竟有的测试连程序的一些方法都没有测试到。。
体会
线上OO很OO,个人很喜欢这样的全依托网络学习形式,给予我们分配学习时间很大的灵活性。但是也有缺点不能和同学面对面debug,少了点肝bug的味道。
一学期下来,OO这门课给我的感觉真的很棒!收获很多,助教和老师也都超级认真和负责,给予我们很多帮助与经验。有研讨课让听大佬门分享经验与思想;有实验课加深对于讲课与作业的理解;有互测环节可以观摩其他同学的架构与设计,同时可以找bug“刀”人,恰分;还有强测的心理洗礼,每次看强测结果都是要鼓足勇气去查看,有看到bug时的不甘与懊悔,有看到满分时的快乐与幸福。OO这门课真的很棒!
感谢经常帮我debug的同学,感谢你从preview到homework15的帮助与陪伴!
最后感谢老师和助教的帮助与付出!