第二次Blog作业
1.前言
这两次题目集相比于上一次的电梯题,可以说是友好了很多,题目难度虽然不是很大,但蕴含的知识点是一点也不少。
本次题目集主要考察了面向对象编程中的类设计、继承与多态、抽象类、封装、集合类操作以及面向对象设计原则(如单一职责原则、开闭原则等)的应用。通过对不同问题的求解,强调了代码的可扩展性、可维护性。
2.设计与分析
此次重点分析一下的航空货运管理系统。
08 7-3航空货运管理系统(类设计)
主要考察了面向对象设计原则的应用,包括单一职责原则、里氏代换原则、开闭原则和合成复用原则。程序需要处理多个对象之间的关系,如客户、货物、航班和订单,并根据业务逻辑进行计算和输出。
首先我们来了解一下面向对象设计原则
单一职责原则:每个类应该只有一个引起它变化的原因。例如,货物类只负责存储和处理货物相关信息,订单类负责订单的生成和管理。
里氏代换原则:子类对象能够替换父类对象出现在程序中。例如,各种支付方式可以继承自一个支付基类。
开闭原则:软件实体应该对扩展开放,对修改关闭。例如,当新增一种货物类型或支付方式时,不应该修改现有的代码结构,而是通过扩展来实现。
合成复用原则:尽量使用对象组合,而不是继承来复用代码。例如,订单类可以包含货物类的对象集合,而不是继承自货物类。
对题目分析完成
以下是我的类图

