第0次任务:面向对象入门
目标:
学会设计简单的类(找出类的属性与方法)
任务:
- 请完成作业03-面向对象入门中的书面作业2.1以面向对象方式改造数据结构作业“有理数”(重点).
- 展示自己的以面向对象方式设计的有理数。
第1次任务:购物车程序的面向对象设计
本次任务,按小组完成。
目标:
- 学会使用讲故事的方式找到系统中可能包含的类、属性、方法。
- 思考:方法、属性应归入哪个类中?哪些属性与方法可以设置为static或非static?
- 理解类、封装、模块化之间的关系。
任务:
在线上课程的购物车代码的基础上,改进与增加:
- 改进-购物车类:尝试解决同一商品多次存储问题,解决购物车内商品数量问题。
- 改进-商品类:建议只包含商品相关的数据。
- 新增-商城类:商品初始化、商品搜索。该类仅处理数据,不得出现控制台输入、输出。
- 新增-菜单类:主要用于处理输出的信息。比如,显示主菜单或子菜单。
- 新增-Main类:该类主要用于处理输入输出、调用其他类进行数据处理。
- 新增-界面相关类:用于处理不同功能的一系列输入输出、调用其他类进行数据处理。这些代码可放入Main类,也可从Main类中抽取出来形成一个独立的类。
- 新增-其他类:比如工具类、其他功能相关的类。
注意:1. 尽量保证你的程序中只新建了一个Scanner类;2.尽量少用全局变量;3.负责数据处理的类(如,购物车类)尽量不包含控制台输入、输出的代码。
步骤:
- 前期调查与功能设计:调查京东商城或者亚马逊商城中的购物车,体验从搜索商品、加入购物车、操作购物车、下单全过程,思考该过程可能包含的类。演示中要求图多字少。
- 面向对象设计:以面向对象的方法编写购物车代码。先考虑有什么类,再考虑哪些功能、哪些数据、功能放到哪个类中合适。具体的,可完善课件中的中购物车代码。并增加商城类、菜单类等你需要的类。。注意学习类与类之间的关系(先重点掌握关联关系与依赖关系)。类的设计详见参考资料2、3。
- 编码规范检查:使用英文对类、方法、包进行命名(查英文词典或英文搜索引擎,不得出现拼音)。类名不得使用动词,方法名一般来说应使用动词。参考JAVA编码规范,进行类命名,方法命名、包命名,合适的缩进,有意义的变量名。见参考资料1中的1.1-1.4。
- PPT制作或博客制作并上台演示:需上台演示的同学请制作PPT或博客。提交前,应先从头到尾自查一遍,再在同学面前展示一遍。
- 作图:思维导图(表示有层级关系的图,如系统功能架构图),UML图(确定好线型、箭头类型),截图(应在上面做出标记说明)。
注意:初期将重点放在面向对象设计、命名规范。
以上任务,请小组组长明确分工,课堂展示时教师将针对每个组员负责的部分进行提问检查。
未完成所负责任务,考核不合格。
分工表格示例(请组长将上述任务妥善分配):
任务 | 姓名 |
---|---|
类1、类2;功能1;面向对象设计、前期调查与功能设计 | 组长:张一 |
类3、类4;功能2;编码规范检查、前期调查与功能设计 | 张二 |
类5、类6;功能3;PPT制作或博客编写 | 张三 |
面向对象设计建议
- 系统的功能设计尽量简单,功能做到少而精。比如,建议系统只包含购物车相关功能与商品管理相关功能,而不用包含管理员、评价、订单等功能。
- 系统的主要功能分为购物车相关功能与商品管理功能(初始化商品列表、商品搜索等)两大块。建议将这两大块功能放到两个不同的类中。
- 菜单代码放到一个类中,用户交互类代码可以放到Main类中也可以放到其他合适的类中,通用的工具类代码(比如对字符串、日期进行处理)可放到单独的类中。
- 必须包含购物车类。购物车类应只包含数据处理的代码,不要包含任何用户交互代码(控制台输入与输出)。
- 类的设计一定要从逻辑上思考是否合理,而不能仅从功能实现来考虑。比如,不能让购物车类继承自商品类。
- 不能滥用static定义类、属性、方法。思考使用static方法的时机。
- 除非你明确知道要怎么用,否则不要用Map、LinkedHashMap等还未学过的接口与类。
- 建议以Java程序设计在线课程中的"3.7 案例(重要):面向对象-类的设计"章节的案例代码(较简单)为基础,在其上进行修改与扩充。也可参考"5.10 案例(重要):面向对象-购物车改进"中的案例代码(略复杂)。
课堂演示按顺序主要包含如下几个部分(博客编写也可按照如下顺序组织)
- 人员分工
- 前期调查。
- 系统功能结构图:可使用思维导图绘制。
- 系统描述:一段用来描述系统功能与流程的文字,用红色字代表可能的对象(名词)或属性,用蓝色字代表可能的方法(动词)。
- 类设计说明:类概述(每个类的用途)、类的关键属性与关键方法、类与类之间的关系。可选:类与类之间的关系可使用UML类图描述。建议使用ProcessOn绘制。
- 本系统哪里体现了面向对象的封装性?可选:哪里体现了继承、多态?
- 项目包结构(package的划分)与关键代码:项目的包结构(为什么要这样设计包结构),主要功能(如网购物车添加、删除商品)的流程图与关键代码。
考核前自查表格
提交老师进行答辩前,请先打印如下自查表格。
序号 | 自查项目 | 负责人 |
---|---|---|
1 | 代码:编码规范(类、属性、方法、变量命名)、代码格式化(请使用IDE的代码格式化进行格式化) | 张一 |
2 | 代码:是否去除了IDE中的警告(即,叹号)、包的划分 | 张二 |
3 | 代码:代码是否滥用了super() | 张一 |
4 | 代码:如果使用了Map,请说明为何使用Map,在本系统中使用Map的优缺点 | 张三 |
5 | 代码:说明如何购物车内商品的数量 | 张三 |
6 | 博客、PPT:UML图、功能结构图与流程图的绘制、代码是否使用了Markdown语法展示 | 张二 |
7 | 设计:按照上面的面向对象设计建议进行了检查 | 张三 |
注意:
- 编码规范与代码格式化请查看参考资料1中第一章"一、编码规约"。
- 流程图、功能结构图与UML图中的线不要出现无必要的交叉、转折。
- 每个人要对自己的任务负责。即使项目整体完成良好,自己负责的任务也可能被判定为不合格。
不合格的标准:
- 自己完成的任务与参考资料中给定的模板、规范多处不一致。
- 敷衍了事。
- 不熟悉自己写的代码。回答自己负责的相关问题时,基本都不会。
- 无自己编写的代码
参考资料:
- 阿里巴巴Java开发手册 终极版(1.3.0)
- 面向对象设计与UML类图中的什么是类与如何绘制类图。
- 5分钟读懂UML类图
第2次任务:迭代改进购物车1(面向对象设计改进、UML、包结构与Git)
目标:
- 合理规划包结构
- 使用git进行项目协同开发
代码阅读:
阅读面向对象设计案例代码,改进自己的购物车代码。见参考资料3中的人、借款者、姓名、地址与StuManagementDemo.java。
任务及设计注意事项:
- 购物车面向对象改造:不少同学的系统还是从功能出发,然后将功能写成方法生搬硬套到某个类上。请大家以面向对象的方式重新改造。设计是否合理,请按照如下原则判定:
- 每个类中包含的方法是否合适。比如
User
类中包含showMenu
(显示菜单)方法,显然不合理。实际上,User虽然需要进行显示菜单操作,但是菜单功能应该由商城相关类负责提供。 - 涉及到继承的设计使用“is-a”准则来判定自己面向对象建模是否合理。比如,ShoppingMall is-a Commodity,这种设计显然不合理。初学者,暂且不要使用继承进行设计。
- 类之间的关系设计是否合理?如,ShoppingCart与Commodity如果设计成1对1的关系(即一个ShoppingCart只能包含一个Commidty),显然不合理。
- 控制台输入输出代码不要放到业务相关的类。比如将“请输入要查找的商品id”这种提示信息放在某个表示负责具体搜索任务(如,在某个数组中根据给定商品id查找该商品)的方法中,就是一种不好的设计。
- 每个类中包含的方法是否合适。比如
- 为自己的面向对象系统绘制UML。见参考资料1、2。注意:UML中的不要包含太多细节(比如不要包含setter/getter方法),只要体现必要的属性、方法、类之间的关系即可。建议使用Processon绘制UML类图。图不要太大,可画多张图突出展示重点。
- 为自己的项目规划合理的包结构。见参考资料4。
- 使用Eclipse+Git方式管理你的项目。项目提交记录中应该体现不同成员的提交。见参考资料5。
答辩注意事项:
请先查看本博文中的"常见问题:前两次任务"小节中的两篇博客,将自己代码与博文中明显的错误进行修改。
参考资料
- 深入浅出UML类图。注:这篇文章是5分钟读懂UML类图的详解版。
- 作业04-面向对象设计与继承中的2.1(面向对象设计)。
- 面向对象设计案例代码
- OnlineShop项目模板
- 使用Eclipse Egit与码云管理你的代码
常见问题:前两次任务
第3次任务:面向对象案例分析(已放入超星互评,可选)
- 完成作业04-面向对象设计与继承书面作业2.2ManagerTest.zip代码分析(继承、多态)。
- 使用UML图绘制题目1中的各种类及类之间的关系。
- 上台讲解体现在ManagerTest.zip代码中体现的面向对象技术。
- 完成作业05-继承、多态、抽象类与接口中的4. 面向接口案例分析,并上台讲解。
第4次任务:迭代改进购物车2(购物车需求变更:使用继承、接口与多态)
目标
- 掌握继承与多态
- 掌握DAO模式
任务
- 使用子类与继承体现不同商品的特性:网上商城不同类别的商品有一些共同信息,比如商品名、价格。但有的信息并不相同。比如,书本可能包含出版社、ISBN、作者信息,手机则可能包含厂商、屏幕尺寸等信息。设计显示不同商品的页面,可根据商品的类别显示不同的信息。请根据改进后的需求重新设计商品类及相关类的继承架构。
- 使用多态、DAO模式为商城增加不同的存储方法:商城可能使用文件存储商品数据、也可能使用列表存储数据。尝试使用DAO模式实现此功能,使得涉及到存储相关的代码可以轻松在两种存储模式之间进行切换。请参考作业05-继承、多态、抽象类与接口中的4. 面向接口案例分析。
DAO模式说明
- DAO模式主要用于数据存取。如果你的代码中包含对数据的存取(数组、列表、文件存取、数据库)操作,可以考虑设计DAO接口。
- 一般来是对某个实体(model)设计对应DAO接口。包含常见的对某个实体进行数据存取的方法。比如对用户实体(User对象),我们可以为其设计UserDao接口,如下所示:
interface UserDao{
User getUserById(Long id); //通过id在后台查找相应的用户数据,组装成User对象后返回。找不到返回null
List<User> getUsersByName(String name); //根据name获得User列表,找不到返回空的List列表。
int update(User user); //根据传入的user对象,更新后台已有的User对象数据,返回该操作影响的数据个数。这个已有的User对象数据可能存放在文件或数据库。
boolean add(User user); //将传入的user对象添加到后台文件或数据库中,添加成功返回true。
int deleteUserById(Integer id); //通过id删除后台的User对象数据,返回成功删除的个数。比如从从文件或数据库中删除,或者只是打上删除标记。
}
可以看到该UserDao接口包含的所有方法,基本上都是对后台数据的存取。
思考
- 对于我们的购物ShoppingCart类,需要设计ShoppingCartDao接口吗?
首先要考虑你的系统中有没有需要将ShoppingCart存储到后来中的需要。如果你想设计一个类似京东的购物车,不管你有没有关机、在哪里登录都能获得购物车的数据。那么可以考虑设计一个ShoppingCartDao。如果你的购物车是一次性的,关机就没了,下回登录还是空的购物车。也就是说不需要存储购物车的数据,那么就不需要为ShoppingCart类设计相应的DAO接口。 - 设计与实现ShoppingCartDao需要考虑什么?
首先需要考虑最常用的操作是什么?比如,根据用户id返回购物车ShoppingCart getCarByUserId(Long id)
、将购物车信息保存到后台boolean saveCartInfo(ShoppingCart cart)
。然后再考虑到底需要将什么数据存储到后台。比如京东购物车是与每个用户(User)绑定,还包含了商品列表。那么在设计相应的DAO接口的时候,就要考虑有对这两类信息存取到后台的方法。实现的时候还要考虑具体对哪些数据实现存取,是否需要存取整个User对象的信息与商品对象的信息。
大家可以再思考一下,有必要将商品加入购物车、结算等方法放入ShoppingCartDao中?
参考资料
第5次任务:迭代改进购物车3(添加图形界面)
目标:
- 掌握图形界面编程
- 掌握MVC模式
- 懂得使用package合理划分包结构。
报告应按顺序包含如下内容:
- 简述:主要使用了什么方法、什么工具对系统做出了哪些改进。亮点在哪里?难点在哪里?
- 运行截图。注:不得使用Eclipse启动,应通过双击某个.jar或.exe文件的形式进行启动。
- 简述:系统中使用的MVC模式。并明确自己的系统中M、V、C各有什么类?可以用一个完整的功能演示与代码来说明C如何协调M与V完成该功能。
- 简述:如何对项目中的类使用包进行管理。结合MVC,阐述为什么要这样分包。见OnlineShop项目模板。
- 简述:能否直接复用以前编写的系统代码?在复用以前的代码时,会碰到什么问题。
- 可选:你的git仓库。
报告中无需包含:
系统功能架构图等。
编程中应避免的情况:
- 界面上的动态数据(比如购物车的商品数据)不得直接写死在代码。
- 尽量避免使用无模式窗体。窗体跳出时,不得出现在左上角。
建议:
使用JTable
展示数据。
参考资料:
1. MVC模式简介-主要看StudentController是怎样协调Model与View
2. OnlineShop项目模板
3. JTable常见用法细则
4. JTable案例-Netbeans项目
第6次任务:面向对象大作业-自主选题
本次选题可以用于课程设计。建议及早准备,为期末的课程设计打下良好的基础。
基本要求与完成步骤
团队:3-4人合作。人越多,对组长的能力(任务分解、知人善用)要求越高,建议组长量力而行。
建议:更多把精力放在面向对象设计上面。不建议实现太复杂的功能(功能越复杂,设计越难做好)。
使用AI:建议使用AI辅助选题。主要分为这几个步骤:
- 将你所要做的大致内容告诉AI,让他给你一些选题思路。然后逐步给出更准确、更细致的你所要做的东西的功能描述。
- 询问你感兴趣的选题的技术栈。描述时尽量加入一些限定词,比如说java、swing、java web等。
- 在AI的帮助下逐步确定系统的几个主要流程、几个主要功能模块。
- 组长可以询问一下如果要完成这个任务有什么任务分工的建议。
- 针对每部分所要完成的功能模块逐步细化描述。
基本步骤
- 确认选题
确定要解决什么问题。
建议找一些实际问题进行解决(比如处理Excel文件、生成Word文档、存在txt中的数据、冗余数据等等)。
也可以找一些传统的问题进行练习。比如,学生管理、图书管理、通讯录管理、邮件系统。
也可以直接选择课程设计的题目。有一些题目很大,暂时无法一下解决不了,但可以先思考。先设计。 - 系统功能设计与前期准备
这部实际上是确定系统的边界。确定哪些是不要做的,那些是要做的。确定边界有助于聚焦焦点。建议不要做的太复杂。
考虑数据怎么存储(使用文件还是数据库还是直接在内存中),界面是什么(控制台、GUI、GUI中什么控件)。
使用什么工具(Eclipse)?要不要用Git管理代码? - 面向对象设计
根据系统功能进行类的设计。
思考哪些数据放在那些类中,哪些功能放在哪些类中。
合理规划包、类的命名。 - 编程
建议大家分工完成。使用Git管理代码有加分。 - 测试
对一些常见功能建立测试用例(就是一些常见的测试数据,类似PTA题目的各种特殊情况下测试用例)。当代码修改的时候,可以快速检测代码是否能正常运行。
建议使用JUnit。 - 发布
你的程序最好能独立运行(比如发布成jar包或.exe)。要脱离了开发环境也能运行。 - 宣传
一个好的宣传(博客、课堂展示)可以让你的程序传播的更远,让你的程序更容易被接受。
面向对象大作业题目参考
1.教务管理系统、公选课选课系统
教务管理系统:
管理员想管理多个班级与学生,每个班级可以有多个学生、但每个学生只能属于一个班级。管理员希望可以对学生实现增删改查。请以面向对象的方式设计这个学生管理系统。
提示:菜单可以单独设计成一个类,专门用来处理输入、输出。
进阶:引入课程、成绩、老师。
公选课选课系统:
模拟你们使用的公选课系统。支持教师开设课程,学生搜课、选课(要有人数限制)、退课、查看选课结果,管理员管理所有课程。
2. QQ或微信联系人的通讯录、信息发送
3. 电子邮件系统、图书馆
电子邮件系统:不需要真正实现通过SMTP发送邮件、POP接收右键的功能,只是模拟管理。
图书馆:至少包含图书管理员、学生两大角色,包含对学生的简单管理与图书的管理(实现查书、借书、还书)。
4. 游戏类
请参考Java第05次实验提纲(Java图形界面编程)中的游戏参考资料。
5. 数据处理类系统
可以处理Txt、Excel文件、Word文档、数据库里的数据
6. 课程设计相关
7. 团队管理迭代改进任务
面向对象大作业(自主选题)-第一次提交
请针对面向对象设计大作业迭代任务的第6次任务:面向对象大作业-自主选题任务提交你们的博客链接。
所需提交资料:选题名称,博客链接,组员名单。
如:图书馆,你的博客链接,张三、李四、王五。
博客内容
- 选题与前期调查。
想要做什么:简述自己要做的系统。
别人是怎么做的:这里可以展示其他人已完成的系统。加上参考链接即可。
准备实现哪几部分:我准备实现哪几部分。 - 系统功能设计
系统所要实现的功能:功能1、功能2、功能3.
数据如何存储:文件、数据库、内存。
界面:GUI、控制台。
开发工具:Eclipse, NetBeans, JUnit, git, 阿里巴巴代码规约IDE插件。
面向对象设计优秀作业
网络18-基于MySQL的购物车-谢晓淞、李天明、康友煌、严威,对MVC与DAO模式有自己的描述。
网络17-购物车-面向对象设计-余景胜、刘格铭组
网络17-购物车-GUI-兰泽祥、吴修恩组
网络17-购物车-GUI-何昕桐、李志婷、梁琦珧、陈慧琳