🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #4627

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

#4627
From: Michal Mosiewicz
Date: Fri, 22 Jan 1999 18:42
131 lines
8813 bytes
Marcin 'Qrczak' Kowalczyk wrote:
> [...]
> Dlaczego Java zakłada, że dla żadnej klasy to już nie byłoby efektywne?
> Właśnie to dla mnie ją dyskwalifikuje.

Chwila moment - Java nic nie zakłada. To tylko Ty zakładasz, że operator
przypisania ma działać stosownie jak zechcesz, że język ma się dawać
formować tak jak zechcesz. Mnie przykładowo to nie jest tak bardzo
potrzebne. Jeśli chcę zrobić kopię obiektu, to robię kopię obiektu, ale
wiem, że nie służy do tego operator przypisania. Dla mnie jest to
różnica polegająca na tym, że zapis, który powoduje utworzenie nowego
obiektu będącego kopią innego obiektu jest ściśle logiczny. Przykład:
Jak chcę mieć dwa obiekty typu String, drugi zainicjowany pierwszym, to
piszę:
str2 = new String(str1);
Jak chcę przypiąć obiekt identyfikowany przez str1 do identyfikatora
str2 to piszę:
str2 = str1;

Java nie wyklucza możliwości zastosowania pierwszej konstrukcji, tylko
narzuca ścisłe rozróżnienie zapisu. Najwyraźniej przeszkadza Ci, że nie
możesz operacji kopiowania uczynić niewidoczną dla oglądającego kod.
 
> Zabieranie jakiejś możliwości jest niewątpliwą zaletą tylko wtedy, kiedy
> ta możliwość nigdy nie jest warta użycia. W tym miejscu tak nie jest.

Na razie mówisz o zabieraniu możliwości pełnej dowolności w leksykalnym
odwzorowaniu różnych czynności, a w szczególności uczynieniu zupełnie
różnych czynności nierozróżnialnymi. A idziesz nawet tak daleko, że...
 
> To jest wskaźnik, bo przypisanie (jak z porównaniem?) kopiuje adres, a nie
> zawartość.

...różnicę między wskaźnikiem a referencją ograniczasz do leksykalnej
funkcji operatora przypisania.
Już myślałem, że dla potrzeb dyskusji zgodziliśmy się, że wskaźnik jest
po prostu pewnym obiektem składającym się wyłącznie z referencji do
innego obiektu. 
 
> Wręcz przeciwnie. To jest przykład na to, jak obiektowe postrzeganie
> programowania nakłada sztuczne ograniczenia.

Masz absolutną rację co do jednego - całość obiektowej filozofii
programowania to zbiór ograniczeń, które bardzo istotnie ukrócają
swobodę programisty. Ja nie mam nic przeciwko dopóki mam na tyle
swobody, że jestem w stanie zaimplementować dowolny algorytm. Natomiast
pełna i absolutna swoboda w formułowaniu zapisu, to jest krótko mówiąc
anarchia. Nie mam nic przeciwko pełnej dowolności w konstruowaniu
własnych algorytmów. Na własne potrzeby też robię wszystko tak jak mi
się podoba. Jednakże w miarę wzrostu złożoności programów doceniam
czasem fakt, że nie korzystam z pełnej swobody oferowanej przez język
programowania. A jeszcze częściej doceniam to, że inni muszą działać w
ograniczonym zbiorze "środków wyrazu", kiedy mam okazję z kimś
współpracować.
 
> Bardziej praktycznym przykładem swap(a,b), które jest mniej więcej
> równoważne:
>   temp = a;
>   a = b;
>   b = temp;
> gdzie temp jest zmienną lokalną odpowiedniego typu. Nie da się? A więc
> dziękuję bardzo za taki język. Nawet w Pascalu da się to zrobić (prawda,
> że dla każdego konkretnego typu z osobna; czy w Javie są jakieś szablony,
> czy też są tylko funkcje wirtualne i każdy typ jawnie musi określić, że
> będzie mógł być używany jako wartość porównywalna?).