我的Main为主类,负责从键盘读取输入数据,并创建相应的对象,如客户、订单项、航班、订单、发送人和收件人等。然后将这些对象组合成一个完整的订单管理系统,并调用相关方法进行订单金额计算、支付和信息显示。
还有7个实体类,分别是Recipient(收件人)、Sender(发件人)、Customer(客户)、OrderItem(订单项)、Airline(航班)、Order(订单)、OrderManage(管理类)。
还有1个抽象类,Payment(支付方式)。
在有了明确的思路后,实现起来还是不困难的。
以下是我的代码实现
点击查看代码
import java.util.ArrayList;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner in= new Scanner(System.in);
String customerID= in.next();
String customerName=in.next();
String customerPhone=in.next();
String customerAddress=in.next();
Customer customer=new Customer(customerID,customerName,customerAddress,customerPhone);
int Num=in.nextInt();
ArrayList<OrderItem> orderItems=new ArrayList<>();
for (int i = 0; i < Num; i++)
{
String ID=in.next();
String Name=in.next();
double Width=in.nextDouble();
double Length=in.nextDouble();
double Height=in.nextDouble();
double Weight=in.nextDouble();
orderItems.add(new OrderItem(ID,Name,Height,Width,Length,Weight));
}
String AirlineNum=in.next();
String Start=in.next();
String End=in.next();
String AirlineDate=in.next();
double MaxWeight=in.nextDouble();
Airline airline=new Airline(AirlineNum,Start,End,MaxWeight,AirlineDate);
String OrderID=in.next();
String OrderDate=in.next();
String SenderAddress=in.next();
String SenderName=in.next();
String SenderPhone=in.next();
Sender sender=new Sender(SenderName,SenderPhone,SenderAddress);
String RecipientAddress=in.next();
String RecipientName=in.next();
String RecipientPhone=in.next();
Recipient recipient=new Recipient(RecipientName,RecipientPhone,RecipientAddress);
Order order=new Order(OrderID,OrderDate,airline,sender,recipient);
for (int i = 0; i < Num; i++)
{
order.addOrderItem(orderItems.get(i));
}
OrderManage orderManage=new OrderManage(order);
customer.setOrderManage(orderManage);
customer.getOrderManage().CalculateAmounnt();
Payment payment=new WechatPay();
customer.pay(payment,customer.getOrderManage().getOrder().getAmount());
customer.showMyOrder();
}
}
class Recipient
{
private String name;
private String phonenum;
private String address;
public Recipient(String name, String phonenum, String address)
{
this.name = name;
this.phonenum = phonenum;
this.address = address;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPhonenum()
{
return phonenum;
}
public void setPhonenum(String phonenum)
{
this.phonenum = phonenum;
}
public String getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
}
}
class Sender
{
private String name;
private String phonenum;
private String address;
public Sender(String name, String phonenum, String address)
{
this.name = name;
this.phonenum = phonenum;
this.address = address;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPhonenum()
{
return phonenum;
}
public void setPhonenum(String phonenum)
{
this.phonenum = phonenum;
}
public String getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
}
}
class Customer
{
private String ID;
private String name;
private String phonenum;
private String address;
private OrderManage orderManage;
public Customer(String ID, String name, String address, String phonenum)
{
this.ID = ID;
this.name = name;
this.address = address;
this.phonenum = phonenum;
}
public void setOrderManage(OrderManage orderManage)
{
this.orderManage = orderManage;
}
public OrderManage getOrderManage()
{
return orderManage;
}
public String getID()
{
return ID;
}
public void setID(String ID)
{
this.ID = ID;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPhonenum()
{
return phonenum;
}
public void setPhonenum(String phonenum)
{
this.phonenum = phonenum;
}
public String getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
}
public void showMyOrder()
{
System.out.println("客户:"+getName()+"("+getPhonenum()+")"+"订单信息如下:");
orderManage.outOrderMessage();
}
public void pay(Payment payment,double amount)
{
if(payment.pay(orderManage.getOrder().getAmount(),amount))
{
orderManage.setPayment(payment);
orderManage.PayOrder();
}
}
}
class OrderItem
{
private String ID;
private String name;
private double Width;
private double Height;
private double Length;
private double Weight;
public OrderItem(String ID, String name, Double height, Double width, Double length, Double weight)
{
this.ID = ID;
this.name = name;
Height = height;
Width = width;
Length = length;
Weight = weight;
}
public String getID()
{
return ID;
}
public void setID(String ID)
{
this.ID = ID;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Double getHeight()
{
return Height;
}
public void setHeight(Double height)
{
Height = height;
}
public Double getWidth()
{
return Width;
}
public void setWidth(Double width)
{
Width = width;
}
public Double getLength()
{
return Length;
}
public void setLength(Double length)
{
Length = length;
}
public Double getWeight()
{
return Weight;
}
public void setWeight(Double weight)
{
Weight = weight;
}
public double getVolumeWeight()
{
return Length*Width*Height/6000;
}
public double getChargeableWeight()
{
return getWeight()>getVolumeWeight()?getWeight():getVolumeWeight();
}
public double getRate()
{
if(Weight<20)
return 35;
else if(Weight<50)
return 30;
else if(Weight<100)
return 25;
else if(Weight>=100)
return 15;
return 0;
}
public double getAmount()
{
return getChargeableWeight()*getRate();
}
}
class Airline
{
private String AirlineNum;
private String DepartureAirport;
private String LandedAirline;
private String Date;
private double MaxWeight;
public Airline(String airlineNum, String departureAirport, String landedAirline, Double maxWeight, String date)
{
AirlineNum = airlineNum;
DepartureAirport = departureAirport;
LandedAirline = landedAirline;
MaxWeight = maxWeight;
Date = date;
}
public String getAirlineNum()
{
return AirlineNum;
}
public void setAirlineNum(String airlineNum)
{
AirlineNum = airlineNum;
}
public String getDepartureAirport()
{
return DepartureAirport;
}
public void setDepartureAirport(String departureAirport)
{
DepartureAirport = departureAirport;
}
public String getLandedAirline()
{
return LandedAirline;
}
public void setLandedAirline(String landedAirline)
{
LandedAirline = landedAirline;
}
public String getDate()
{
return Date;
}
public void setDate(String date)
{
Date = date;
}
public Double getMaxWeight()
{
return MaxWeight;
}
public void setMaxWeight(Double maxWeight)
{
MaxWeight = maxWeight;
}
}
class Order
{
private ArrayList<OrderItem> orderItems=new ArrayList<>();
private String ID;
private String OrderDate;
private Airline airline;
private Sender sender;
private Recipient recipient;
private double ItemWeight;
private double Amount;
private boolean PayState;
public Order(String ID, String orderDate, Airline airline, Sender sender, Recipient recipient)
{
this.ID = ID;
OrderDate = orderDate;
this.airline = airline;
this.sender = sender;
this.recipient = recipient;
PayState=false;
}
public ArrayList<OrderItem> getOrderItems()
{
return orderItems;
}
public void setOrderItems(ArrayList<OrderItem> orderItems)
{
this.orderItems = orderItems;
}
public String getID()
{
return ID;
}
public void setID(String ID)
{
this.ID = ID;
}
public String getOrderDate()
{
return OrderDate;
}
public void setOrderDate(String orderDate)
{
OrderDate = orderDate;
}
public Airline getAirline()
{
return airline;
}
public void setAirline(Airline airline)
{
this.airline = airline;
}
public Sender getSender()
{
return sender;
}
public void setSender(Sender sender)
{
this.sender = sender;
}
public Recipient getRecipient()
{
return recipient;
}
public void setRecipient(Recipient recipient)
{
this.recipient = recipient;
}
public Double getAmount()
{
return Amount;
}
public void setAmount(Double amount)
{
Amount = amount;
}
public double getItemWeight()
{
return ItemWeight;
}
public boolean isPayState()
{
return PayState;
}
public void setPayState(boolean payState)
{
PayState = payState;
}
public void addOrderItem(OrderItem orderItem)
{
if (canAddItem(orderItem))
{
orderItems.add(orderItem);
ItemWeight+=orderItem.getChargeableWeight();
}
else
{
System.out.println("The flight with flight number:"+airline.getAirlineNum()+" has exceeded its load capacity and cannot carry the order.");
System.exit(0);
}
}
public Boolean canAddItem(OrderItem orderItem)
{
return (ItemWeight+orderItem.getChargeableWeight()<=airline.getMaxWeight());
}
}
abstract class Payment
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
abstract public boolean pay(double amount,double payamount);
}
class WechatPay extends Payment
{
public WechatPay()
{
setName("WechatPay");
}
public boolean pay(double amount,double payamount)
{
if(payamount==amount)
return true;
return false;
}
}
class AliPay extends Payment
{
public AliPay()
{
setName("AliPay");
}
public boolean pay(double amount,double payamount)
{
if(payamount==amount)
return true;
return false;
}
}
class OrderManage
{
private Order order;
private Payment payment;
public OrderManage(Order order)
{
this.order = order;
}
public Payment getPayment()
{
return payment;
}
public void setPayment(Payment payment)
{
this.payment = payment;
}
public Order getOrder()
{
return order;
}
public void setOrder(Order order)
{
this.order = order;
}
public void PayOrder()
{
getOrder().setPayState(true);
}
public void CalculateAmounnt()
{
double amount=0;
for (int i = 0; i < order.getOrderItems().size(); i++)
{
OrderItem orderItem = order.getOrderItems().get(i);
amount+=orderItem.getAmount();
}
order.setAmount(amount);
}
public void outOrderMessage()
{
System.out.println("-----------------------------------------");
System.out.println("航班号:"+order.getAirline().getAirlineNum());
System.out.println("订单号:"+order.getID());
System.out.println("订单日期:"+order.getOrderDate());
System.out.println("发件人姓名:"+order.getSender().getName());
System.out.println("发件人电话:"+order.getSender().getPhonenum());
System.out.println("发件人地址:"+order.getSender().getAddress());
System.out.println("收件人姓名:"+order.getRecipient().getName());
System.out.println("收件人电话:"+order.getRecipient().getPhonenum());
System.out.println("收件人地址:"+order.getRecipient().getAddress());
System.out.println("订单总重量(kg):"+order.getItemWeight());
System.out.println("微信支付金额:"+order.getAmount());
System.out.printf("\n");
System.out.println("货物明细如下:");
System.out.println("-----------------------------------------");
System.out.println("明细编号\t货物名称\t计费重量\t计费费率\t应交运费");
for (int i = 0; i < order.getOrderItems().size(); i++)
{
OrderItem orderItem = order.getOrderItems().get(i);
System.out.println((i+1)+"\t"+orderItem.getName()+"\t"+orderItem.getChargeableWeight()+"\t"+orderItem.getRate()+"\t"+orderItem.getAmount());
}
}
}
以下是SM分析结果

