• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przekazywanie instancji klasy Calendar między funkcjami i klasami

Object Storage Arubacloud
0 głosów
300 wizyt
pytanie zadane 26 listopada 2021 w Python przez doskanoness Obywatel (1,240 p.)

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?

komentarz 26 listopada 2021 przez Sadako Obywatel (1,240 p.)

Troche cięzko zrozumieć o co Ci chodzi bez kontekstu. Kod, który podałeś, odwołuje się do zmiennych i funkcji, których tu nie ma pokazanych więc ciężko zrozumieć co to robi. Można się tylko domyślać.

Ale tak ideowo. Jak przekazać między klasami -> rozumem, że chodzi Ci jak przekazać między obiektami? To współdzielenie obiektu wspólny pomiędzy dwoma innymi obiekt1 i obiekt2 robi się tak, twórca obiektu1 i obiektu2 inicjalizuje obiekt wspólny i przekazuje go do obiektu1 i obiektu2 (często przy inicjalizacji, ale nie koniecznie). Jeśli nie ma takiego wspólnego miejsca gdzie inicjalizuje się obiekt1 i obiekt2 to trzeba iść wyżej (w najgorszym przypadku do startu programu) W końcu znajdziesz takie miejsce.
Jedną z technik, która umożliwa dużo swobodność w sharowaniu obiektów miedzy innymi obiektami (czyli w manipulacji zależnościami z ang. dependencies) i ma jeszcze troche innych zalet jest Dependency Injection :) Ma swoje wady i zalety, ale technika jest na pewno warta poznania..

Często usłyszysz od wielu osób nigdy nie rób tego, nigdy nie rób tamtego. Ja wole podejście, że nigdy nie mów nigdy :) Są rzeczy, których po prostu należy unikać, bo da się je zazwyczaj zrobić lepiej używając innych technik.  Taki własnie jest z singletonem. Ale zawsze mieć otwarty umysł i jak ktoś Ci uzasadni użycie czegoś w danym miejscu to czemu nie? Lepiej nie zapamiętuj, że "nigdy nie używać singletona" tylko "dlaczego singleton jest zazwyczaj słabym rozwiązaniem". 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 645 wizyt
0 głosów
0 odpowiedzi 493 wizyt
pytanie zadane 25 października 2016 w Java przez K0XM4N Gaduła (3,640 p.)
0 głosów
1 odpowiedź 2,154 wizyt
pytanie zadane 8 września 2016 w Java przez nemezisso Użytkownik (860 p.)

92,661 zapytań

141,557 odpowiedzi

319,999 komentarzy

62,028 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...