OOpre 课程总结

hihiczx hihiczx 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

OOpre 课程总结

架构设计

项目结构图

顶层的 Main 类主要实现输入的解析与操作种类的识别判断,并将相应的指令传递给 Database 类,Database类管理相关操作。Database 类中直接管理了 Adventurer 类和 Fightlog 类。Adventurer 类下又管理了 Bag 类和 Equipment 类、Bottle 类、Food 类。

同时,还实现了一个 Commodity 接口和一个 Shop 接口。Adventurer 类、Equipment 类、Bottle 类、Food 类在许多 get 方法和属性上有相似之处,将它们都放在 Commodity 接口下来管理。Shop 接口实现了三种价值体的 Shop,并都采用了单例模式。

在几次的迭代中,我侥幸的在总体架构上都没有过较大的改动,在一些比较关键的设计上,我都在最初就采用了较为合适的做法,或是比较快的“迷途知返”,找到了更加正确的实现方法并尽早修改,从而避免了较大范围的重构。个人认为的几个比较关键、易于出现错误的设计主要有:

  1. Main 类中的方法总长度限制问题。在第一次迭代时,我类似于之前打算法竞赛做大模拟题的思路与做法,将所有过程的实现都放在了 Main 类下。这样做在不久后就会受到方法内的行数限制,并且更重要的是这种做法违背了面向对象的设计原则。因此我在不久后便新实现了一个 Database 类,管理所有的冒险者、战斗日志等信息,并在内部实现了各种对冒险者的操作方法。
  2. Bottle 的使用。在出现 Bottle 的使用操作后,我在 Bottle 类中添加了 isFull 属性用于判断 Bottle 是否被使用,而非将它的容量设置为 0。这样做更加直观、准确的描述了 Bottle 的属性,并且在未来的迭代中避免了一些潜在的错误。
  3. 在出现携带操作的时候,我实现了一个 Bag 类,用于管理冒险者携带的各种物品。而在 Bag 内部,由于一些物品的使用是按 name 检索,并且优先使用 id 小的,所以我使用了一个 HashMap<String, TreeMap<Integer, ...>> 来管理 Bag 中的物品,这样做非常直观方便,效率比较高,并且在增加、删除等操作中避免了使用迭代器来遍历容器,在删除时也不容易出现空指针错误。
  4. 实际上,在出现价值体的概念之后,我只实现了一个 Commodity 接口,并将四个价值体类放在了这个接口下,实现了接口中的属性和方法。但除此之外,我并没有真正运用上接口的便利,例如在查询最大价值体、查询相应 id 的价值体的操作时,我仍然采用的是遍历四个类的容器并在其中查询的方法,而事实上,实现 Commodity 接口后,可以直接增加一个 Commodity 的容器,直接在这个容器中实现各种查询方法,从而避免了同质操作的反复实现,真正发挥接口的优势。

使用 Junit 的心得体会

Junit 对于我而言是一个新奇的东西,同时也是面向对象设计思想的一个非常好的体现。以往打算法竞赛、面向过程编程时,我主要的调试方式是基于局部操作的输出中间变量,或基于全局代码的构造数据或对拍。然而,面向对象设计时,测试的主体应该是“对象”,使用 Junit 可以很好的检测出对象的方法是否正确实现,确保了方法的正确实现,并层层向上检测,能够准确快捷的定位问题。

另外,Junit 还提供了测试覆盖率这一数据,可以较为有效的作为一个测试强度的评价指标。然而,测试覆盖率并不能完全作为评价测试效果的指标,还需要考虑到测试的完备性、饱和度,充分的对可能出现的情况进行全面地测试。

总的而言,Junit 是面向对象设计思想的一个体现,并且能够很好的帮助我们在程序设计的过程中发现、定位问题,并进行修改验证。