点击查看详情
Metrics Details For File 'Main.java'
--------------------------------------------------------------------------------------------
Parameter Value
========= =====
Project Directory D:\creat\SM分析\
Project Name 08
Checkpoint Name Baseline
File Name Main.java
Lines 648
Statements 325
Percent Branch Statements 4.0
Method Call Statements 47
Percent Lines with Comments 0.0
Classes and Interfaces 11
Methods per Class 8.18
Average Statements per Method 2.08
Line Number of Most Complex Method 314
Name of Most Complex Method OrderItem.getRate()
Maximum Complexity 5
Line Number of Deepest Block 19
Maximum Block Depth 3
Average Block Depth 1.59
Average Complexity 1.14
--------------------------------------------------------------------------------------------
Most Complex Methods in 11 Class(es): Complexity, Statements, Max Depth, Calls
Airline.Airline() 1, 5, 2, 0
Airline.getAirlineNum() 1, 1, 2, 0
Airline.getDate() 1, 1, 2, 0
Airline.getDepartureAirport() 1, 1, 2, 0
Airline.getLandedAirline() 1, 1, 2, 0
Airline.getMaxWeight() 1, 1, 2, 0
Airline.setAirlineNum() 1, 1, 2, 0
Airline.setDate() 1, 1, 2, 0
Airline.setDepartureAirport() 1, 1, 2, 0
Airline.setLandedAirline() 1, 1, 2, 0
Airline.setMaxWeight() 1, 1, 2, 0
AliPay.AliPay() 1, 1, 2, 1
AliPay.pay() 2, 3, 2, 0
Customer.Customer() 1, 4, 2, 0
Customer.getAddress() 1, 1, 2, 0
Customer.getID() 1, 1, 2, 0
Customer.getName() 1, 1, 2, 0
Customer.getOrderManage() 1, 1, 2, 0
Customer.getPhonenum() 1, 1, 2, 0
Customer.pay() 2, 3, 3, 5
Customer.setAddress() 1, 1, 2, 0
Customer.setID() 1, 1, 2, 0
Customer.setName() 1, 1, 2, 0
Customer.setOrderManage() 1, 1, 2, 0
Customer.setPhonenum() 1, 1, 2, 0
Customer.showMyOrder() 1, 2, 2, 2
Main.main() 3, 41, 3, 9
Order.addOrderItem() 3, 6, 3, 4
Order.canAddItem() 1, 1, 2, 1
Order.getAirline() 1, 1, 2, 0
Order.getAmount() 1, 1, 2, 0
Order.getID() 1, 1, 2, 0
Order.getItemWeight() 1, 1, 2, 0
Order.getOrderDate() 1, 1, 2, 0
Order.getOrderItems() 1, 1, 2, 0
Order.getRecipient() 1, 1, 2, 0
Order.getSender() 1, 1, 2, 0
Order.isPayState() 1, 1, 2, 0
Order.Order() 1, 6, 2, 0
Order.setAirline() 1, 1, 2, 0
Order.setAmount() 1, 1, 2, 0
Order.setID() 1, 1, 2, 0
Order.setOrderDate() 1, 1, 2, 0
Order.setOrderItems() 1, 1, 2, 0
Order.setPayState() 1, 1, 2, 0
Order.setRecipient() 1, 1, 2, 0
Order.setSender() 1, 1, 2, 0
OrderItem.getAmount() 1, 1, 2, 1
OrderItem.getChargeableWeight() 1, 1, 2, 2
OrderItem.getHeight() 1, 1, 2, 0
OrderItem.getID() 1, 1, 2, 0
OrderItem.getLength() 1, 1, 2, 0
OrderItem.getName() 1, 1, 2, 0
OrderItem.getRate() 5, 9, 2, 0
OrderItem.getVolumeWeight() 1, 1, 2, 0
OrderItem.getWeight() 1, 1, 2, 0
OrderItem.getWidth() 1, 1, 2, 0
OrderItem.OrderItem() 1, 6, 2, 0
OrderItem.setHeight() 1, 1, 2, 0
OrderItem.setID() 1, 1, 2, 0
OrderItem.setLength() 1, 1, 2, 0
OrderItem.setName() 1, 1, 2, 0
OrderItem.setWeight() 1, 1, 2, 0
OrderItem.setWidth() 1, 1, 2, 0
OrderManage.CalculateAmounnt() 2, 5, 3, 4
OrderManage.getOrder() 1, 1, 2, 0
OrderManage.getPayment() 1, 1, 2, 0
OrderManage.OrderManage() 1, 1, 2, 0
OrderManage.outOrderMessage() 2, 13, 3, 14
OrderManage.PayOrder() 1, 1, 2, 1
OrderManage.setOrder() 1, 1, 2, 0
OrderManage.setPayment() 1, 1, 2, 0
Payment.getName() 1, 1, 2, 0
Payment.setName() 1, 1, 2, 0
Recipient.getAddress() 1, 1, 2, 0
Recipient.getName() 1, 1, 2, 0
Recipient.getPhonenum() 1, 1, 2, 0
Recipient.Recipient() 1, 3, 2, 0
Recipient.setAddress() 1, 1, 2, 0
Recipient.setName() 1, 1, 2, 0
Recipient.setPhonenum() 1, 1, 2, 0
Sender.getAddress() 1, 1, 2, 0
Sender.getName() 1, 1, 2, 0
Sender.getPhonenum() 1, 1, 2, 0
Sender.Sender() 1, 3, 2, 0
Sender.setAddress() 1, 1, 2, 0
Sender.setName() 1, 1, 2, 0
Sender.setPhonenum() 1, 1, 2, 0
WechatPay.pay() 2, 3, 2, 0
WechatPay.WechatPay() 1, 1, 2, 1
--------------------------------------------------------------------------------------------
Block Depth Statements
0 13
1 125
2 169
3 18
4 0
5 0
6 0
7 0
8 0
9+ 0
--------------------------------------------------------------------------------------------
总的来说实现了程序所需,代码结构清晰:面向对象设计良好,类和方法划分合理,符合单一职责原则。复杂度较低:总体复杂度不高,方法较为简洁,易于理解和维护。嵌套控制得当:块深度分布合理,没有过深的嵌套结构。
但还是有缺点的,缺乏注释:代码中没有注释,影响可读性和可维护性。部分方法复杂度高:如OrderItem.getRate(),逻辑较为复杂,可能需要进一步简化或重构。
良好的编程习惯还是为我写下一道迭代题打下了良好的基础。
09 7-3航空货运管理系统(继承与多态)
在前面一题的基础上,进一步深化了面向对象设计原则的应用。本次货物类型分为普通货物、危险货
物和加急货物三种,并且每种货物的费率不同。同时用户也进一步分为了个人用户和集团用户,不同用户享受的优惠也不同。这让我想到了抽象类。
以下是我的类图设计

