OOP-palvelun muuttujien laajuus

Muuttujien laajuus OOP-palvelussa

> LeekScript-opetusohjelma

Tämä sivu on voimassa vain LS1.0:ssa, LS1.1:ssä luokat ovat suoraan käytettävissä: Luokat ja objektit

Tässä artikkelissa luomme pseudo-OOP:n (Object Oriented Programming), koska LeekScript ei ole oliokieli. Ensin esittelen OOP:n käsitteen, sitten selitän kuinka muuttuva laajuus toimii. Jotta ei olisi liian teoreettista, aiomme ohjelmoida rakenteen nimeltä "Binary Search Tree", se on rakenne, joka on optimoitu järjestetylle lisäykselle ja etsimiselle.

OOP:n käsite

Tämä käsite on erittäin tärkeä, jos alat kiinnostua muista kielistä, kuten C (++/#), PHP, Java jne. Se on uusi tapa rakentaa ohjelmia. Hän esittelee esineitä. Tiedät varmasti, mitä se on jokapäiväisessä elämässä, se on jotain muunnettavissa/manipuloitavaa, mutta ohjelmoinnissa kutsumme "objektiksi" muuttujista ja funktioista koostuvaa rakennetta, jota kutsutaan '''attribuutiksi ja menetelmiksi''. ''. Otetaan esimerkkinä auto, sille on tunnusomaista nopeus, kiihtyvyys (älkääkä mene yksityiskohtiin) sekä toiminnot kuten kääntyminen, kiihdytys, jarrutus... Näin voisimme edustaa autoamme:

Tämä mahdollistaa strukturoidun ja puhtaan koodin. Mutta myös yksinkertaistaa monimutkaisista ohjeista koostuvien toimien käyttöä, jotka piilotetaan käyttäjältä. Toinen erittäin tärkeä asia OOP:ssa on kapseloinnin periaate... Kaikkia attribuutteja ja menetelmiä ei tarvitse manipuloida käyttäjän toimesta, joka voisi "murtaa" objektin, jos se ei tarkista sitä ja sellaista. asioita. Kuvitellaan, että käyttäjä muokkaa automme nopeutta pelin aikana eikä ota huomioon inertiaa tai jotain muuta, auto käyttäytyisi oudosti, ja tämäkin on vain pieni muutos. Kapselointi on siis periaate, jonka mukaan kohteen osat tehdään käyttäjälle näkymättömiksi, tätä kutsutaan yksityisiksi attribuuteiksi/menetelmiksi, päinvastoin, jos käyttäjällä on mahdollisuus käyttää attribuutteja/menetelmiä, nämä ovat julkisia .

Näiden objektien määritelmiä kutsutaan "luokiksi", niitä käytetään luomalla uusi esiintymä luokasta kuten normaalilla tyypillä (numerot, taulukot, merkkijonot...). Se on vain, että useimmissa kääntäjissä (jos ei kaikissa) tämä ilmentymä on implisiittinen: var a = 5; luo numeroobjektille muuttujan, jonka arvo on '5'. Puhun numeroiduista esineistä kielen väärinkäytöllä. Ero OOP:hen ovat muuttujaan sovellettavat funktiot:

olkoon a = 1;

//Ilman OOP:ta

add(a, 1); // funktion määrittelemä (@obj, nbr) { obj += nbr; }

// OOP

a.add(1); // määritellään menetelmällä add (nbr) { this += nbr; }

"Lisää"-funktio ottaa numeron lisättäväksi parametriksi. Ero näiden kahden version välillä on konteksti, ensimmäisessä tapauksessa 'add' ei tiedä mihin objektiin näitä ohjeita soveltaa, se tarvitsee viittauksen tähän numeroon ('obj'-parametri). Toisessa funktiossa se on menetelmä. Siksi se tietää objektin, jota on muokattava, koska "add" kuuluu "a":hen. Huomaa: Syntaksi on täysin mielivaltainen, sinun on vain ymmärrettävä periaate.

Tiedoksi, "lisää" on julkinen, jos seurasit, koska käyttäjä voi kutsua funktiota.

Muuttuva laajuus

Olet luultavasti jo käyttänyt globaaleja muuttujia, joiden avulla voit säilyttää tiedot kierrosten välillä ja päästä niihin käsiksi mistä tahansa koodistasi. Se, mikä erottaa ne "paikallisista" muuttujista, on niiden "laajuus". Ota seuraava koodi:

globaali _globaali;

toiminto soveltamisalaTest () { var localFunction; }

var localMain;

Jokaisella yllä olevilla muuttujilla on eri laajuus: _global on käytettävissä kaikkialla kaikissa torneissa, localMain on käytettävissä vain päälohkossa (ei funktioissa), localFunction on käytettävissä vain "testScope"-funktiossa. Soveltamisala koskee myös toimintoja, todellakin ScopeTest on kaikkien tornien käytettävissä kaikkialta, kun taas anonyymi toiminto on käytettävissä vain siinä tilassa, jossa se on luotu (kuten muuttuja).

Muuttujan laajuus koskee kaikkia lohkoja ( lohkosymboli: '{' ja '}' ). Siten muuttuja, joka on luotu muuttujassa if, a while, a do/while, a for ei ole käytettävissä sen ulkopuolella:

jos totta) { var localIf = 0;// LocalIf:n luominen } // localIf

debug(localIf); // Virhe: (localIf) tuntematon muuttuja tai funktio

for (var i = 0; i < 5; ++i) { // Luo i