Cześć,
Mam taki kod a w nim globalną zmienną calendar:
class EventManagerMenu(Menu):
def __init__(self):
self.add_item('Add event', self.add_event)
self.add_item('Remove event', self.remove_event)
self.add_item('Search event', self.search_event)
self.add_item('Display events', self.display_events)
super().__init__(title='Manage events')
def add_event(self):
event = read_event()
perform = yes_or_no(prompt='Are you sure you want to add this event?')
if perform:
calendar.add_event(event)
print('Event added.')
else:
print('Event not added.')
def remove_event(self):
if not calendar.events:
print('Error: no such any events.')
return
date = read_date()
valid = False
events = calendar.get_events_at_date(date)
event = None
while not valid:
try:
for index, event in enumerate(events):
print(index, '=>', event)
try:
event = events[int(input('Which event do you want to remove?\n> '))]
except ValueError as e:
raise ValueError('Error: not a number.') from e
if event not in events:
raise ValueError("Error: event doesn't exist.")
valid = True
except ValueError as e:
print(e)
perform = yes_or_no(prompt='Are you sure you want to remove this event?')
if perform:
calendar.remove_event(event)
print('Event removed.')
else:
print('Event not removed.')
def search_event(self):
if not calendar.events:
print('Error: no such any events.')
return
date = read_date()
found_events = [event for event in calendar.events if event.date == date]
if found_events:
print('Found events:')
for event in found_events:
print(event)
else:
print('Not found events meeting the specified criteria.')
def display_events(self):
if not calendar.events:
print('Error: no such any events.')
return
print('Events list:')
for event in self.calendar.events:
print(event)
Moje pytanie brzmi jak najrozsądniej w tym przypadku uniknąć stosowania globalnych zmiennych? Czy to prawda że nie powinno się używać singletonów w żadnym kodzie? Jak polecacie przekazywać informację o instancji klasy Calendar pomiędzy klasami i funkcjami? Czy użycie mixinów do tego celu to dobra metoda? Da się tu zastosować dekoratory?