Znów czepiasz się o sens leksykalny (że nie da się zapisać trzech
operacji za pomocą jednego magicznego operatora). A odnośnie szablonów -
chcesz przykład do czego prowadzi stosowanie szablonów? Idealny przykład
to MICO, które mocno korzysta z templates, dlatego że korzysta z STL-a.
I okazuje się, że nie nie trzeba dużo wysiłku, aby zupełnie prosty
programik zajmował setki kilobajtów kodu. Ja swojego czasu mocno się
zdziwiłem jak się okazało, że jeden Java-ORB okazał się parę razy
szybszy od MICO. No ale cóż - podejrzewam, że kod wersji Javowej mieścił
mi się w większej części w cache-u procesora. A nie wspominam już o tym,
że gdyby w C++ istniał praprzodek obiektowy tak, jak np. w Smalltalku,
Javie, Objective-C czy jeszcze wielu innych językach, to możnaby się
pozbyć połowy templates z programów. Drugą połowę templates można
wywalić, kiedy programiści nauczą się, że generalizacja problemów jest
również osiągalna przez wyróżnianie ogólniejszych klas. Templates są
najczęściej kolejnym sposobem na bałagan. Zamiast wprowadzać klasy typu
Comparable, prościej zrealizować funkcje Min i Max stosując szkielety.
Wtedy, jak program się gdzieś nie zechce skompilować z braku operatora
<>, to po prostu się go dopisze. Najczęściej tak to działa.

Dlatego, że w C++ istniał od zawsze bałagan (możesz nazwać go swobodą),
to pojawiła się potrzeba stosowania templates. Zastanawiałeś się
dlaczego ten mechanizm istnieje tylko w C++? Podpowiem - bo nie ma
drugiego tak bałaganiarskiego języka. ;-)
 
> Wręcz przeciwnie. To jest przykład na to, że logika przynależności metod
> do obiektów jest ograniczona i nie odpowiada dobrze rzeczywistości.
> 
> Ja rozumiem, że inni mogą lubić co innego i kochają ograniczenia
> programowania obiektowego. Nie będę im wchodził w drogę ani próbował siłą
> nawracać; przepraszam za ten kawałek świętej wojny na pl.comp.objects
> (jednak potrzeba nam pl.comp.lang.advocacy!). To jest tylko moje skromne
> zdanie i efekt długich przemyśleń.

To jest tzw. odwracanie kota ogonem (chodzi mi o to kochanie oganiczeń).
Czy kochasz jeździć prawą stroną jezdni (mam na myśli Polskę)? To
dlaczego tak jeździsz? Ano tylko dlatego, że nie jesteś sam na świecie i
mógłbyś się z kimś zderzyć. Temu służą pewne ograniczenia. Na dodatek
ograniczenia w programowaniu służą też temu, żebyś nie zderzył się z
samym sobą, kiedy za jakichś czas zapomnisz o prywatnej logice
zastosowanej w jakimś projekcie.

Jeszcze odnośnie tego przywiązania metod do obiektów. Bardzo proszę -
masz zwykłe C. Tam żadna metoda nie jest przywiązana do żadnego obiektu.
Po prostu każda metoda operuje na pewnym zestawie obiektów i tylko tyle.
Czy dobrze rozumiem, że jedyna wyższość C++ polega na tym, że można na
dodatek tworzyć jeszcze funkcje o jednoliterowych, nic nie mówiących
nazwach jak + - * < > << >> ... itp? Acha - i są jeszcze templates :-)

BTW. Żeby uwolnić psychikę programistów przyzwyczajonych do funkcji,
niektóre języki idą tak daleko, że przestają nazywać funkcję metodą, a
zastępują ją komunikatem lub wiadomością. One mają to do siebie, że
znajdują się znacznie bliżej istoty efektywnego programowania, tj.
interakcji między obiektami wyrażanej jako przesyłanie między nimi
komunikatów. I wbrew pozorom w tym wszystkim jest logika. Kiedy
zaczniesz patrzeć na program jako na taką interakcję, to znacznie
łatwiej jest wykonać jego dekompozycję na części składowe. Możesz zacząć
się koncentrować na logice obsługi pojedynczych komunikatów, łączyć
interakcję w coraz większe fragmenty, a najważniejsze, że przestajesz
patrzeć na program jako jeden wielki ciąg instrukcji.

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: <36A8C6A2.96DD997C@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: <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> <36A7A8DC.344946D0@interdata.com.pl> <Pine.LNX.4.05.9901221350580.12458-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: Fri, 22 Jan 1999 19:42:42 +0100
Organization: Interdata s.c., http://www.interdata.com.pl
Lines: 131
Message-ID: <36A8C6A2.96DD997C@interdata.com.pl>
References: <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> <36A7A8DC.344946D0@interdata.com.pl> <Pine.LNX.4.05.9901221350580.12458-100000@qrnik.knm.org.pl>
NNTP-Posting-Host: mimo.lodz.pdi.net
Mime-Version: 1.0
X-Trace: korweta.task.gda.pl 917030615 9342 195.116.162.218 (22 Jan 1999 18:43:35 GMT)
X-Complaints-To: abuse@task.gda.pl
NNTP-Posting-Date: 22 Jan 1999 18:43:35 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