Article View: pl.comp.objects
Article #4620Re: Referencje (Re: Prawda o C++)
From: Michal Mosiewicz
Date: Thu, 21 Jan 1999 22:23
Date: Thu, 21 Jan 1999 22:23
93 lines
6413 bytes
6413 bytes
Marcin 'Qrczak' Kowalczyk wrote: > [...] > Z powyższej składni wynika, że nie da się zawrzeć jednego obiektu wewnątrz > drugiego. Można najwyżej umieścić referencję do niego. O ile następnik > mógłby być referencją albo wskaźnikiem, o tyle właściwe dane elementu > listy są w naturalny sposób częścią tego elementu, a nie są tylko do niego > podłączone. Hmm, nie do końca rozumiem, co rozumiesz przez zawieranie. Java pozwala na stosowanie klas wewnętrznych, co pozwala na wsadzanie jednych klas do drugich. Z tym, że raczej nie stosuje się tego dla zwiększenia szybkości dostępu, a raczej dla zmiany uprawnień dostępu. > Z powyższej składni wynika, że operator = tworzy nową referencję, a nie > kopiuje obiektu. Czy tak samo jest dla liczb całkowitych? Nie tworzy nowej referencji, ale kopiuje referencję. To istotna różnica. Oczywiście kopiowanie referencji ma miejsce tylko wtedy, gdy po obu stronach operatora mamy typy obiektowe. Ze względu na to, że nie byłoby efektywne posługiwanie się w ten sposób typami prymitywnymi, tj. byte, int, long, float itp, to w przypadku zastosowania operatora przypisania mamy do czynienia z kopiowaniem przez wartość. > * Jeśli tak, to to musi być bardzo nieefektywne. Przy każdej operacji > typu a=b+c obiekt jest niszczony i tworzony na nowo. Jeśli mamy do czynienia z wyżej wymienionymi typami, to operacja odbywa się na wartościach. > * Jeśli nie, to znaczy, że pewne typy wbudowane pracują na innych prawach > niż wszystkie typy definiowane przez użytkownika (AFAIK właśnie tak jest > w Javie). Dla mnie to jest nienormalne z założenia. Fakt, z punktu widzenia programisty nienormalne jest to, że musi rozróżniać Integer od int. Jednakże te drobne niewygody redukuje fakt, że progamista dostaje narzędzie, które po prostu z góry narzuca mu wielokrotne wykorzystywanie tych samych obiektów. W przeciętnym projekcie C++ jest znacznie więcej niepotrzebnego kopiowania całych obiektów, a nie referencji. W wielu wypadkach robi się kopie tylko dlatego, że później nie będzie wiadomo, kto ten obiekt ma tak naprawdę skasować. > W każdym razie wygląda na to, że w Javie nie ma referencji, przynajmniej > dla typów definiowanych przez użytkownika. Są same wskaźniki! Tyle że tego > na oko nie widać, bo każda funkcja oczekuje tych wskaźników i wskazywane > obiekty same się zwalniają. Tego zdania też nie rozumiem. Jeśli jakiś obiekt jest czymś identyfikowany i tenże identyfikator jest utożsamiany z obiektem, bez pośrednictwa dodatkowych operatorów, to dla mnie to jest referencja. > Załóżmy, że chcę zdefiniować operację przypisz, która działa jak operator > przypisania, tzn. > a.przypisz (b); > jest dokładnie równoważne > a = b; > albo drugą wersję, która jest równoważna > b = a; > W szczególności jeśli dla pierwszej wersji wcześniej było c = a (a dla > drugiej c = b), to teraz wartość c ma się nie zmienić (mam nadzieję, że > dobrze rozumiem znaczenie = w Javie, której nie znam). Jak to zrobić? Hmm, to jest właśnie doskonały przykład tego jak C++ może wykoślawić obiektowe postrzeganie programowania. Rozumiem, że jest tak: Mamy dwa różne obiekty, i wywołanie metody jednego z tych obiektów ma spowodować, że tenże obiekt stanie się drugim obiektem. Czyli po tejże operacji referencja identyfikowana przez zmienną a będzie równa referencji b. To jest absolutnie sprzeczne z logiką projektowania obiektowego. W pierwszej z brzegu książce trąbi się o tym, że metoda jest funkcją wywoływaną na rzecz obiektu. I to stwierdzenie jest tu kluczowe. Można oczekiwać, że metoda przypisz będzie co najwyżej kopiowała wartości atrybutów z obiektu b. Natomiast jeśli metoda działająca na rzecz obiektu ma się tego obiektu pozbyć i pod identyfikator, który chwilowo ten obiekt identyfikuje podstawić coś zupełnie innego, to wybacz, ale jest to absolutnie sprzeczne z całą logiką obiektowości. Jak chcesz wykorzystać identyfikator a do tego, żeby wskazywał na obiekt identyfikowany zmienną b, to korzystasz z operatora przypisania. Bo on do tego służy. Tak apropos niedawnej dyskusji na temat friendów - C++ wprowadza kolosalny bałagan w sensie tego, że możesz sobie wszystko przedefiniować. To powoduje, że ktoś sobie w pewnym momencie wprowadza np. operator pisania do strumienia jako operator dwuargumentowy, bo tak mu się wydaje ładnie. Co z tego, że jest ładnie, skoro natychmiast okazuje się, że tak pokręcony operator zerwał z logiką przynależności metod do obiektów i trzeba wymyśleć mechanizm zaprzyjaźniania, żeby go z powrotem "przykleić" do tych obiektów, z których został wyrwany. Michał -- WWW: http://www.lodz.pdi.net/~mimo tel: Int. Acc. Code + 48 42 2148340 add: Michal Mosiewicz * Bugaj 66 m.54 * 95-200 Pabianice * POLAND
Technical Details
Message-ID:
<36A7A8DC.344946D0@interdata.com.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.icm.edu.pl!news.task.gda.pl!mimo.lodz.pdi.net!not-for-mailReferences:
<36a27542.0@news3.ibm.net> <Pine.LNX.4.05.9901180659020.6379-100000@qrnik.knm.org.pl> <77upi3$saj$1@zeus.polsl.gliwice.pl> <Pine.LNX.4.05.9901181049150.351-100000@qrnik.knm.org.pl> <36A34000.764E7B8@interdata.com.pl> <77vjok$7aj$1@h1.uw.edu.pl> <36A361A1.69764717@interdata.com.pl> <Pine.LNX.4.05.9901182130180.542-100000@qrnik.knm.org.pl> <36a3cad2.0@news3.ibm.net> <Pine.LNX.4.05.9901210833580.9316-100000@qrnik.knm.org.pl> <36A74714.C3A7DA39@interdata.com.pl> <Pine.LNX.4.05.9901211903120.426-100000@qrnik.knm.org.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.icm.edu.pl!news.task.gda.pl!mimo.lodz.pdi.net!not-for-mail From: Michal Mosiewicz <mimo@interdata.com.pl> Newsgroups: pl.comp.programming,pl.comp.objects Subject: Re: Referencje (Re: Prawda o C++) Date: Thu, 21 Jan 1999 23:23:24 +0100 Organization: Interdata s.c., http://www.interdata.com.pl Lines: 93 Message-ID: <36A7A8DC.344946D0@interdata.com.pl> References: <36a27542.0@news3.ibm.net> <Pine.LNX.4.05.9901180659020.6379-100000@qrnik.knm.org.pl> <77upi3$saj$1@zeus.polsl.gliwice.pl> <Pine.LNX.4.05.9901181049150.351-100000@qrnik.knm.org.pl> <36A34000.764E7B8@interdata.com.pl> <77vjok$7aj$1@h1.uw.edu.pl> <36A361A1.69764717@interdata.com.pl> <Pine.LNX.4.05.9901182130180.542-100000@qrnik.knm.org.pl> <36a3cad2.0@news3.ibm.net> <Pine.LNX.4.05.9901210833580.9316-100000@qrnik.knm.org.pl> <36A74714.C3A7DA39@interdata.com.pl> <Pine.LNX.4.05.9901211903120.426-100000@qrnik.knm.org.pl> NNTP-Posting-Host: mimo.lodz.pdi.net Mime-Version: 1.0 X-Trace: korweta.task.gda.pl 916958613 19624 195.116.162.218 (21 Jan 1999 22:43:33 GMT) X-Complaints-To: abuse@task.gda.pl NNTP-Posting-Date: 21 Jan 1999 22:43:33 GMT X-Mailer: Mozilla 4.5 [en] (X11; I; Linux 2.2.0-pre4 i586) X-Accept-Language: pl,en-US,en Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit