0

嗨,我刚刚完成了一个非常基本的航空公司预订系统。想要一些反馈,请让我知道你们的想法,如果我混淆了信息或传递了我不应该传递的参数,或者事情没有意义

航空公司等级:处理预订和退款
乘客:有座位分配,并支付机票余额
座位:
头等舱和长途汽车
飞机:
一个字典对象持有座位,乘客作为值传递给这些座位

这是我的代码:

class Airline:

    def __init__(self, name=None):
        self._name = name
        self._booked = []

    def get_name(self):
        return self._name

    def set_name(self, name):
        self._name = name

    def book(self, passenger, plane, cls=None):
        while cls not in ['first class', 'coach']:

            cls = input("Please pick a seat: First class or Coach ").lower()

            if cls not in ['first class', 'coach']:
                print("Please select either from 'first class' or 'coach'")
                pass
        if cls == 'first class':
            first_class = ([(number, seat) for number, seat in enumerate(plane.capacity)][0:10])
            choice = None
            while choice not in range(10):
                try:
                    choice = int(input(f"Please select a number between 0 and 9 for your seats: "))
                except ValueError:
                    print("Please select a valid number between 0 and 9")
                if choice in self._booked:
                    print(f"That seat is taken please choose another seat\n"
                          f"These seats are booked: {self._booked}")
                    choice = None
            for seat in first_class:
                if seat[0] == choice:
                    plane.capacity[seat[1]] = passenger
                    passenger._balance = passenger._balance - seat[1].price
                    self._booked.append(seat[0])
                    passenger._assignment = seat[1].tier + f" seat {seat[0]}"
        else:
            coach = ([(number, seat) for number, seat in enumerate(plane.capacity)][10:50])
            choice = None
            while choice not in range(10, 50):
                try:
                    choice = int(input(f"Please select a number between 10 and 50 for your seats: "))
                except ValueError:
                    print("Please select a valid number between 10 and 50")
                if choice in self._booked:
                    print(f"That seat is taken please choose another seat\n"
                          f"These seats are booked: {self._booked}")
                    choice = None
            for seat in coach:
                if seat[0] == choice:
                    plane.capacity[seat[1]] = passenger
                    passenger._balance = passenger._balance - seat[1].price
                    self._booked.append(seat[0])
                    passenger._assignment = seat[1].tier + f" seat {seat[0]}"

    def refund(self, passenger, plane):
        for i, (seat, person) in enumerate(plane.capacity.items()):
            if person == passenger:
                plane.capacity[seat] = None
                passenger._balance = passenger._balance + seat.price
                passenger._assignment = None
                self._booked.remove(i)


class Passenger:

    def __init__(self, balance=1000, assignment=None):
        self._balance = balance
        self._assignment = assignment

    def get_balance(self):
        return self._balance

    def get_assignment(self):
        return self._assignment


class Seat:

    def __init__(self):
        pass


class FirstClass(Seat):

    def __init__(self):
        super().__init__()
        self.tier = 'First Class'
        self.price = 500


class Coach(Seat):

    def __init__(self):
        super().__init__()
        self.tier = 'Coach'
        self.price = 100


class Plane:

    def __init__(self):
        self.capacity = {}
        temp_capacity = []  # Create a temporary list to append seats into ( this will be the seats in the airplane)
        for i in range(10):  # first 10 seats are first class
            temp_capacity.append(FirstClass())
        for i in range(10, 50):  # last 40 seats are coach class
            temp_capacity.append(Coach())
        for seat in temp_capacity:
            self.capacity[seat] = None  # Each seat has no value(person) assigned

    def view_plane(self):
        for i, k in self.capacity.items():
            print(f"{i} : {k}")

    def get_available_seats(self):
        count = 0
        for value in self.capacity.values():
            if value is None:
                count += 1
        return count

在下面运行:(将输出我对飞机的设想以及如何将座位分配给乘客等)

plane = Plane()  
p = Passenger()  
p2 = Passenger()  
p3 = Passenger()  
airline = Airline()  

plane.view_plane()  
airline.book(p, plane)  
airline.book(p2, plane)  
print(airline._booked)  
print(f"passenger 1 balance: {p.get_balance()}\n"  
      f"passenger 1 assignment: {p.get_assignment()}\n"  
      f"passenger 2 balance: {p2.get_balance()}\n"  
      f"passenger 2 assignment: {p2.get_assignment()}\n"  
      f"Number of seats available: {plane.get_available_seats()}\n"  
      f"Number of seats booked: {len(airline._booked)}")  
plane.view_plane()  
airline.book(p3, plane)  
plane.view_plane()  
print("--------------")  
print(airline._booked)  
print(f"passenger 1 balance: {p.get_balance()}\n"  
      f"passenger 1 assignment: {p.get_assignment()}\n"  
      f"passenger 2 balance: {p2.get_balance()}\n"  
      f"passenger 2 assignment: {p2.get_assignment()}\n"  
      f"passenger 3 balance: {p3.get_balance()}\n"  
      f"passenger 3 assignment: {p3.get_assignment()}\n"  
      f"Number of seats available: {plane.get_available_seats()}\n"  
      f"Number of seats booked: {len(airline._booked)}")  
print("----------------")  
airline.refund(p2, plane)  
print(airline._booked)  
print(f"passenger 1 balance: {p.get_balance()}\n"  
      f"passenger 1 assignment: {p.get_assignment()}\n"  
      f"passenger 2 balance: {p2.get_balance()}\n"  
      f"passenger 2 assignment: {p2.get_assignment()}\n"  
      f"passenger 3 balance: {p3.get_balance()}\n"  
      f"passenger 3 assignment: {p3.get_assignment()}\n"  
      f"Number of seats available: {plane.get_available_seats()}\n"  
      f"Number of seats booked: {len(airline._booked)}")  

请让我知道更好的方法或更好的界面等。我会慢慢增加更多的复杂性,但我的主要目标是让航空公司能够在更新飞机容量的同时预订并将乘客安排在飞机上并从座位上退款在这些变化中。

将为每家航空公司添加多架飞机,这无疑会改变某些课程的结构,但现在让我知道我所拥有的是否允许基本的预订和退款操作有效地工作,以及课程设置是否正确或有哪些改进可以制作。

4

1 回答 1

0

我觉得你应该把头等舱和教练预订移到 book 方法之外,因为这种方法工作量很大,而且由于代码很长而难以理解。

似乎代码在头等舱和教练预订中重复,而不是您可以考虑将参数传递给选定的类方法,然后通过这种方式执行预订,重复的代码将从方法中删除。

您查看预订信息的方法也是如此,代码重复很多。

  print(f"passenger 1 balance: {p.get_balance()}\n"  

  f"passenger 1 assignment: {p.get_assignment()}\n" 

  f"passenger 2 balance: {p2.get_balance()}\n"  

  f"passenger 2 assignment: {p2.get_assignment()}\n" 

  f"passenger 3 balance: {p3.get_balance()}\n"  

  f"passenger 3 assignment: {p3.get_assignment()}\n"

  f"Number of seats available: {plane.get_available_seats()}\n" 

  f"Number of seats booked: {len(airline._booked)}") 

每当您编写代码时,请确保那里不会发生重复,这被认为是代码中的难闻气味。

于 2020-10-10T13:10:27.823 回答