题目集8~9的总结性Blog
前言
String name; String telephone; String address; public Human(String name,String telephone,String address);
Customer类 extends Human类:顾客的id
String id; public Customer(String id,String name,String telephone,String address); public String getId();
Sender类 extends Human类:
public Sender(String name,String telephone,String address);
Recipient类 extends Human类:
public Recipient(String name,String telephone,String address);
Flight类:航班号、航班起飞机场、航班降落机场、航班日期和航班最大载重量
String number; String depart; String land; LocalDate date; int maxweight; public Flight(String number,String depart,String land,LocalDate date,int maxweight); public LocalDate getDate(); public void setDate(LocalDate date);
Goods类:货物编号、名称、宽度、长度、高度和重量
int id; String name; double length; double width; double height; double weight; public Goods(int id,String name,double length,double width,double height,double weight);
Freight类:费率和运费
double rate; double Freight; public Freight(Goods goods); public double getRate(); public double getFreight();
Order类:订单编号、订单时间、货物数量、总运费,顾客、收件人和寄件人信息,商品信息、运费信息和航班信息
String id; LocalDate date; int num; double totalfreight; Customer customer; Flight flight; List<Goods> goodsList; Freight freight; Human Sender; Human recipient; public Order(String id,LocalDate date,int num,double totalfreight,Customer customer,Flight flight,List<Goods> goodsList,Freight freight,Human Sender,Human recipient); public double getTotalFreight(); public double getTotalWeight(); public LocalDate getDate(); public void setDate(LcoalDate date); public double getTotalfreight(); public List<Goods> getGoodsList(); public void setGoodsList(List<Goods> goodsList);
Main类:
public static void main(String[] args);
SourceMonitor分析
Metrics Details For File 'First.java.txt'
--------------------------------------------------------------------------------------------
Parameter Value
========= =====
Project Directory D:\PTA\
Project Name qeqweqeqeqeqe
Checkpoint Name the first
File Name First.java.txt
Lines 235
Statements 174
Percent Branch Statements 5.7
Method Call Statements 21
Percent Lines with Comments 3.4
Classes and Interfaces 9
Methods per Class 2.33
Average Statements per Method 5.38
Line Number of Most Complex Method 38
Name of Most Complex Method Freight.Freight()
Maximum Complexity 5
Line Number of Deepest Block 40
Maximum Block Depth 3
Average Block Depth 1.67
Average Complexity 1.40
--------------------------------------------------------------------------------------------
Most Complex Methods in 8 Class(es): Complexity, Statements, Max Depth, Calls
Customer.Customer() 1, 2, 2, 1
Customer.getId() 1, 1, 2, 0
Flight.Flight() 1, 5, 2, 0
Flight.getDate() 1, 1, 2, 0
Flight.setDate() 1, 1, 2, 0
Freight.Freight() 5, 9, 3, 0
Freight.getFreight() 1, 1, 2, 0
Freight.getRate() 1, 1, 2, 0
Goods.Goods() 3, 10, 3, 0
Human.Human() 1, 3, 2, 0
Order.getDate() 1, 1, 2, 0
Order.getGoodsList() 1, 1, 2, 0
Order.getTotalfreight() 1, 1, 2, 0
Order.getTotalFreight() 2, 4, 3, 0
Order.getTotalWeight() 2, 4, 3, 0
Order.Order() 1, 10, 2, 0
Order.setDate() 1, 1, 2, 0
Order.setGoodsList() 1, 1, 2, 0
Recipient.Recipient() 1, 1, 2, 1
Sender.Sender() 1, 1, 2, 1
--------------------------------------------------------------------------------------------
Block Depth Statements
0 14
1 47
2 96
3 17
4 0
5 0
6 0
7 0
8 0
9+ 0
--------------------------------------------------------------------------------------------
分析
从SourceMonitor的分析数据来看,这个代码整体复杂度适中,但存在一些值得关注的优化点。该代码共有235行代码,有9个类和接口,平均每个类包含2.33个方法。整体平均方法复杂度为1.40,平均块深度1.67,说明大多数方法结构较为简单。值得注意的是,代码注释率仅为3.4%,比例较低,这将影响代码的可维护性,还需要添加更多的注释。分支语句占比5.7%表明程序逻辑相对线性。方法调用次数较少(21次),且大多数方法的复杂度集中在1-2之间,只有个别方法(如Goods构造函数和Order的两个计算方法)复杂度达到2-3,还可以进行重构修改。
类图
踩坑心得
在最初设计类图的时候,思考了很久,要如何将所有的信息都储存在一起,最终写了一个Order类来存储信息,最初的时候并未想到当有更多的订单的时候要如何存储,还是在写完代码之后的课上老师提起这个问题,我才想起来多个订单的问题,但那时候代码已经提交了,只能在后面再改了,但是目前这个题目的问题还是可以比较好的执行的,但还是需要改进啊。
改进建议
在设计类图的时候要考虑全面,应该再设置一个OrderItem类来储存货物和运费的信息,再在Order类里添加OrderItem类和顾客、收件人和寄件人的信息,减少单个类里代码的复杂度。还可以在Order类里添加display()的方法,将display从Main方法中转移到Order类中,更符合Order类的功能。
第二次作业:
设计与分析
类的设置
String name;
String telephone;
String address;
public Human(String name,String telephone,String address);
Customer类 extends Human类:顾客的id
CustomerType type;
String id;
public Customer(CustomerType type,String id,String name,String telephone,String address);
public String getId();
public CustomerType getType();
Sender类 extends Human类:
public Sender(String name,String telephone,String address);
Recipient类 extends Human类:
public Recipient(String name,String telephone,String address);
CustomerType类:顾客类别,折扣
String type; double discount; public CustomerType(String type,double discount); public double getDiscount();
Corporate类 extends CustomerType类:
public Corporate();
Individual类 extends CustomerType类:
public Individual();
Flight类:航班号、航班起飞机场、航班降落机场、航班日期和航班最大载重量
String number;
String depart;
String land;
LocalDate date;
int maxweight;
public Flight(String number,String depart,String land,LocalDate date,int maxweight);
public LocalDate getDate();
public void setDate(LocalDate date);
public boolean CanCarryOrder(Order order);
Goods类:货物编号、名称、宽度、长度、高度和重量
int id;
String name;
String type;
double length;
double width;
double height;
double weight;
public Goods(int id,String name,String type,double length,double width,double height,double weight);
Freight类:费率和运费
RateType rates; double Freight; public Freight(Goods goods,RateType rates); public RateType getRates(); public double getFreight();
RateType类:货物种类,费率
String rateType; double rate; public RateType(String rateType); public abstract double calculateRate(Goods goods);
Normal类 extends RateType类:
public Normal(); public double calculateRate(Goods goods);
Dangerous类 extends RateType类:
public Dangerous(); public double calculateRate(Goods goods);
Expedite类 extends RateType类:
public Expedite(); public double calculateRate(Goods goods);
OrderItem类:
Goods goods; Freight freights; Customer customer; Human sender; Human recipient; Flight flight; public OrderItem(Goods goods,Freight freight,Customer customer,Human sender,Human recipient,Flight flight); public Goods getGoods(); public Freight getFreights(); public Customer getCustomer(); public Human getSender(); public Human getRecipient(); public Flight getFlight();
Order类:
String orderId; LocalDate date; List<OrderItem> orderItems; Payment pay; public Order(List<OrderItem> orderItems,Payment pay); public double getTotalWeight(); public double getTotalFreight(); public LocalDate getDate(); public void setDate(LocalDate date); public void setOrderId(String orderId); public void PrintOrder();
OrderManger类:
List<Order> orders; public OrderManger(List<Order> orders); public void addOrder(Order order); public List<Order> getAllOrders(); public void printAllOrders();
Payment类:
String payment; public Payment(String payment);
ALiPay类 extends Payment类:
public ALiPay();
Cash类 extends Payment类:
public Cash();
Wechat类 extends Payment类:
public Wechat();
RateTypeFactory类:
public static RateType createRateType(String goodsType);
PaymentFactory类:
public static Payment createPayment(String paymentType);
Main类:
public static void main(String[] args);
SourceMonitor分析
Metrics Details For File '9-3.java.txt'
Parameter Value
========= =====
Project Directory D:\PTA
Project Name wwad
Checkpoint Name 666
File Name 9-3.java.txt
Lines 414
Statements 210
Percent Branch Statements 12.4
Method Call Statements 42
Percent Lines with Comments 0.7
Classes and Interfaces 24
Methods per Class 2.05
Average Statements per Method 4.88
Line Number of Most Complex Method 343
Name of Most Complex Method Main.main()
Maximum Complexity 7
Line Number of Deepest Block 232
Maximum Block Depth 4
Average Block Depth 1.82
Average Complexity 1.78
--------------------------------------------------------------------------------------------
Most Complex Methods in 21 Class(es): Complexity, Statements, Max Depth, Calls
Dangerous.calculateRate() 4, 8, 3, 0
Expedite.calculateRate() 4, 8, 3, 0
Flight.canCarryOrder() 2, 4, 2, 0
Freight.Freight() 3, 5, 3, 1
Goods.Goods() 4, 11, 3, 0
Main.main() 7, 62, 4, 18
Normal.calculateRate() 4, 8, 3, 0
Order.getTotalFreight() 3, 6, 3, 4
Order.getTotalWeight() 2, 5, 2, 1
Order.PrintOrder() 5, 25, 3, 15
OrderItem.OrderItem() 1, 7, 2, 0
OrderManger.printAllOrders() 2, 4, 2, 2
PaymentFactory.createPayment() 3, 6, 3, 3
RateTypeFactory.createRateType() 3, 6, 3, 3
--------------------------------------------------------------------------------------------
Block Depth Statements
0 22
1 45
2 98
3 35
4 10
5 0
6 0
7 0
8 0
9+ 0
分析
从SourceMonitor的分析数据来看,该代码整体质量较好。代码总行数为414行,包含24个类和接口,平均每个类有2.05个方法。平均方法复杂度为1.78,平均块深度1.82,表明大部分方法结构较为合理。但存在以下问题:注释不足;部分业务逻辑类(如费率计算)存在重复的条件判断结构;最大嵌套深度达4层,主要集中在重量计算等核心业务逻辑。
类图
踩坑心得
在最初修改代码得时候,无法很好得将每件商品的费率都一一对应,总是将不同的商品的费率用成同一个费率,最终在Freight类中将添加一个RateType rates属性,终于可以将费率一一对应了。
还有就是在写的时候没有看清CustomerType类忘记写一个CustomerTypeFactory了,导致我Payment类和RateType类都写了,但CustomerType类没写,但我代码都已经提交了,莫得办法就只能这样了。
改进建议
目前main()方法还是过于复杂,需将main()方法拆分为多个职责单一的类。还有就是Factory模式需要加强,目前实现代码任然是用if-else。
总结
这次大作业相较于上一次的大作业难度还是有所降低的,但是对类设计的要求更高了,类的数量也是肉眼可见的增加了,所以这一次类的设计还是有点难度的,容易设计出并不太符合需求的类图,然后重构就非常的复杂,这次大作业第一次的题目我的类设计就有一些欠缺,类的思路并不是很好,但老师上课讲了一下关于这个题目类图的设计,我就发现了我出现的问题,在第二次的作业中做了修改,虽然修改的还不是很完善,但还是较好的完成了这一次的题目。这个题目的代码其实在第二次作业提交完之后我还是对其进行了一些完善的,但这次大作业没有第三次的作业,那我也就无法用新修改的代码来完成这次的Blog,虽然但是,这次的作业也还是愉快的圆满完成了,并没有出现什么测试几十次全是错误的情况,都是一两次的提交就过了。最后,就这样了,希望我下一次的大作业能做的更好。
posted on 2025-05-24 20:28 啦~~~~~~~~~~啦 阅读(14) 评论(0) 收藏 举报