学习 OOpre 的心得体会

  1. OOpre 让我学会了 Java 的基础语法,并且了解了相关容器的使用。我在先前写 c++ 的时候对 STL 有一定的了解,上手相关的容器比较快,然而 Java 中的这些容器和 STL 中的容器有一些区别,在 OOpre 课上我也对这些区别有了相应的了解。并且 OOpre 还鼓励我去了解了更多的容器相关知识,例如 HashMap 在冲突较多时会自动转为红黑树进行管理,从而避免大量的哈希冲突造成的性能下降,而不像 STL 中的 unordered_map 一样,容易被可以制造出的数据卡成最坏情况下的 $O(N)$ 复杂度,这一点让我感觉非常神奇。
  2. 通过 OOpre 的学习,我初步掌握了面向对象的设计方法,并在设计实践中主要采用 自底而上 的设计思路,先对底层的对象和方法进行设计,再逐步往上设计构造。
  3. 在完成 OOpre 作业的过程中,我还自行编写了作业的数据生成器,生成数据规模较大的数据,对代码进行充分全面的测试。编写数据生成器的过程也给我的 Java 代码编写能力带来了一定的提升,在每次迭代任务完成后还需要对我的数据生成器进行相应的完善和迭代,这对我而言也是一种挑战,在解决设计数据生成器中遇到的各种问题的过程中,我得到了很多的收获,掌握了一些测试的基本方法。
  4. OOpre 还从零教会了我使用 git,让我更清晰的认识到了 git 的强大,同时也纠正了我先前对 git 的错误认识。

对 OOpre 课程的简单建议

课程设置总体上非常不错,希望能够在每次迭代结束过后公开一些好的设计架构与设计思路,在迭代的过程中进行学习和优化完善。

...全文

相关推荐

2023Fall-BUAA-OOPre-hw-8-summary

2023Fall-BUAA-OOPre-hw-8-summary

Eri_Q

北京航空航天大学2024年秋季学期面向对象设计与构造先导课程实践项目_基于Java语言的冒险游戏设计与实现_面向对象编程思想实践与教学演示_包含类设计继承多态接口实现设计模式.zip

北京航空航天大学2024年秋季学期面向对象设计与构造先导课程实践项目_基于Java语言的冒险游戏设计与实现_面向对象编程思想实践与教学演示_包含类设计继承多态接口实现设计模式.zip

meide888888

【工业自动化】欧姆龙PLC产品线与编程软件体系详解:基于西门子工程师视角的选型指导与避坑指南

内容概要:本文详细解析了欧姆龙PLC的产品线、编程软件体系、通信架构及选型策略,重点从西门子工程师视角出发,对比两者的定位差异与技术路径。文章明确指出欧姆龙存在两套不兼容的系统:传统的C系列(CP/CJ/CS)使用CX-Programmer软件和绝对地址编程,适用于单机设备与老线改造;新型Sysmac平台(NJ/NX/NY)采用Sysmac Studio集成开发环境,支持IEC 61131-3标签变量、EtherCAT运动控制和多领域一体化控制,代表当前技术高地。同时梳理了FINS、CompoWay/F、EtherCAT、EtherNet/IP等多层通信协议的区别,并列出从西门子转型易踩的八大误区,提供清晰的选型决策路径。; 适合人群:具备一定工业自动化背景,熟悉西门子PLC体系,正在转向或需要维护欧姆龙系统的工程师,尤其是从事设备选型、系统集成与产线升级的研发和技术人员。; 使用场景及目标:①帮助西门子背景工程师快速建立对欧姆龙双平台的认知框架;②指导正确选用CP/CJ/NJ/NX系列及配套软件;③避免在通信接口、地址体系、软件版本等方面出现典型错误;④实现老旧系统向新平台平滑迁移。; 阅读建议:此资源强调“先框架后细节”,建议读者先掌握三大平台分流和软件对应关系,再深入具体型号参数。特别注意2026年10月新版Sysmac Studio与CX-One对CJ3M系列的双向支持这一关键更新,在实际项目中需严格核对控制器固件与软件版本匹配性,防止因版本不兼容导致无法连接。

莫问西东LJ

地级市到杭州北京深圳的球面距离.-最新出炉zip

一、资源特点 全新力作:今年精心打造,人工细细打磨,品质上乘。 权威精准:数据来源,准确靠谱,值得信赖。 品质无忧:绝无数据造假,品质有保障,放心使用。 二、适用人群 学生:在校专科生、本科生、研究生,助力学业各个环节。 教研人员:大学教师和学术科研工作者,为教学科研添力。 三、适用专业 社科经济:经济学、社会学专业适用。 规划管理:地理学、城市规划,以及商业、工商管理专业皆可使用。 [特别说明]相关资源数据已全部上传至网盘。 由于纯手工分享粘贴链接和提取码,不排除有极少提取码或者链接出现差错(或内容与标题对不上),若遇到这种情况,不要着急,请私信博主,将会第一时间更正补链接!

onnx

openeuler配置

openeuler系统环境配置管理

秋十七
评论
收藏 已收藏
分享
返回顶部