OOP 迭代四

写在前面

同学们,我们目前已经完成了 TMS 的文件操作等。在最后一次迭代 TMS-4 中,我们将会实现收藏商品、序列化等一系列相关命令。

在开始编写代码之前,建议大家先仔细阅读需求说明和文末的 HINTS,再开始编写代码。编写好的代码需要经过 patpat 评测。通过所有的测试点后,需将整个项目文件打包上传到云平台,即可完成本次实验。希望大家能够认真完成,不作弊不抄袭。


实验说明

一、实验目标

  1. 了解 Java 序列化和反序列化技术

二、实验的重难点

  1. Java 序列化和反序列化技术
  2. 收藏商品类的设计

三、关键技术

序列化与反序列化

  • Java 序列化就是指把 Java 对象转换为字节序列的过程。
  • Java 反序列化就是指把字节序列恢复为 Java 对象的过程。

序列化最重要的作用:在传递和保存对象时,保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。

反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。

总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息)。

四、相关资料

理论:序列化和反序列化的详解

实践:序列化与反序列化

例如,你实例化了一个对象,名字为小明,此时这个小明对象只在你程序运行期间存在,运行结束后就消失了,但是你可以通过序列化,将小明对象转换为字节序列(在运行期间这个对象本质也只是一串数据)存储到本地文件中,之后即可通过反序列化将这个文件中存储的字节序列转换回一个名字叫小明的对象。

五、DDL及其他要求

  1. 本次实验持续 2 周,截止时间以云平台为准。

实验内容

一、命令概览

本次迭代需要完成的命令如下:

需求 命令符 说明
新增 favoriteCommodity 收藏商品
新增 cancelFavoriteCommodity 取消收藏商品
新增 listFavoriteCommodity 查看收藏商品
新增 uploadFavoriteCommodity 上传收藏商品
新增 readFavoriteCommodity 读取收藏商品
新增 buyFavoriteCommodity 购买收藏商品

二、功能描述

1. 收藏商品

1.1 格式说明

命令符 参数1 参数2 参数3
favoriteCommodity 店铺编号 商品编号 商品数量
  • 顾客可收藏商品。
  • 当商品再次被收藏,则增加原有收藏的商品总数量,不改变收藏的顺序。
  • 可以考虑新建一个类来存放收藏商品信息,方便后续指令编写。

1.2 命令反馈说明

1.2.1 收藏成功

1
Favorite commodity success

1.2.2 参数数量不合法

1
Illegal argument count

1.2.3 未登录

1
Please log in first

1.2.4 登录用户身份不为 Customer

1
Permission denied

1.2.5 店铺编号不合法

1
Illegal shop id

1.2.6 店铺不存在

1
Shop id not exists

1.2.7 商品编号不合法

1
Illegal commodity id

1.2.8 商品不存在、不属于当前店铺

1
Commodity id not exists

1.2.9 商品数量不合法(参考上架商品)

1
Illegal commodity quantity

注意

此处无需判断收藏数量是否大于商品实际数量。

2. 取消收藏商品

2.1 格式说明

命令符 参数1 参数2
cancelFavoriteCommodity 店铺编号 商品编号

仅顾客可取消收藏商品。

注意

此处只关心收藏中有无对应店铺和商品信息,故无需判断实际上的店铺和商品是否存在。

2.2 命令反馈说明

2.2.1 收藏成功

1
Cancel favorite commodity success

2.2.2 参数不合法

1
Illegal argument count

2.2.3 未登录

1
Please log in first

2.2.4 登录用户身份不为 Customer

1
Permission denied

2.2.5 店铺编号不合法

1
Illegal shop id

2.2.6 商品编号不合法

1
Illegal commodity id

2.2.7 商品未收藏

1
Favorite not exists

3. 查看收藏商品

3.1 格式说明

命令符 参数
listFavoriteCommodity
  • 仅顾客可列出收藏商品。
  • 按照收藏的先后顺序进行排序

注意

此处只关心收藏中有无对应店铺和商品信息,故无需判断实际上的店铺和商品是否存在。

3.2 命令反馈说明

3.2.1 成功输出信息格式为

1
shopId: commodityId 商品收藏数量 commodityPrice(单位为 yuan,保留两位小数)

例如:

1
S-2: C-1 20 20.00yuan

3.2.2 参数不合法

1
Illegal argument count

3.2.3 未登录

1
Please log in first

3.2.4 登录用户身份不为 Customer

