Anfänger - OOP-Projekt - Flugreservierungssystem
Hallo, ich habe gerade ein SEHR einfaches Flugreservierungssystem fertiggestellt. Ich wollte ein Feedback, bitte lassen Sie mich wissen, was Sie alle denken, wenn ich Informationen verschleiere oder Parameter übergebe, wo ich nicht sollte oder wenn die Dinge keinen Sinn ergeben
Airline-Klasse: kümmert sich um Buchung und Rückerstattung
Passagier: Hat eine Sitzplatzzuweisung und einen Restbetrag für das Ticket.
Sitzplatz:
Firstclass und Coach
Plane:
Ein Wörterbuchobjekt mit Sitzplätzen und Passagieren wird als Wert an diese Sitzplätze übergeben
Hier ist mein Code:
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
Führen Sie Folgendes aus: (Gibt aus, wie ich mir das zu bauende Flugzeug vorgestellt habe und wie Sitze den Passagieren zugewiesen werden usw.)
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)}")
Bitte lassen Sie mich bessere Möglichkeiten oder bessere Schnittstellen usw. wissen. Ich werde langsam mehr Komplexität hinzufügen, aber mein Hauptziel war es, dass die Fluggesellschaft Passagiere buchen und in das Flugzeug setzen und sie von ihrem Sitzplatz zurückerstatten kann, während die Kapazität des Flugzeugs aktualisiert wird während dieser Änderungen.
Es werden mehrere Flugzeuge pro Fluggesellschaft hinzugefügt, was zweifellos die Struktur einiger Klassen ändern wird. Lassen Sie mich jedoch vorerst wissen, ob die grundlegenden Buchungs- und Rückerstattungsvorgänge effizient funktionieren und ob die Klassen ordnungsgemäß eingerichtet sind oder welche Verbesserungen vorgenommen wurden kann gemacht werden.
Antworten
Gute Implementierung, leicht zu verstehen und gut strukturiert. Einige Vorschläge:
Sitzklasse
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
A Seatsoll eine Stufe und einen Preis haben, aber diese Informationen befinden sich nicht in der Hauptklasse, sondern nur in den Unterklassen.
Erwägen Sie, tierund priceim SeatKonstruktor hinzuzufügen . Ich schlage auch vor, eine Nummer für die SeatKlasse hinzuzufügen .
Normalerweise ist der Preis des Sitzplatzes nicht für immer an eine Stufe gebunden. Der Preis eines Sitzplatzes hängt vom Flug ab. Beispielsweise kann ein Sitzplatz für zwei Flüge am selben Tag zwei unterschiedliche Preise haben. Berücksichtigen Sie dies, wenn Sie das Design erweitern.
Passagierklasse
class Passenger:
def __init__(self, balance=1000, assignment=None):
self._balance = balance
self._assignment = assignment
- Ein Passagier sollte mindestens einen Namen haben, vor allem aber einen
id. - Ich bin mir nicht sicher, warum Sie hier Unterstrichvariablen verwenden. Liegt es daran, dass sie für den internen Gebrauch bestimmt sind? Aber die Klasse
Airlineverwendet sie in derbookMethode wiepassenger._balance = ... Außerdem verwendet die KlasseSeatkeine Unterstrichvariablen, daher bin ich etwas verwirrt. Erwägen Sie, sie konsequent zu verwenden.
Buchmethode
if choice in self._booked: Hier_bookedist eine Liste, die alle reservierten Plätze für alle Flugzeuge enthält. Was passiert, wenn für dieselbe Sitzplatznummer zwei verschiedene Flugzeuge reserviert werden? Überlegen Sie, ob Sie die Reservierungen einem Flugzeug oder besser einem Flug zuordnen möchten .- Leistung : Bei jeder Reservierung wird eine neue
first_classerstellt:
Dies ist eine teure Operation, die vermieden werden kann. Ziehen Sie in Betracht, die erste Klasse in der Ebene zu erstellen und das Ergebnis dann mit einer Methode anzufordern.if cls == 'first class': first_class = ([(number, seat) for number, seat in enumerate(plane.capacity)][0:10]) - Magische Zahlen und Vervielfältigung :
Der Code, mit dem der Benutzer nach der Tier- und Sitznummer gefragt wird, ist doppelt vorhanden und es gibt einige "magische Nummern" wieif 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: ")) #... 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: ")) #...while choice not in range(10). In diesem Fall ist 10 die Anzahl der Sitze in der ersten Klasse des gegebenen Flugzeugs. Ich denke, es sollte eine Eigenschaft der seinplane, die eine erste Klasse mit einer bestimmten Anzahl von Sitzplätzen hat. Sie können so etwas in Betracht ziehen:tier = plane.get_tier(cls) # tier is first class or coach choice = None while choice not in tier.get_seats_range(): try: choice = int(input(f"Please select a number between {tier.get_seats_range()[0]} and {tier.get_seats_range()[1]} for your seats: "))
Hier sind einige Kleinigkeiten in der Klasse Airline
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
Ist mir fremd, dass Sie eine Fluggesellschaft haben können, die keinen Namen hat, daher würde ich empfehlen, den Argumentnamen verbindlich zu machen. Konzeptionell ist aus meiner Sicht korrekter.
Die andere Sache ist, dass es in Python kein Konzept für Getter und Setter gibt, stattdessen gibt es Eigenschaften.
class Airline:
def __init__(self, name):
self._name = name
self._booked = []
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value