Zakres zmiennych w usłudze OOP

Zakres zmiennych w usłudze OOP

> LeekScript samouczek

Ta strona jest ważna tylko dla LS1.0, w LS1.1 można bezpośrednio używać klas: Klasy i obiekty

W tym artykule stworzymy pseudo OOP (Object Oriented Programming), ponieważ LeekScript nie jest językiem zorientowanym obiektowo. Najpierw przedstawię pojęcie OOP, a następnie wyjaśnię, jak działa zakres zmiennych. Aby nie być zbyt teoretycznym, zaprogramujemy strukturę o nazwie „Binary Search Tree”, jest to struktura zoptymalizowana pod kątem uporządkowanego wstawiania i wyszukiwania.

Pojęcie OOP

To pojęcie jest bardzo ważne, jeśli zaczynasz interesować się innymi językami, takimi jak C (++/#), PHP, Java itp. To nowy sposób tworzenia programów. Wprowadza przedmioty. Na pewno wiesz, co to jest w życiu codziennym, jest to coś, co można przekształcić/manipulować, ale w programowaniu nazywamy „obiektem” strukturę złożoną ze zmiennych i funkcji zwanych „atrybutami i metodami”. Weźmy przykład samochodu, charakteryzuje się on prędkością, przyspieszeniem (nie wchodźmy w szczegóły) oraz akcjami takimi jak skręcanie, przyspieszanie, hamowanie... Oto jak moglibyśmy przedstawić nasz samochód:

Pozwala to na ustrukturyzowany i czysty kod. Ale także po to, aby uprościć korzystanie z akcji złożonych ze skomplikowanych instrukcji, które będą ukryte przed użytkownikiem. Kolejną bardzo ważną rzeczą w OOP jest zasada enkapsulacji... Wszystkie atrybuty i metody nie muszą być manipulowane przez użytkownika, który mógłby „zepsuć” obiekt, jeśli nie sprawdza tego i tego rzeczy. Wyobraźmy sobie, że użytkownik modyfikuje prędkość naszego samochodu w trakcie gry i nie bierze pod uwagę bezwładności lub czegoś innego, samochód zachowywałby się dziwnie, a nawet to jest tylko drobna modyfikacja. Hermetyzacja jest zatem zasadą uczynienia części obiektu niewidocznymi dla użytkownika, nazywa się to prywatnymi atrybutami/metodami, wręcz przeciwnie, jeśli użytkownik ma możliwość korzystania z atrybutów/metod, są to publiczne .

Definicje tych obiektów nazywane są „klasami”, są używane przy tworzeniu nowej instancji klasy, tak jak w przypadku normalnego typu (liczby, tablice, łańcuchy…). Po prostu w większości kompilatorów (jeśli nie we wszystkich) ta instancja jest niejawna: var a = 5; tworzy zmienną obiektu liczbowego o wartości '5'. Mówię o przedmiotach numerowanych przez nadużycie języka. Różnicą w stosunku do OOP są funkcje zastosowane do zmiennej:

niech a = 1;

//Bez OOP

dodaj(a, 1); // zdefiniowane przez funkcję (@obj, nbr) { obj += nbr; }

// OOP

a.add(1); // zdefiniowane metodą add (nbr) { this += nbr; }

Funkcja „add” przyjmuje liczbę do dodania jako parametr. Różnica między tymi dwiema wersjami polega na kontekście, w pierwszym przypadku 'add' nie wie do jakiego obiektu zastosować te instrukcje, potrzebuje odniesienia do tego numeru (parametr 'obj'). Podczas gdy w drugiej funkcji jest to metoda. Dlatego zna obiekt, który musi zostać zmodyfikowany, ponieważ „add” należy do „a”. Uwaga: Składnia jest całkowicie dowolna, wystarczy zrozumieć zasadę.

FYI, „add” jest publiczne, jeśli śledziłeś, ponieważ użytkownik może wywołać tę funkcję.

Zmienny zakres

Prawdopodobnie korzystałeś już ze zmiennych globalnych, pozwalają one przechowywać informacje między rundami i mieć do nich dostęp w dowolnym miejscu w kodzie. Tym, co odróżnia je od zmiennych „lokalnych”, jest ich „zakres”. Weź następujący kod:

globalny _globalny;

test zakresu funkcji () { var funkcja lokalna; }

var lokalna główna;

Każda z powyższych zmiennych ma inny zakres: _global jest dostępna wszędzie na wszystkich wieżach, localMain jest dostępna tylko w głównym bloku (nie w funkcjach), localFunction jest dostępna tylko w funkcji „testScope”. Zasięg dotyczy również funkcji, w rzeczywistości scopeTest jest dostępny dla wszystkich wież z dowolnego miejsca, podczas gdy funkcja anonimowa jest dostępna tylko w przestrzeni, w której została utworzona (jak zmienna).

Zakres zmiennej dotyczy wszystkich bloków (symbol bloku: '{' i '}' ). Zatem zmienna utworzona w if, a while, do/while, a for nie jest dostępna poza nią:

Jeśli prawda) { var localIf = 0;// Tworzenie localIf } // koniec życia localIf

debugowanie(lokalnyJeśli); // Błąd: (localIf) nieznana zmienna lub funkcja

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