与前面代码不同的是,我将用户,订单货物都改为了抽象类满足程序的需求,加强了代码的可扩展性。
Customer抽象类及其子类IndividualCustomer和CorporateCustomer,不同的客户类型有不同的折扣逻辑。
OrderItem抽象类及其子类NormalItem、DangerousItem和ExpediteItem,不同货物类型有不同的费率计算逻辑。
Payment抽象类及其子类WechatPay、AliPay和Cash,支持多种支付方式。
点击查看代码
import java.util.ArrayList;
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner in= new Scanner(System.in);
String customerType=in.next();
String customerID= in.next();
String customerName=in.next();
String customerPhone=in.next();
String customerAddress=in.next();
Customer customer=null;
if(customerType.equals("Individual"))
{
customer=new IndividualCustomer(customerID,customerName,customerAddress,customerPhone);
}
else if(customerType.equals("Corporate"))
{
customer=new CorporateCustomer(customerID,customerName,customerAddress,customerPhone);
}
String Type=in.next();
int Num=in.nextInt();
ArrayList<OrderItem> orderItems=new ArrayList<>();
for (int i = 0; i < Num; i++)
{
String ID=in.next();
String Name=in.next();
double Width=in.nextDouble();
double Length=in.nextDouble();
double Height=in.nextDouble();
double Weight=in.nextDouble();
OrderItem orderItem=null;
if(Type.equals("Normal"))
{
orderItem=new NormalItem(ID,Name,Height,Width,Length,Weight);
}
else if(Type.equals("Expedite"))
{
orderItem=new ExpediteItem(ID,Name,Height,Width,Length,Weight);
}
else if(Type.equals("Dangerous"))
{
orderItem=new DangerousItem(ID,Name,Height,Width,Length,Weight);
}
orderItems.add(orderItem);
}
String AirlineNum=in.next();
String Start=in.next();
String End=in.next();
String AirlineDate=in.next();
double MaxWeight=in.nextDouble();
Airline airline=new Airline(AirlineNum,Start,End,MaxWeight,AirlineDate);
String OrderID=in.next();
String OrderDate=in.next();
String SenderAddress=in.next();
String SenderName=in.next();
String SenderPhone=in.next();
Sender sender=new Sender(SenderName,SenderPhone,SenderAddress);
String RecipientAddress=in.next();
String RecipientName=in.next();
String RecipientPhone=in.next();
Recipient recipient=new Recipient(RecipientName,RecipientPhone,RecipientAddress);
Order order=new Order(OrderID,OrderDate,airline,sender,recipient);
for (int i = 0; i < Num; i++)
{
order.addOrderItem(orderItems.get(i));
}
String Pay=in.next();
OrderManage orderManage=new OrderManage(order,customer);
customer.setOrderManage(orderManage);
customer.getOrderManage().CalculateAmounnt();
Payment payment = null;
if(Pay.equals("Wechat"))
{
payment=new WechatPay();
}
else if(Pay.equals("ALiPay"))
{
payment=new AliPay();
}
else if (Pay.equals("Cash"))
{
payment=new Cash();
}
customer.pay(payment,customer.getOrderManage().getOrder().getAmount());
customer.getOrderManage().setPayment(payment);
customer.showMyOrder();
}
}
class Recipient
{
private String name;
private String phonenum;
private String address;
public Recipient(String name, String phonenum, String address)
{
this.name = name;
this.phonenum = phonenum;
this.address = address;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPhonenum()
{
return phonenum;
}
public void setPhonenum(String phonenum)
{
this.phonenum = phonenum;
}
public String getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
}
}
class Sender
{
private String name;
private String phonenum;
private String address;
public Sender(String name, String phonenum, String address)
{
this.name = name;
this.phonenum = phonenum;
this.address = address;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPhonenum()
{
return phonenum;
}
public void setPhonenum(String phonenum)
{
this.phonenum = phonenum;
}
public String getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
}
}
abstract class Customer
{
private String ID;
private String name;
private String phonenum;
private String address;
private OrderManage orderManage;
public Customer(String ID, String name, String address, String phonenum)
{
this.ID = ID;
this.name = name;
this.address = address;
this.phonenum = phonenum;
}
public void setOrderManage(OrderManage orderManage)
{
this.orderManage = orderManage;
}
public OrderManage getOrderManage()
{
return orderManage;
}
public String getID()
{
return ID;
}
public void setID(String ID)
{
this.ID = ID;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPhonenum()
{
return phonenum;
}
public void setPhonenum(String phonenum)
{
this.phonenum = phonenum;
}
public String getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
}
abstract public double getDiscount();
public void showMyOrder()
{
System.out.println("客户:"+getName()+"("+getPhonenum()+")"+"订单信息如下:");
orderManage.outOrderMessage();
}
public void pay(Payment payment,double amount)
{
if(payment.pay(orderManage.getOrder().getAmount(),amount))
{
orderManage.setPayment(payment);
orderManage.PayOrder();
}
}
}
class IndividualCustomer extends Customer
{
public IndividualCustomer(String ID, String name, String address, String phonenum)
{
super(ID, name, address, phonenum);
}
@Override
public double getDiscount()
{
return 0.9;
}
}
class CorporateCustomer extends Customer
{
public CorporateCustomer(String ID, String name, String address, String phonenum)
{
super(ID, name, address, phonenum);
}
@Override
public double getDiscount()
{
return 0.8;
}
}
abstract class OrderItem
{
private String ID;
private String name;
private double Width;
private double Height;
private double Length;
private double Weight;
public OrderItem(String ID, String name, Double height, Double width, Double length, Double weight)
{
this.ID = ID;
this.name = name;
Height = height;
Width = width;
Length = length;
Weight = weight;
}
public String getID()
{
return ID;
}
public void setID(String ID)
{
this.ID = ID;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Double getHeight()
{
return Height;
}
public void setHeight(Double height)
{
Height = height;
}
public Double getWidth()
{
return Width;
}
public void setWidth(Double width)
{
Width = width;
}
public Double getLength()
{
return Length;
}
public void setLength(Double length)
{
Length = length;
}
public Double getWeight()
{
return Weight;
}
public void setWeight(Double weight)
{
Weight = weight;
}
public double getVolumeWeight()
{
return Length*Width*Height/6000;
}
public double getChargeableWeight()
{
return getWeight()>getVolumeWeight()?getWeight():getVolumeWeight();
}
abstract public double getRate();
public double getAmount()
{
return getChargeableWeight()*getRate();
}
}
class NormalItem extends OrderItem
{
public NormalItem(String ID, String name, Double height, Double width, Double length, Double weight)
{
super(ID, name, height, width, length, weight);
}
@Override
public double getRate()
{
if(getWeight()<20)
return 35;
else if(getWeight()<50)
return 30;
else if(getWeight()<100)
return 25;
else if(getWeight()>=100)
return 15;
return 0;
}
}
class DangerousItem extends OrderItem
{
public DangerousItem(String ID, String name, Double height, Double width, Double length, Double weight)
{
super(ID, name, height, width, length, weight);
}
@Override
public double getRate()
{
if(getWeight()<20)
return 80;
else if(getWeight()<50)
return 50;
else if(getWeight()<100)
return 30;
else if(getWeight()>=100)
return 20;
return 0;
}
}
class ExpediteItem extends OrderItem
{
public ExpediteItem(String ID, String name, Double height, Double width, Double length, Double weight)
{
super(ID, name, height, width, length, weight);
}
@Override
public double getRate()
{
if(getWeight()<20)
return 60;
else if(getWeight()<50)
return 50;
else if(getWeight()<100)
return 40;
else if(getWeight()>=100)
return 30;
return 0;
}
}
class Airline
{
private String AirlineNum;
private String DepartureAirport;
private String LandedAirline;
private String Date;
private double MaxWeight;
public Airline(String airlineNum, String departureAirport, String landedAirline, Double maxWeight, String date)
{
AirlineNum = airlineNum;
DepartureAirport = departureAirport;
LandedAirline = landedAirline;
MaxWeight = maxWeight;
Date = date;
}
public String getAirlineNum()
{
return AirlineNum;
}
public void setAirlineNum(String airlineNum)
{
AirlineNum = airlineNum;
}
public String getDepartureAirport()
{
return DepartureAirport;
}
public void setDepartureAirport(String departureAirport)
{
DepartureAirport = departureAirport;
}
public String getLandedAirline()
{
return LandedAirline;
}
public void setLandedAirline(String landedAirline)
{
LandedAirline = landedAirline;
}
public String getDate()
{
return Date;
}
public void setDate(String date)
{
Date = date;
}
public Double getMaxWeight()
{
return MaxWeight;
}
public void setMaxWeight(Double maxWeight)
{
MaxWeight = maxWeight;
}
}
class Order
{
private ArrayList<OrderItem> orderItems=new ArrayList<>();
private String ID;
private String OrderDate;
private Airline airline;
private Sender sender;
private Recipient recipient;
private double ItemWeight;
private double Amount;
private boolean PayState;
public Order(String ID, String orderDate, Airline airline, Sender sender, Recipient recipient)
{
this.ID = ID;
OrderDate = orderDate;
this.airline = airline;
this.sender = sender;
this.recipient = recipient;
PayState=false;
}
public ArrayList<OrderItem> getOrderItems()
{
return orderItems;
}
public void setOrderItems(ArrayList<OrderItem> orderItems)
{
this.orderItems = orderItems;
}
public String getID()
{
return ID;
}
public void setID(String ID)
{
this.ID = ID;
}
public String getOrderDate()
{
return OrderDate;
}
public void setOrderDate(String orderDate)
{
OrderDate = orderDate;
}
public Airline getAirline()
{
return airline;
}
public void setAirline(Airline airline)
{
this.airline = airline;
}
public Sender getSender()
{
return sender;
}
public void setSender(Sender sender)
{
this.sender = sender;
}
public Recipient getRecipient()
{
return recipient;
}
public void setRecipient(Recipient recipient)
{
this.recipient = recipient;
}
public Double getAmount()
{
return Amount;
}
public void setAmount(Double amount)
{
Amount = amount;
}
public double getItemWeight()
{
return ItemWeight;
}
public boolean isPayState()
{
return PayState;
}
public void setPayState(boolean payState)
{
PayState = payState;
}
public void addOrderItem(OrderItem orderItem)
{
if (canAddItem(orderItem))
{
orderItems.add(orderItem);
ItemWeight+=orderItem.getChargeableWeight();
}
else
{
System.out.println("The flight with flight number:"+airline.getAirlineNum()+" has exceeded its load capacity and cannot carry the order.");
System.exit(0);
}
}
public Boolean canAddItem(OrderItem orderItem)
{
return (ItemWeight+orderItem.getChargeableWeight()<=airline.getMaxWeight());
}
}
abstract class Payment
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
abstract public boolean pay(double amount,double payamount);
}
class WechatPay extends Payment
{
public WechatPay()
{
setName("微信");
}
public boolean pay(double amount,double payamount)
{
if(payamount==amount)
return true;
return false;
}
}
class AliPay extends Payment
{
public AliPay()
{
setName("支付宝");
}
public boolean pay(double amount,double payamount)
{
if(payamount==amount)
return true;
return false;
}
}
class Cash extends Payment
{
public Cash()
{
setName("现金");
}
@Override
public boolean pay(double amount, double payamount)
{
if(payamount==amount)
return true;
return false;
}
}
class OrderManage
{
private Order order;
private Payment payment;
private Customer customer;
public OrderManage(Order order,Customer customer)
{
this.order = order;
this.customer=customer;
}
public Payment getPayment()
{
return payment;
}
public void setPayment(Payment payment)
{
this.payment = payment;
}
public Order getOrder()
{
return order;
}
public void setOrder(Order order)
{
this.order = order;
}
public void PayOrder()
{
getOrder().setPayState(true);
}
public void CalculateAmounnt()
{
double amount=0;
for (int i = 0; i < order.getOrderItems().size(); i++)
{
OrderItem orderItem = order.getOrderItems().get(i);
amount+=(orderItem.getAmount()*customer.getDiscount());
}
order.setAmount(amount);
}
public void outOrderMessage()
{
System.out.println("-----------------------------------------");
System.out.println("航班号:"+order.getAirline().getAirlineNum());
System.out.println("订单号:"+order.getID());
System.out.println("订单日期:"+order.getOrderDate());
System.out.println("发件人姓名:"+order.getSender().getName());
System.out.println("发件人电话:"+order.getSender().getPhonenum());
System.out.println("发件人地址:"+order.getSender().getAddress());
System.out.println("收件人姓名:"+order.getRecipient().getName());
System.out.println("收件人电话:"+order.getRecipient().getPhonenum());
System.out.println("收件人地址:"+order.getRecipient().getAddress());
System.out.println("订单总重量(kg):"+order.getItemWeight());
System.out.println(payment.getName()+"支付金额:"+order.getAmount());
System.out.printf("\n");
System.out.println("货物明细如下:");
System.out.println("-----------------------------------------");
System.out.println("明细编号\t货物名称\t计费重量\t计费费率\t应交运费");
for (int i = 0; i < order.getOrderItems().size(); i++)
{
OrderItem orderItem = order.getOrderItems().get(i);
System.out.println((i+1)+"\t"+orderItem.getName()+"\t"+orderItem.getChargeableWeight()+"\t"+orderItem.getRate()+"\t"+orderItem.getAmount());
}
}
}
以下是SM分析结果

