Kwestionariusz - struktura danych

Kwestionariusz - struktura danych
Photo by Jessica Lewis 🦋 thepaintedsquare / Unsplash

Przygotowując aplikację do przeprowadzania testów / kwestionariuszy warto zastanowić się jak będą przechowywane dane i z jakimi konsekwencjami się to wiąże.

Poniższy przykład nie ma na celu pokazania Wam jakiejś idealnej wersji - chcę raczej przeprowadzić Was przez pewien proces myślenia i co kierowało tym wyborem w sytuacji gdy korzystamy jedynie ze struktur, które poznalismy na zajęciach.

Pierwsze założenie - chciałbym, żeby w kwestionariuszu mogło wziąć udział wiele osób i chcę przechowywać ich wyniki.

Rozwiązaniem może być słownik imię : wynik. Należy jednak wziąć pod uwagę, że szybko możemy zetknąć się z osobami o identycznych imionach - czyli osoby te będą napisywały wyniki poprzednika (-czki). Trzymanie imienia z nazwiskiem mogłoby być lepszą opcją, ale nawet wtedy jest dość duże ryzyko powtórzeń. Może warto by było wprowadzić jakiś identyfikator?

Następnie można zastanowić się jak przechowywać samą ankietę. Założyłem, że z czasem do kwestionariusza mogą dochodzić nowe pytania. Być może będę chciał je też "wymieszać". Stąd też w miarę naturalnym wyborem była lista.

Samo wpisane pytanie raczej nie będą się zmieniać - stąd też ująłem je w krotce. Żeby jednak nie rozdzielać ich od odpowiedzi w tej samej krotce trzymam listę odpowiedzi (lista z racji tego, że będę zminieał ich kolejność i być może dopisywał nowe).

Odpowiedzi to ponownie krotka - przechowująca samą odpowiedź, oraz ilość punktów jakie uzyska się za jej wskazanie.

Poniższy przykład ma wprowadzone tylko jedno pytanie - ale nic nie stoi na przeszkodzie, żeby dodać kolejne.

from random import shuffle

# wersja po wprowadzeniu struktury danych do przechowania pytan z odpowiedziami i punktacja
# alternatywa
# ułatwia indeksowanie - nie ma potrzeby wyciagniecia klucza

ankieta = [
    (
        "Która z poniższych metod zabezpieczenia 2FA uznawana jest za najbezpieczniejszą?",
        [
            ("SMS", 0),
            ("kod z aplikacji (TOTP)", 0),
            ("klucz sprzętowy", 1),
        ],
    ),
]

wyniki = {}

imie = input("Wprowadz swoje imie: ")
wyniki[imie] = 0

print(ankieta[0][0])
shuffle(ankieta[0][1])

odpowiedzi = ankieta[0][1]
print(f"1. {odpowiedzi[0][0]}")
print(f"2. {odpowiedzi[1][0]}")
print(f"3. {odpowiedzi[2][0]}")
wybor = input("Wprowadz nr odpowiedzi: ")

indeks_wyboru = int(wybor) - 1

wyniki[imie] += odpowiedzi[indeks_wyboru][1]

print(f"\n *********** \n {imie},Twój wynik to: {wyniki[imie]} \n ***********")