Article View: pl.comp.www
Article #408825Re: TypeScript - jak uzyskać zmienne prywatne? Gdzie korzyści z TS?
From: Marek S
Date: Sat, 07 Sep 2019 22:07
Date: Sat, 07 Sep 2019 22:07
80 lines
4847 bytes
4847 bytes
W dniu 2019-09-07 o 16:12, Roman Tyczka pisze: > >> Jeśli nie PHP, to może C#. Jeśli miałbym tworzyć standardy, to z >> pewnością powieliłbym zachowanie się prywatnych zmiennych z tego >> typu języków. > > To, że w jakichś językach jest to tak czy inaczej nie jest dowodem, > że tak powinno być. Chwila, ale nie rozmawiamy tu o postępowaniu sądowym, czy rozkminianiu zagadek matematycznych by o jakichś dowodach wspominać. Jeśli chcesz bawić się w dowody zachowania się zmiennych prywatnych w JS, to z natury rzeczy stoisz na przegranej pozycji, bo czegoś takiego w JS nie ma ... przynajmniej do momentu gdy zastosujemy sztuczek, jakie opisałem. Wtedy można je wykrzesać nawet w natywnym JS i zachowują się one dokładnie tak samo jak w innych językach. Jeśli natomiast mówimy o zachowaniu się zmiennych prywatnych w TS to może warto wrócić do podstaw i przeczytać definicję zmiennej prywatne. Jej definicja jest jedna i wspólna dla wszystkich języków: https://pl.wikipedia.org/wiki/Zmienna_prywatna lub tu: https://pl.wikipedia.org/wiki/Zmienna_(informatyka) "Zmienne zadeklarowane w module mogą być zmiennymi prywatnymi modułu – dostępnymi wyłącznie z jego wnętrza – lub zmiennymi publicznymi (eksportowanymi) – dostępnymi tam, gdzie moduł jest wykorzystywany. Podobnie jest ze zmiennymi w klasie – mogą być dostępne: tylko dla danej klasy (zmienna prywatna)," https://www.p-programowanie.pl/cpp/klasy-c/ "private – dostęp do składników klasy jest zabroniony z poza ciała klasy" Nie chcę już cytować linków na ten sam temat w kontekście PHP czy Java. Sposób zachowania zmiennych prywatnych jest tam również zgodny z definicją. TS łamie tą definicję. Zdefiniowana przez niego zmienna prywatna w klasie, w kodzie wynikowym będzie podlegać nadpisywaniu przez klasę potomną. Owszem, powstanie podczas transkompilacji absurdalny błąd, który nie ma prawa zaistnieć, a wadliwy kod wynikowy i tak wygeneruje się. > Źródłem są przemyślenia. Oto mój tok rozumowania: Tworzysz obiekt > klasy Test2. Klasa Test2 ma prywatne pole ukryte pod this._message. > Wołasz z tego obiektu metodę, która zwraca this._message. Skoro jest > to obiekt klasy Test2 to dla tego typu this._message jest czymś innym > niż dla typy Test, prawda? Dla mnie to sprawa oczywista jak > oddychanie ;-) Jest tu wyraźna niejednoznaczność i punkt sporny, > który warto wywalić na twarz chociażby ostrzeżeniem. > > To, że Java czy C# zwraca bezrefleksyjnie (czy są jakieś ostrzeżenia > kompilatora?) wcale nie jest fajne, bo łatwo o masę głupich błędów, > które transpiler TS wyłapuje jak zeznałeś. Mnie to bardzo cieszy, bo > nie uważam, że taka praktyka jak identyczna nazwa prywatnego pola w > dziedziczeniu to dobra praktyka. Ot wszystko. > Hmmm... wydaje mi się, że taki sposób rozumowania i obawy o to, co jak mają się zachowywać zmienne prywatne (niezależnie od języka programowania) wynikają z Twojego niezrozumienia czym w ogóle są zmienne prywatne. Zapewniam Cię, że ani w C ani w PHP obecność zmiennej prywatnej w klasie bazowej nie będzie podlegać nadpisaniu w klasie potomnej bo to są dwa oddzielne byty w dwóch różnych obszarach RAM. Żadne ostrzeżenia o używaniu zmiennych prywatnych w obu klasach nie powstaną w trakcie kompilacji C lub używania PHP bo ... nie ma o czym ostrzegać. Nie ma w tym żadnego błędu jak i obie zmienne nie będą w konflikcie. Jedynie TS się wyłamuje i nadużywa terminu prywatności. Przypuszczam, że jest to zwyczajny błąd twórców TS. Spytam jeszcze: czy Ty w ogóle programujesz z użyciem OOP? Masz wątpliwości co do najbardziej podstawowych pojęć w tej technice. -- Pozdrawiam, Marek
Technical Details
Message-ID:
<ql19ne$ts7$1@news.icm.edu.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!.POSTED!not-for-mailReferences:
<qkp5ov$imf$1@news.icm.edu.pl> <10aaekrsuhadf.dlg@tyczka.com> <qkrhgq$2sb$1@news.icm.edu.pl> <42gmo1ejd6qz.dlg@tyczka.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!.POSTED!not-for-mail From: Marek S <precz@spamowi.com> Newsgroups: pl.comp.www Subject: Re: TypeScript - jak uzyskać zmienne prywatne? Gdzie korzyści z TS? Date: Sun, 8 Sep 2019 00:07:37 +0200 Organization: ICM, Uniwersytet Warszawski Lines: 80 Message-ID: <ql19ne$ts7$1@news.icm.edu.pl> References: <qkp5ov$imf$1@news.icm.edu.pl> <10aaekrsuhadf.dlg@tyczka.com> <qkrhgq$2sb$1@news.icm.edu.pl> <42gmo1ejd6qz.dlg@tyczka.com> NNTP-Posting-Host: 89-77-183-104.dynamic.chello.pl Mime-Version: 1.0 X-Trace: news.icm.edu.pl 1567894062 30599 89.77.183.104 (7 Sep 2019 22:07:42 GMT) X-Complaints-To: usenet@news.icm.edu.pl NNTP-Posting-Date: Sat, 7 Sep 2019 22:07:42 +0000 (UTC) User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.0 In-Reply-To: <42gmo1ejd6qz.dlg@tyczka.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit