🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #4620

Re: Referencje (Re: Prawda o C++)

#4620
From: Michal Mosiewicz
Date: Thu, 21 Jan 1999 22:23
93 lines
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-mail
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>

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