java程序设计_02

**前言** -- 先简单总结一下这两周的作业题目吧

这两周的题目主要考察锻炼的是我们类设计的能力,而并非其那一次电梯题目的逻辑思维能力,这也相对的降低了题目的难度。类设计的关键就是那七大基本原则:
1.SRP(单一职责原则)。
2.OCP(开闭原则)。
3.LSP(里氏代换原则)。
4.DIP(依赖倒转原则)。
5.CRP(合成复用原则)。
6.LOD(迪米特法则)。
7.ISP(接口隔离原则)。

我们以周为板块来讲讲吧
-- week1
前两个题目相对简单,就不多介绍
题目一 // 点线面问题重构(继承与多态)

在之前题目“点与线(类设计)”的基础上,对题目的类设计进行重构,以实现继承与多态的技术性需求。

题目二 // 雨刷程序功能扩展设计

也是在之前的题目上进行类设计,题目内容也进行相应的改变。

题目三 // 航空货运管理系统(类设计)
先介绍一下题目:
本次题目模拟某客户到该航空公司办理一次货运业务的过程:
航空公司提供如下信息:
航班信息(航班号,航班起飞机场所在城市,航班降落机场所在城市,航班
日期,航班最大载重量)
客户填写货运订单并进行支付,需要提供如下信息:
 客户信息(姓名,电话号码等)
 货物信息(货物名称,货物包装长、宽、高尺寸,货物重量等)
 运送信息(发件人姓名、电话、地址,收件人姓名、电话、地址,所选
航班号,订单日期)
 支付方式(支付宝支付、微信支付)
注:一个货运订单可以运送多件货物,每件货物均需要根据重量及费率单独
计费。
程序需要从键盘依次输入填写订单需要提供的信息,然后分别生成订单信
息报表及货物明细报表。
本题主要考察单一职责原则、里氏代换原则、开闭原则以及合成复用原则。
这道题目本身类与类之间的联系比较清晰,因此进行类设计时并不困难。

那我先来介绍一下类设计中所体现的原则(主要说明一下本题考查的原则,其它的原则也都有体现,就不一一赘述了):
(1)单一职责原则
将问题拆解为一个一个小小的问题,本题基本就是把接受到的数据按一定的格式打印出来。所以,实体类中属性的show方法就是按题目规定的格式打印,这里就体现了单一职责原则。如下:

public void displayTime(){
        System.out.printf("订单日期:%04d-%02d-%02d\n",time.getYear(),time.getMonth(),time.getDay());
    }
    public void displayNumber(){
        System.out.println("订单号:"+number);
    }
    public void displaySumWeight(){
        System.out.println("订单总重量(kg):"+sumWeight);
    }

等等,我就不一一列举了。
(2)里氏代换原则
类设计中的Pay类,在Controller类中用父类来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替代父类对象,体现了多态性,同时也体现了里氏代换原则。
(3)开闭原则
类设计中的Pay类,如果后续需要扩展其他的支付方式如cash支付等,只需和其他支付方式一样继承Pay父类,不需要修改原有代码就能实现扩展,这里体现了开闭原则。
(4)合成复用原则
类设计中的Time类与Flight类,Order类就是关联的关系,而不是继承的关系。如果将Flight类,Order类设计成继承与Time类的子类也是可以的,但是继承的耦合性太强,所以应该设计成关联关系。这里体现了合成复用原则。
其实这道题目前前后后我大概花了三天,但遗憾的是,最终还是没能解出,接着讲讲我遇到的问题:



这是5月24日的提交记录,刚开始出现多种错误,是因为出现了输出格式的问题,修改完之后就只剩下那三个正常测试的测试点没过,根据题目中的样例,输出并无问题,确信各数据的输出顺序(题目逻辑)没有问题,刚开始就以为是日期特殊情况的输出格式有问题。因为题目中并没有告知日期各种情况下的输出格式,所以我就进行各种尝试,结果都失败。然后我就先放放,隔天再改改。然后25号大概又花了一下午的时间来重申题目+做题,可是还是没有用。


到了27号,我就去请教了一下其他测试点过了的同学,同时尝试了各种测试样例,两边的输出的结果都是一样的,说明逻辑肯定没有问题,于是我想着再试试,之后进行了第三次重申题目+做题,确保遗漏了题目中的重要信息,还是没用。28号,下午又花了两三个小时的时间进行修改,结果都是失败的。
虽然花了很多时间最后还是没能做出,当这个过程对于我来说还是很宝贵的,期间也是锻炼了我的耐心,这是一次很不一样的体验。
-- week2
前两个题目相对简单,就不多介绍
题目一 // 魔方问题

题目二 // 点线面问题再重构(容器类)

在“点与线(继承与多态)”题目基础上,对题目的类设计进行重构,增加容器类保存点、线、面对象,并对该容器进行相应增、删、遍历操作。

题目三 // 航空货运管理系统(继承与多态)
题目介绍:
本次题目模拟某客户到该航空公司办理一次货运业务的过程:
航空公司提供如下信息:
航班信息(航班号,航班起飞机场,航班降落机场,航班日期,航班最大载重量)
客户填写货运订单并进行支付,需要提供如下信息:
 客户信息(姓名,电话号码等)
 货物信息(货物名称,货物包装长、宽、高尺寸,货物重量等)
 运送信息(发件人姓名、电话、地址,收件人姓名、电话、地址,所选航班号,订单日期)
 支付方式(支付宝支付、微信支付、现金支付)
注:一个货运订单可以运送多件货物,每件货物均需要根据重量及费率单独
计费。

这道题是前一周的最后一题的迭代版,对货物的类型进行了分类,然后添加了折扣率和支付方式。
因此只需要在上一次代码的基础上进行扩展与调整。
类设计的总体大致和前一次一样,所以这里我就不过多的介绍了,以下是类图

以及该题的提交结果


这一次就差不多直接通过了。

最后再总结这两周的心得体会吧。
(1)对于类的设计中的七大原则有了更深的理解,但是还有很多不足之处,之后还是要多花时间取学习。
(2)正则表达式还是要多加训练,相隔一段时间没有用正则,突然要用时,还是会忘记如何。
(3)做题还是要沉下心来,尽量管理好自己的情绪。

posted @ 2025-05-18 14:32  小事小事  阅读(39)  评论(0)    收藏  举报