1
Permission denied

3.2.5 无收藏商品

1
Favorite not exists

4. 上传收藏商品

4.1 格式说明

命令符 参数1
uploadFavoriteCommodity 路径
  • 仅顾客可上传收藏商品。
  • 请使用序列化技术,将顾客的收藏商品保存到对应路径,若路径文件不存在则创建,若存在则覆盖。
  • 文件需放在 ./data 路径下。例如:若路径为 ./help.txt,则序列化文件保存路径为./data/help.txt;若路径为 data/help.txt,则序列化文件保存路径为 ./data/data/help.txt

4.2 命令反馈说明

4.2.1 成功输出信息

1
Upload favorite commodity success

4.2.2 参数不合法

1
Illegal argument count

4.2.3 未登录

1
Please log in first

4.2.4 登录用户身份不为 Customer

1
Permission denied

4.2.5 无收藏商品

1
Favorite not exists

4.2.6 文件操作失败

1
File operation failed

5. 读取收藏商品

5.1 格式说明

命令符 参数1
readFavoriteCommodity 路径
  • 顾客可读取收藏商品。
  • 将路径对应文件反序列化得到收藏商品对象并持有,读取而来的收藏商品对象与顾客本身持有的收藏商品对象合并。若有店铺编号和商品编号均相同则商品数量相加,若有不相同则加入顾客本身持有的收藏商品对象末尾。
  • 路径需在前面加上 ./data,同迭代三的打开文件指令。注:数据保证路径对应的文件为序列化文件,无需考虑文件的正确性。

5.2 命令反馈说明

5.2.1 成功输出信息

1
Read favorite commodity success

5.2.2 参数不合法

1
Illegal argument count

5.2.3 未登录

1
Please log in first

5.2.4 登录用户身份不为 Customer

1
Permission denied

5.2.5 文件不存在

1
File not exists

5.2.6 文件操作失败

1
File operation failed

6. 购买收藏商品

6.1 格式说明

命令符 参数
buyFavoriteCommodity 无参数
  • 顾客可一键购买收藏的所有商品。
  • 每成功购买一种商品算一个订单
  • 购买后需将收藏商品清空
  • 按照收藏的先后顺序进行购买。

注意

  • 购买收藏商品的整个过程不会因为某个商品购买出错而终止。
  • 购买失败的商品也会被清空。

6.2 命令反馈说明

6.2.1 单件商品购买成功

打印订单信息,格式如下。

1
OrderId: shopId commodityId commodityQuantity cost(单位为yuan,保留两位小数) orderStatus

若有多件商品,则按顺序输出所有订单信息。

6.2.2 参数不合法

1
Illegal argument count

6.2.3 未登录

1
Please log in first

6.2.4 登录用户身份不为 Customer

1
Permission denied

6.2.5 无收藏商品

1
Favorite not exists

单件商品购买失败的其他错误输出,参考购买单件商品

三、Hints

开始测试前务必把前一次测试生成的文件删去

