BUAA OOpre课程总结

前言

经历过大一被C语言数据结构折磨的痛苦,对本菜狗来说,6系的大二也不乏挑战。但经历过面向对象先导9周的学习和6次丝滑的迭代作业,我的JAVA编程技术和对“面向对象设计”理念的理解都有了极大的提高。鉴于课程优秀的难度梯度设计,这个过程虽然艰难,却并不痛苦。下面将是我对这九周学习的小小总结。

1. 代码最终架构和迭代中的架构变化及反思

(一)代码最终架构

代码结构
以下为详细解释:

类:

1)Main:程序的入口,仅负责读入字符串和调用Action。
2)Adventurer:冒险者类,负责存储冒险者的信息、实现冒险者的行为。
3)Bottle:水瓶类,负责存储水瓶的信息、实现水瓶的行为,实现对某个水瓶信息的访问,下有子类:
①RegularBottle
②RecoverBottle
③ReinforcedBottle
4)Equipment:装备类,负责存储装备的信息、实现对某个装备信息的访问,下有子类:
①RegularEquipment
②CritEquipment
③EpicEquipment
5)Food:食物类,负责存储食物的信息、实现对某个食物信息的访问。
6)Log:日志类,负责战斗日志的记录和信息提取。
7)Shop:商店类,负责存储和访问交易信息以及实现交易行为。
8)Action:行动类,负责对Main函数中读到的字符串命令进行解析并映射到实现具体的行为,此外还负责实现不同冒险者间的行为(如冒险者间的进攻等)。

接口:

Commodity:价值体接口,用于获得不同类型价值体的价格和某一ID价值体所属类型。

(二)迭代中的架构变化

1.在引入水瓶和装备的不同种类的那次迭代中,第一次在代码中引入父类-子类的继承关系,并且通过函数重写实现了在子类和父类中不同的函数调用。

2.在引入被雇佣冒险者的那次迭代中,为了求解各种物品的价值,实现了Commodity接口,把每个对象都视为一个“价值体”,代替了对每个物品分别进行函数调用的方法,使代码更简洁。

(三)一些反思

1.把所有方法都在Action中解析和实现并不是最好的选择,其实可以把Action类仅作为一个解析器,然后各个方法分别用一个单独的类实现,让Action仅仅调用这些方法类,这样既可以方便我们逐个进行方法的测试,又能使代码看起来简洁。在我的代码中由于要考虑简洁性,甚至还开了Action2类作为弥补,非常的不优雅。

2.尽可能使用已有的库函数实现功能,例如求不同ID的对象类型时,最开始并没有想到有.GetClass().GetName()这一库函数调用,使得开发时间大大延长,写了很多不必要的代码。

3.命名规则上安排的不甚合理,导致同一行字数过多,代码不美观,在用小驼峰命名法时,应当选取对象最简洁的表述方式。

4.迭代过程中由于没有考虑到新增代码对旧版本方法的影响产生了不少BUG,说明对项目的整体把握还不够,此时我们可以在设计前就把各个类和方法的结构图绘出,做到有的放矢,谋定后动。

2.使用junit的心得体会

1.就使用方法而言
一定要注意每次迭代开发后要对之前的Test文件进行更新,在有较大改动处,我们可以直接重写测试文件。此外,在每次迭代后,每个类都会或多或少地新增方法,此时我们只需要再创建一个Test类,同时只勾选新增的类方法即可。junit是我们在较大规模程序设计中除断点以外的又一便捷的辅助定位错误的工具,它在断点之上,既避免了断点选取和逐步进行的麻烦,又能精确地定位到类里的每一个方法,这使我的编程效率和准确度都得到了极大的提高。

2.就使用效果而言:
junit可以帮助我们在提交前精确地测试每一条指令、每一个分支是否能够按程序员的意愿正确地工作,非常适用于大规模协作的项目开发,就这次迭代开发而言,也帮我挑出来了不少BUG。此外,在具体实现方法测试的过程中,我发现自己创建的很多类方法都有互相嵌套的部分,使得代码不够简洁不够优雅,具体调用的时候也会因为功能近似而难以抉择,这里我选择合并功能相近的方法,在具体实现的时候再对方法的输出进行微调,这样调用起来感觉更丝滑。

3. 学习面向对象先导的心得体会

1.对面向对象概念的理解:
理解面向对象的概念(如封装、继承、多态等)让我对编程有了全新的认识。我觉得最让我印象深刻的是老师在上课时举出的一些实际的案例,例如商店卖东西、实现不同动物的叫声等等。子类继承父类、子类重写父类,这些方法在我们的理解中都非常地自然。面向对象思想提供给我们一个看待世界的全新视角:一切皆类,类实例化为对象。

2.对封装、继承和多态概念的理解:
封装允许我们将数据和处理数据的方法结合在一起,形成一个独立的实体。这使得我们可以隐藏数据的细节,只通过公开的方法来访问和修改数据。这种做法提高了代码的安全性,便于维护和修改。继承允许我们基于已有的类创建新的类,新类继承了原有类的属性和方法,同时还可以添加自己特有的属性和方法。这种机制大大提高了代码的重用性,也使得我们能更好地组织和管理代码。多态允许我们使用一个接口表示不同类型的对象,从而使代码更加灵活,虽然不同的对象可能有不同的行为和属性,但它们都可以共享相同的方法和属性,这使得我们能以一种统一的方式处理不同类型的对象。

3.对设计模式的理解:
在最后一次迭代开发作业中,我接触到了工厂模式、单例模式、观察者模式等。这些模式提供了一种在复杂系统中高效地组织和设计代码的方法,在大规模开发中能够提高代码开发的效率和代码互用性。

4.对代码的可维护性和可扩展性的理解:
面向对象编程强调的是代码的组织和抽象能力。我开始意识到,编写高质量的代码不仅仅是指实现众多复杂的功能,更重要的是要考虑代码的可维护性和可扩展性,要保证迭代开发后新增的功能对历史代码的影响和改动尽可能地少。通过合理地划分类和对象,以及使用设计模式,我们可以使代码更加模块化、易于理解和修改。

5.对开发中在本地测试的理解:
在进行作业的迭代开发过程中,junit的测试使我更加关注代码的质量和功能完整性,而不是简单地实现功能。通过不断地编写和修改测试用例,我们可以不断加强代码的可测试性和可维护性。

4.一点小小的建议:

希望可以在时间允许的情况下多点关于git的讲解,例如可以通过录制实操视频的方式加深同学们对这一强大工具的了解。此外,希望互测功能也能加入到面向对象先导的课程中,让课程更加欢乐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值