Buzzer Webapp

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Plexian
User
Beiträge: 10
Registriert: Mittwoch 15. Juli 2020, 20:24

Freitag 8. Januar 2021, 11:27

Moin,

ich habe mithilfe von flask und socketio eine Webapp in Python erstellt, welche eine Buzzerfunktionalität bereitstellt.
Ein Spieler kann hosten, alle weiteren können joinen, so kann diese App also für Quizzes verwendet werden. Zusätzlich gibt es eine Stoppuhr, falls der Host timen möchte, wann genau gebuzzert worden ist.

https://github.com/marekhummel/buzzerpy

Dies ist meine erste Python-Webapp, über jegliches Feedback würde ich mich freuen; ich würde mich wundern, wenn das alles perfekt wäre.
Außerdem bin ich kein Webdesigner und (werde wohl nie einer werden), falls also jemand Spaß dran hat, bin ich über einen Pull Request sehr dankbar, der das Design updatet, vielleicht sucht ja jemand da eine (kleine) Herausforderung.

Plexian
Benutzeravatar
__blackjack__
User
Beiträge: 7831
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Freitag 8. Januar 2021, 14:03

@Plexian: ``global`` und globaler Zustand. Also daneben dass das sowieso Pfui ist, schränkt das Deine Webanwendung natürlich auch ein was die Server(konfiguration) angeht. Server die beispielsweise mit Prozessen arbeiten funktionieren damit nicht, und bei Threads musst Du darauf achten, dass das alles auch threadsicher ist.

Keine Abkürzungen in Namen. Je grösser die Sichtbarkeit um so wichtiger sind gute Namen, also globalen Zustand mit `sw` zu benennen ist nicht gut. Buchstaben sind nicht teuer.

Die Typannotationen sind dort besonders unsinnig. Selbst in Java muss man an solchen Stellen den Typ nicht immer zweimal hinschreiben. Java zwingt einen dazu nicht mehr, nun fangen Leute an das in Python freiwillig zu machen. Aaaaahhrg.

Bei den Typannotationen in `model.game` gibt es auch Fehler. Womit prüfst Du die denn? Wenn Du die nicht regelmässig, automatisiert überprüfst, solltest Du sie weglassen statt am Ende falsche Annotationen im Code stehen zu haben.

In `Player.buzz()` und `Player.reset()` hast Du Typfehler (laut der falschen Annotationen) und in `BuzzGame.__init__()`, `BuzzGame.remove_host()`, `BuzzGame.has_host()`, und `BuzzGame.get_player()`.

Bei `BuzzGame.players()` frage ich mich wenn ich den Code anschaue, warum das eine Liste ist, und kein Wörterbuch das Spielernamen auf Spieler-Objekte abbildet.

Statt `time.time()` solltest Du `time.monotonic()` verwenden.

Der Code zu ``# Force update of js files`` ist keine so schöne Lösung weil das ja sämtliches Caching verhindert.
“There's also a certain pleasure in actually getting things to work in Java, somewhat like the pleasure, I imagine, of building ships in bottles.”
— David Cook in c.l.p
Plexian
User
Beiträge: 10
Registriert: Mittwoch 15. Juli 2020, 20:24

Freitag 8. Januar 2021, 18:39

@__blackjack__:

Danke für deine Antwort! Mir fällt generell auf, dass ich wohl das Ganze mal hätte refactoren sollen, bevor ich das gepusht habe. Dann hätten sich wohl deine Kommentare größtenteils erledigt :?

- Zum "global" - Ja, ich weiß, dass das eher weniger schön ist. Ich hatte mich über Statefullness in Flask Servern informiert, und mir war ehrlich gesagt der Aufwand für eine Alternative nicht wert. Habs aber mal mit nem Kommentar gewesen
- "Keine Abkürzungen in Namen" - Auch richtig. Hab ich geändert.
- "Die Typannotationen sind dort besonders unsinnig" - Jop. Waren vorher Listen, daher die Annotationen, hab ich nur vergessen.
- "Bei den Typannotationen in `model.game` gibt es auch Fehler." - Ebenfalls richtig. Habe `mypy` scheinbar nicht mehr auf dieser Datei genutzt, daher nicht aufgefallen.
- "Bei `BuzzGame.players()`" - Auch das ist wohl ein Überbleibsel, weil die Identifikation vorher anders aussah. Kann ich ändern, die Lookups würden damit immerhin von linearer auf konstante Komplexität runtergehen, allerdings ist die Liste wohl in meinem Fall nie größer als 10, daher wohl egal. Ich änder das trotzdem mal, ist ja aus Designgründen so richtiger.
- "Statt `time.time()` solltest Du `time.monotonic()` verwenden." - Kannte ich nicht, danke!
- "Der Code zu ``# Force update of js files``" - Das war der Sinn der Sache, aber nur beim Debuggen. Hab ich auskommentiert, hatte ich wohl auch vergessen. Zusätzlich hatten die ? als Suffix im HTML Head (wo die Skripte geladen werden) die selbe Intention, hab ich auch entfernt.

Nochmal danke,
Plexian
Antworten