W poprzednim poście pokazałem, jak wygląda prosta klasa w TypeScript. Teraz czas by wprowadzić kilka dodatkowych elementów. Jedną z rzeczy, która mocno wyróżnia klasy TypeScript, od tych znanych z klasycznego JavaScript, jest możliwość zastosowania modyfikatorów dostępu.
Po co modyfikatory dostępu?
Modyfikatory dostępu mają proste zadanie. Mają one pokazać osobie używającej klasy, która stworzyliśmy, których rzeczy może użyć, a od jakich powinna trzymać się z daleka.
Na przykład mamy klasę służącą do transformacji danych (i tu uwaga, o ile klasa dobrze nadaję się do zobrazowania tematu, to nie jest ona najlepszym rozwiązaniem z punktu designu klasy, ale o tym innym razem)
class DataTransformer { data: string; reversed: string[]; transformed: string; constructor(data: string) { this.data = data; this.reversed = []; this.transformed = ""; } splitData() : void { this.reversed = this.data.split(""); } reverseData() : void { this.reversed = this.reversed.reverse(); } joinData() : void { this.transformed = this.reversed.join(""); } transform() : string { this.splitData(); this.reverseData(); this.joinData(); return this.transformed; } }
W tym konkretnym przypadku nasza klasa odwraca stringa, czyli „hello” zostanie przetransformowane na „olleh”. Mamy metodę transformującą, która składa się z kliku 'podfunkcji” – jedna dzieli stringa na tablice, druga odwraca kolejność, trzecia łączy z powrotem do stringa.
Mamy tu jednak kilka problemów. Tej metody „powinno się” używać w taki sposób:
const trans : DataTransformer = new DataTransformer("hello"); console.log(trans.transform());
Jednak w klasycznym JavaScript każdy może wywołać dowolną z czterech metod, w dowolnej kolejności… w dodatku może nam podmieniać dane również w dowolnym momencie, bo ma dostęp do wszystkiego. Więc nic nie stoi na przeszkodzie, by zrobić coś takiego:
trans.reverseData(); trans.transformed = "xxs"; trans.splitData(); trans.reversed = ["x", "s"];
I jest to realny problem. Możemy się ratować dokumentacją i komentarzami /* NIE UŻYWAJ TEJ METODY */. Innym wprowadzonym umownym rozwiązaniem jest dodawanie _ przed nazwami zmiennych bądź metod. Tak nazwane elementy klasy przyjęło się, że są tylko do użytku wewnętrznego klasy i nie powinno się ich wołać. Wówczas nasza klasa wyglądałaby tak:
class DataTransformer { _data: string; _reversed: string[]; _transformed: string; constructor(data: string) { this._data = data; this._reversed = []; this._transformed = ""; } /* INTERNAL METHOD */ _splitData() : void { this._reversed = this._data.split(""); } /* INTERNAL METHOD */ _reverseData() : void { this._reversed = this._reversed.reverse(); } /* INTERNAL METHOD */ _joinData() : void { this._transformed = this._reversed.join(""); } transform() : string { this._splitData(); this._reverseData(); this._joinData(); return this._transformed; } }
Zarówno komentarze i _ to rozwiązanie umowne, wciąż nie ma problemu by ktoś kto chce danej klasy użyć to zrobił.
I tu z pomocą dla programistów przychodzą modyfikatory dostępu, dzięki którym kompilator będzie pilnował by na zewnątrz naszej klasy wykorzystywane były tylko metody do tego przeznaczone.
W następnym wpisie cyklu przyjrzymy się już konkretom, czyli konkretnym modifikatorom dostępu w TypeScript.
Jeden komentarz do “Modyfikatory dostępu – po co mi one?”