poniedziałek, 27 marca 2017

Commit przed rollback.

Dowiedziałem się dlaczego programy w Python korzystające z Tkinter pisane są w jednej głównej, dużej klasie. Otóż przekazywanie danych między wieloma klasami jest problematyczne. Metoda wywoływana w czasie naciśnięcia przycisku, obsługująca dany "event", nie jest w stanie zwrócić wartości z użyciem "return". To znaczy teoretycznie dana wartość zostanie zwrócona, ale nie do klasy znajdującej się wyżej w hierarchii, tylko do "mainloop" Tkinter. Przy czym nie można jej w żaden sposób przechwycić.

Istnieje kilka możliwości w jaki sposób można to naprawić. Najprostszym rozwiązaniem wydaje się przypisanie głównych instancji klas, których używam do przechowywania najważniejszych informacji, do global namespace. Jednak takie rozwiązanie jest odradzane, że względu na wolniejszy dostęp do tych danych oraz jest postrzegane jako coś co zrobiła by osoba początkująca. Utworzona lista zawierająca markery będzie przeszukiwana, dlatego z powodu wolniejszego dostępu do tych danych takie rozwiązanie odpada. Kolejną możliwością jest utworzenie serwera i wymiana danych za jego pomocą, jednak takiego rozwiązania nigdy nie stosowałem, nigdy również nie interesowałem się jak takie rozwiązanie zaimplementować w Python. Chciałbym uniknąć takiej implementacji na siłę, a drugą sprawą jest, że nie mam pojęcia jak wyglądała by stabilność takiego rozwiązania. Innym sposobem na obejście tego problemu jest zapisywanie i odczytywanie istotnych informacji z pliku. Jednak takie rozwiązanie również nie wygląda zbyt profesjonalnie.

Nie wiem natomiast czy możliwe jest przekazywanie referencji do instancji klasy jako argumentu w Python. Pobieżne przejrzenie informacji dostępnych na "stacku" pokazuje, że można to zrobić jedynie z zmiennymi (mutable) typami, jako przykład podana jest lista. Nie mam pojęcia czy przekazanie instancji w liście załatwi sprawę, ale takie rozwiązanie nie wydaje mi się zbyt eleganckim.

Stąd powrót do struktury programu opartej o jedną dużą główną klasę jest najprostszym podejściem, mimo że kod stanie się mniej czytelny. Kiedy podstawowe założenia projektu zostaną zrealizowane, będę miał czas na eksperymenty.

Brak komentarzy:

Prześlij komentarz