四、测试样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
register 047417901855 qcCJQVCAo M1_@%i4@%$_%n M1_@%i4@%$_%n Merchant
Register success
register 000117861001 aaaa adddh7hhh@ adddh7hhh@ Administrator
Register success
register 046418112296 aamofe Y0$_5ujbis Y0$_5ujbis Merchant
Register success
register 106317921260 zXOYXO K8%7c5_%_ K8%7c5_%_ Administrator
Register success
register 217918521598 hKPACtyQySyJ Y0@kig8@4 Y0@kig8@4 Customer
Register success
register 203717851000 GuoLan p@ssw0rd p@ssw0rd Customer
Register success
login 046418112296 Y0$_5ujbis
Welcome to TMS
buyFavoriteCommodity
Permission denied
registerShop valorant
Register shop success (shopId: S-1)
registerShop apex
Register shop success (shopId: S-2)
putCommodity S-1 Vandal 2900 100
Put commodity success (commodityId: C-1)
putCommodity S-2 Odin 3300 200
Put commodity success (commodityId: C-2)
putCommodity S-1 C-1 50
Put commodity success (commodityId: C-1)
putCommodity S-2 C-1 100
Put commodity success (commodityId: C-1)
listShop
S-1 valorant
S-2 apex
logout
Bye~
login 047417901855 M1_@%i4@%$_%n
Welcome to TMS
registerShop aimLab
Register shop success (shopId: S-3)
putCommodity S-3 Spectre 1600 50
Put commodity success (commodityId: C-3)
logout
Bye~
login 217918521598 Y0@kig8@4
Welcome to TMS
buyFavoriteCommodity
Favorite not exists
listShop
S-1 valorant
S-2 apex
S-3 aimLab
listCommodity
S-1: C-1 Vandal 2900.00yuan 150
S-2: C-1 Vandal 2900.00yuan 100
S-2: C-2 Odin 3300.00yuan 200
S-3: C-3 Spectre 1600.00yuan 50
favoriteCommodity S-99 C-1 1
Shop id not exists
favoriteCommodity S-1 C-1 1
Favorite commodity success
favoriteCommodity S-2 C-1 1
Favorite commodity success
listFavoriteCommodity
S-1: C-1 1 2900.00yuan
S-2: C-1 1 2900.00yuan
buyFavoriteCommodity
O-1: S-1 C-1 1 2900.00yuan pending
O-2: S-2 C-1 1 2900.00yuan pending
buyFavoriteCommodity
Favorite not exists
uploadFavoriteCommodity ./fps.out
Favorite not exists
favoriteCommodity S-1 C-1 1
Favorite commodity success
favoriteCommodity S-2 C-1 1
Favorite commodity success
favoriteCommodity S-2 C-2 2000
Favorite commodity success
favoriteCommodity S-3 C-3 10
Favorite commodity success
cancelFavoriteCommodity S-1 C-1
Cancel favorite commodity success
cancelFavoriteCommodity S-99 C-1
Favorite not exists
listFavoriteCommodity
S-2: C-1 1 2900.00yuan
S-2: C-2 2000 3300.00yuan
S-3: C-3 10 1600.00yuan
uploadFavoriteCommodity ./fps.out
Upload favorite commodity success
readFavoriteCommodity ./fps.out
Read favorite commodity success
listFavoriteCommodity
S-2: C-1 2 2900.00yuan
S-2: C-2 4000 3300.00yuan
S-3: C-3 20 1600.00yuan
logout
Bye~
login 046418112296 Y0$_5ujbis
Welcome to TMS
removeCommodity C-1 S-2
Please process order for commodity
logout
Bye~
login 217918521598 Y0@kig8@4
Welcome to TMS
listOrder
O-1: S-1 C-1 1 2900.00yuan pending
O-2: S-2 C-1 1 2900.00yuan pending
finishOrder O-2
Finish order success
logout
Bye~
login 046418112296 Y0$_5ujbis
Welcome to TMS
removeCommodity C-1 S-2
Remove commodity success
logout
Bye~
login 217918521598 Y0@kig8@4
Welcome to TMS
listFavoriteCommodity
S-2: C-1 2 2900.00yuan
S-2: C-2 4000 3300.00yuan
S-3: C-3 20 1600.00yuan
buyFavoriteCommodity
Commodity id not exists
Illegal buy quantity
O-3: S-3 C-3 20 32000.00yuan pending
buyFavoriteCommodity
Favorite not exists
logout
Bye~
quit
----- Good Bye! -----

写在后面

恭喜你完成了所有四次迭代!🥳

作为结语,这里引用 Frederick P. Brooks Jr. 的软件工程著作《人月神话》(The Mythical Man-Month: Essays on Software Engineering)中关于 Second-System Effect 的一段内容,希望对你有所帮助。😉

"The general tendency of a first system is to be excessively ambitious in scope and functionality. The first system is usually built with a certain naivety and enthusiasm, where all the desired features and capabilities are included. However, due to time constraints, limited resources, and a lack of experience, the first system often falls short of expectations. It may be late, over budget, and contain numerous defects.

However, the trap lies not in the failure of the first system itself, but in the reaction to that failure. The natural inclination is to start afresh and build a second system, believing that the lessons learned from the first system will lead to a better and more perfect result. This is where the second-system effect comes into play. The engineers tend to overcompensate for the perceived shortcomings of the first system and include excessive features, complexity, and unnecessary embellishments in the second system.

The second system, in turn, becomes bloated, difficult to manage, and prone to delays and defects. The engineers, driven by their desire to address all the perceived deficiencies of the first system, lose sight of the essential simplicity and focus that should guide their efforts.

Recognizing this trap and resisting the temptation to overdesign and overcomplicate the second system is crucial for successful software development. It is important to strike a balance between learning from the mistakes of the first system and maintaining a pragmatic and disciplined approach to design and implementation."