Reddit – love2d – Contra programării jocurilor în Lua

Intro

Pentru a prefața acest lucru, am programat foarte puțin în Lua. Am făcut acest joc super simplu, iar în prezent lucrez la altul. Cu toate acestea, a fost suficient pentru a mă face să văd unele dintre dezavantajele programării în Lua.

Legături

Iată care sunt cele trei plângeri principale ale mele:

1) Tipare dinamică și (oarecum) slabă

2) Totul este o eroare de execuție

3) Lipsa claselor

Exemple

Tipare dinamică/lipsa de adnotări de tip

Să luăm în considerare o funcție ca exemplu specific.

function Ent:update_state(cmd, params) if cmd == 'at' then self.x, self.y = params.x, params.y endend

În primul rând, citirea funcției în sine devine dificilă. Ce primește această funcție? Și ce returnează, dacă returnează ceva? Nu obținem aceste informații dacă ne uităm la semnătura funcției. În schimb, trebuie să citim prin corpul funcției. Pentru funcțiile simple, acest lucru este în regulă. Dar pentru funcțiile mai lungi și mai complexe, determinarea tipului de returnare devine mai mult o bătaie de cap.

În plus, citirea/scrierea/depanarea apelurilor de funcție devine dificilă. Putem trece o valoare de orice tip către cmd! Dacă executăm ent:update_state(4, …), ent nu se va actualiza. Dar, în loc să surprindem acest lucru ca o eroare de tip, va trebui să o depanăm în timpul execuției.

În general, limbajele cu tipare dinamică sunt mai greu de citit. Dacă doriți să știți tipul unei variabile, trebuie să vă gândiți la calea de execuție a codului, în loc să puteți arunca o privire la o adnotare de tip (de exemplu, Java) sau să verificați tipul într-un REPL (de exemplu, folosind ghci pentru a verifica tipurile Haskell). Limbajul Hack este o excepție. Este tipizat dinamic, dar oferă totuși o verificare statică a tipurilor. Cu Lua, beneficiați de toate avantajele și dezavantajele unui limbaj tipizat dinamic. Este foarte ușor să scrii cod și la fel de dificil să asiguri corectitudinea.

Runtime/Silent Errors

function test_func(test_arg) print(test_arg)endtest_func() -- prints 'nil'

Iată un scenariu pe care l-am întâlnit des. Trebuie să adaug/eliminez/modific o funcție. Așa că schimb funcția, iar apoi mă învârt și schimb toate apelurile. Acest lucru nu este prea rău; pot să caut în întregul proiect și să actualizez apelurile unul câte unul. Dar ce se întâmplă dacă îmi scapă una? Sau dacă adaug un nou apel și uit că am modificat funcția? Ați ghicit: un eșec în timpul execuției!

Altul exemplu la întâmplare: 4 / 0 = inf. Nu aruncă o eroare.

Nu există clase

Există acesta, care funcționează bine. Dar tot îi lipsesc o mulțime de caracteristici OO frumoase: vizibilitatea metodelor și interfețele, pentru a numi câteva. Fără cele dintâi, devine foarte ușor să schimbi starea unui obiect de oriunde din cod și mult mai greu să raționalizezi despre starea obiectelor.

Nu e chiar atât de rău

Ok, astea sunt toate exemplele pe care le am (deocamdată). De fapt, am învățat o parte decentă în timp ce scriam asta. Aveam de gând să mă plâng de global scoping, dar am găsit asta. Aveam de gând să mă plâng de coerciția de tip, dar nu este prea rău (se întâmplă doar cu șiruri de caractere și ints). Și se pare că există o versiune tipizată de Lua! Nu am încercat-o, dar pare promițătoare. Dacă citești asta și ai încercat typedlua, spune-mi cum este în comentarii.

De ce mă plâng?

Îmi dau seama că a mă plânge de toate aceste lucruri poate părea cam stupid. Lua este un limbaj de scripting ușor; lucrurile pe care le-am menționat mai sus nu sunt întotdeauna contra. Lua nu este conceput pentru a construi aplicații mari și complexe. Dar acesta este motivul pentru care postez acest lucru în subredditul Love2D. Se pare că oamenii fac niște jocuri destul de mari și complexe cu Lua și Love2D. De exemplu, Mari0, Warlock’s Tower, etc. Cum o fac ei (voi?)? Nu prea îmi pot imagina să fac un joc „legal” în Lua/Love2D. Dacă aș lua o pauză de o săptămână, probabil că aș uita jumătate din cod și aș pierde mult prea mult timp doar încercând să-mi dau seama de tipurile tuturor variabilelor și funcțiilor mele. De obicei, jocurile folosesc Lua ca limbaj de „lipire” și implementează restul în C/C++? Este mai ușor să faci un joc mare în Lua decât în alte limbaje, chiar și cu problemele pe care le-am menționat mai sus? De ce folosesc oamenii Lua pentru jocuri de mari dimensiuni, dacă o fac?

Mulțumesc pentru că v-ați făcut timp să citiți asta :D. Și dacă am greșit ceva mai sus, vă rog să mă anunțați!

Citește interesant:

Lua: Părțile bune, rele și urâte

Tipare slabă și puternică

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.