点击查看详情
Metrics Details For File 'Main.java'
--------------------------------------------------------------------------------------------
Parameter Value
========= =====
Project Directory D:\creat\SM分析\
Project Name 09
Checkpoint Name Baseline
File Name Main.java
Lines 796
Statements 358
Percent Branch Statements 7.3
Method Call Statements 61
Percent Lines with Comments 0.0
Classes and Interfaces 15
Methods per Class 6.00
Average Statements per Method 2.34
Line Number of Most Complex Method 7
Name of Most Complex Method Main.main()
Maximum Complexity 11
Line Number of Deepest Block 38
Maximum Block Depth 4
Average Block Depth 1.62
Average Complexity 1.29
--------------------------------------------------------------------------------------------
Most Complex Methods in 14 Class(es): Complexity, Statements, Max Depth, Calls
Airline.Airline() 1, 5, 2, 0
Airline.getAirlineNum() 1, 1, 2, 0
Airline.getDate() 1, 1, 2, 0
Airline.getDepartureAirport() 1, 1, 2, 0
Airline.getLandedAirline() 1, 1, 2, 0
Airline.getMaxWeight() 1, 1, 2, 0
Airline.setAirlineNum() 1, 1, 2, 0
Airline.setDate() 1, 1, 2, 0
Airline.setDepartureAirport() 1, 1, 2, 0
Airline.setLandedAirline() 1, 1, 2, 0
Airline.setMaxWeight() 1, 1, 2, 0
CorporateCustomer.CorporateCustomer() 1, 1, 2, 1
CorporateCustomer.getDiscount() 1, 1, 2, 0
Customer.Customer() 1, 4, 2, 0
Customer.getAddress() 1, 1, 2, 0
Customer.getID() 1, 1, 2, 0
Customer.getName() 1, 1, 2, 0
Customer.getOrderManage() 1, 1, 2, 0
Customer.getPhonenum() 1, 1, 2, 0
Customer.pay() 2, 3, 3, 5
Customer.setAddress() 1, 1, 2, 0
Customer.setID() 1, 1, 2, 0
Customer.setName() 1, 1, 2, 0
Customer.setOrderManage() 1, 1, 2, 0
Customer.setPhonenum() 1, 1, 2, 0
Customer.showMyOrder() 1, 2, 2, 2
DangerousItem.DangerousItem() 1, 1, 2, 1
DangerousItem.getRate() 5, 9, 2, 4
ExpediteItem.ExpediteItem() 1, 1, 2, 1
ExpediteItem.getRate() 5, 9, 2, 4
IndividualCustomer.getDiscount() 1, 1, 2, 0
IndividualCustomer.IndividualCustomer() 1, 1, 2, 1
Main.main() 11, 62, 4, 18
NormalItem.getRate() 5, 9, 2, 4
NormalItem.NormalItem() 1, 1, 2, 1
Order.addOrderItem() 3, 6, 3, 4
Order.canAddItem() 1, 1, 2, 1
Order.getAirline() 1, 1, 2, 0
Order.getAmount() 1, 1, 2, 0
Order.getID() 1, 1, 2, 0
Order.getItemWeight() 1, 1, 2, 0
Order.getOrderDate() 1, 1, 2, 0
Order.getOrderItems() 1, 1, 2, 0
Order.getRecipient() 1, 1, 2, 0
Order.getSender() 1, 1, 2, 0
Order.isPayState() 1, 1, 2, 0
Order.Order() 1, 6, 2, 0
Order.setAirline() 1, 1, 2, 0
Order.setAmount() 1, 1, 2, 0
Order.setID() 1, 1, 2, 0
Order.setOrderDate() 1, 1, 2, 0
Order.setOrderItems() 1, 1, 2, 0
Order.setPayState() 1, 1, 2, 0
Order.setRecipient() 1, 1, 2, 0
Order.setSender() 1, 1, 2, 0
OrderItem.getAmount() 1, 1, 2, 1
OrderItem.getChargeableWeight() 1, 1, 2, 2
OrderItem.getHeight() 1, 1, 2, 0
OrderItem.getID() 1, 1, 2, 0
OrderItem.getLength() 1, 1, 2, 0
OrderItem.getName() 1, 1, 2, 0
OrderItem.getVolumeWeight() 1, 1, 2, 0
OrderItem.getWeight() 1, 1, 2, 0
OrderItem.getWidth() 1, 1, 2, 0
OrderItem.OrderItem() 1, 6, 2, 0
OrderItem.setHeight() 1, 1, 2, 0
OrderItem.setID() 1, 1, 2, 0
OrderItem.setLength() 1, 1, 2, 0
OrderItem.setName() 1, 1, 2, 0
OrderItem.setWeight() 1, 1, 2, 0
OrderItem.setWidth() 1, 1, 2, 0
Payment.getName() 1, 1, 2, 0
Payment.setName() 1, 1, 2, 0
Recipient.getAddress() 1, 1, 2, 0
Recipient.getName() 1, 1, 2, 0
Recipient.getPhonenum() 1, 1, 2, 0
Recipient.Recipient() 1, 3, 2, 0
Recipient.setAddress() 1, 1, 2, 0
Recipient.setName() 1, 1, 2, 0
Recipient.setPhonenum() 1, 1, 2, 0
Sender.getAddress() 1, 1, 2, 0
Sender.getName() 1, 1, 2, 0
Sender.getPhonenum() 1, 1, 2, 0
Sender.Sender() 1, 3, 2, 0
Sender.setAddress() 1, 1, 2, 0
Sender.setName() 1, 1, 2, 0
Sender.setPhonenum() 1, 1, 2, 0
WechatPay.pay() 2, 3, 2, 0
WechatPay.WechatPay() 1, 1, 2, 1
--------------------------------------------------------------------------------------------
Block Depth Statements
0 17
1 130
2 185
3 23
4 3
5 0
6 0
7 0
8 0
9+ 0
--------------------------------------------------------------------------------------------
可以看到和上次的大体相同,但此次的最大复杂度过高,可能是Main写的太过于复杂,还有改进空间。
由于上次的类设计较好,所以此次迭代我只需要修改一小部分代码即可。
3.踩坑心得
此次题目集,其实没有什么逻辑上的难度,主要考察的是面向对象的思维模式,什么继承啊,多态啊,封装啊之类的,主要是巩固我们面向对象编程的基础。不过唯一需要注意的是在计算总重量时不要用实际重量。
4.改进建议
增加注释:两次代码都存在缺乏注释的问题,建议为每个类、方法和复杂逻辑添加详细的注释,解释代码的功能和设计思路,提高代码的可读性和可维护性。
优化复杂方法:对于复杂度较高的方法,如Main.main()和OrderItem.getRate(),建议进行重构,分解为多个小方法,降低方法的复杂度,提高代码的可读性和可测试性。
完善输入验证:在读取输入数据时,增加对输入数据的合法性验证,确保输入数据的完整性和正确性,避免因非法输入导致的异常或错误结果。
5.总结
通过本阶段的两次题目集,我深入理解了面向对象编程的核心概念,包括类的设计、继承与多态的应用、封装等。掌握了如何将现实世界的问题抽象为类和对象,并通过对象之间的交互来实现复杂系统的功能。同时,对设计原则有了更深刻的认识,如单一职责原则、里氏代换原则、开闭原则、合成复用原则和依赖倒转原则,能够更好地设计出具有高内聚、低耦合的代码结构。此外,还学习了如何对代码进行优化和重构,以提高代码的可读性、可维护性和可扩展性。
需要进一步学习及研究的地方
设计模式:虽然对一些基本的设计原则有所了解,但对于设计模式的应用还比较欠缺。需要进一步学习常见的设计模式,如工厂模式、策略模式、装饰器模式等,并理解它们在实际开发中的应用场景和实现方式。
代码优化技巧:对于代码性能优化、内存管理等方面的知识还比较薄弱,需要深入研究如何编写高效的代码,以及如何对现有代码进行优化以提高运行效率和资源利用率。
浙公网安备 33010602011771号