同学们,我们目前已经完成了 TMS 的文件操作等。在最后一次迭代 TMS-4 中,我们将会实现收藏商品、序列化等一系列相关命令。
在开始编写代码之前,建议大家先仔细阅读需求说明和文末的 HINTS,再开始编写代码。编写好的代码需要经过 patpat 评测。通过所有的测试点后,需将整个项目文件打包上传到云平台,即可完成本次实验。希望大家能够认真完成,不作弊不抄袭。
序列化与反序列化
序列化最重要的作用:在传递和保存对象时,保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息)。
理论:序列化和反序列化的详解
实践:序列化与反序列化
例如,你实例化了一个对象,名字为小明,此时这个小明对象只在你程序运行期间存在,运行结束后就消失了,但是你可以通过序列化,将小明对象转换为字节序列(在运行期间这个对象本质也只是一串数据)存储到本地文件中,之后即可通过反序列化将这个文件中存储的字节序列转换回一个名字叫小明的对象。
本次迭代需要完成的命令如下:
需求 | 命令符 | 说明 |
---|---|---|
新增 | favoriteCommodity | 收藏商品 |
新增 | cancelFavoriteCommodity | 取消收藏商品 |
新增 | listFavoriteCommodity | 查看收藏商品 |
新增 | uploadFavoriteCommodity | 上传收藏商品 |
新增 | readFavoriteCommodity | 读取收藏商品 |
新增 | buyFavoriteCommodity | 购买收藏商品 |
命令符 | 参数1 | 参数2 | 参数3 |
---|---|---|---|
favoriteCommodity | 店铺编号 | 商品编号 | 商品数量 |
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 |
注意
此处无需判断收藏数量是否大于商品实际数量。
命令符 | 参数1 | 参数2 |
---|---|---|
cancelFavoriteCommodity | 店铺编号 | 商品编号 |
仅顾客可取消收藏商品。
注意
此处只关心收藏中有无对应店铺和商品信息,故无需判断实际上的店铺和商品是否存在。
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 |
命令符 | 参数 |
---|---|
listFavoriteCommodity | 无 |
注意
此处只关心收藏中有无对应店铺和商品信息,故无需判断实际上的店铺和商品是否存在。
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 |
命令符 | 参数1 |
---|---|
uploadFavoriteCommodity | 路径 |
./data
路径下。例如:若路径为 ./help.txt
,则序列化文件保存路径为./data/help.txt
;若路径为 data/help.txt
,则序列化文件保存路径为 ./data/data/help.txt
。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 |
命令符 | 参数1 |
---|---|
readFavoriteCommodity | 路径 |
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 |
命令符 | 参数 |
---|---|
buyFavoriteCommodity | 无参数 |
注意
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 |
单件商品购买失败的其他错误输出,参考购买单件商品。
开始测试前务必把前一次测试生成的文件删去。
1 | register 047417901855 qcCJQVCAo M1_@%i4@%$_%n M1_@%i4@%$_%n Merchant |
恭喜你完成了所有四次迭代!🥳
作为结语,这里引用 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."