🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #15745

Re: pl.comp.objects FAQ (Frequently Asked Questions and more)

#15745
From: Mariusz Lotko
Date: Wed, 07 Mar 2007 18:59
132 lines
7235 bytes
Sektor van Skijlen wrote:

> Dnia Mon, 05 Mar 2007 23:58:08 +0100, Mariusz Lotko skrobie:
>> Sektor van Skijlen wrote:
> 
>> > Dnia Mon, 05 Mar 2007 07:07:55 +0100, Mariusz Lotko skrobie:
>> >> > No właśnie o to chodzi, że nie. Jeśli określamy dany typ jako
>> >> > wartościowy, to tożsamość przechowującego ją obiektu nie powinna nas
>> >> > interesować w ogóle.
>> > 
>> >> A zatem powszechnie stosowany "trik" polegający na sprawdzeniu
>> >> tożsamości obiektu w pierszej linijce operatora == uważasz za błędny?
>> > 
>> > Tak.
> 
>> Wybacz, ale powyższym stwierdzeniem skłaniasz mnie do stwierdzenia u
>> Ciebie paranoi... Przecież stosowanie tego jest oczywiste. Po co mam
>> sprawdzać, czy mam tyle samo pieniędzy w swoim portfelu co... w swoim?
> 
> Portfel nie jest typem wartościowym.
> 
> Ilość pieniędzy w portfelu jest jedynie jednym ze stanów tego obiektu,
> podobnie jak ilość kart kredytowych w środku, kolor portfela i materiał, z
> którego go wykonano.

I w _każdym_ systemie tak to modelujesz? Z pełną otoczką? Piękny przykład
wzorca "swiss army knife".

> Typem wartościowym może być kolor. Porównanie dwóch obiektów typu kolor
> można porównać ze sprawdzeniem, czy na dwóch kartkach papieru zapisany tam
> kod koloru jest ten sam. Ty chcesz, żeby przed odczytaniem numeru z każdej
> kartki najpierw sprawdzić, czy te obie kartki to czasem nie jest jedna i
> ta sama kartka. Jaki to ma sens?

Idąc Twoją logiką: niekoniecznie. Obiekt kolor ma jeszcze atrybuty: data
naniesienia, technika wykonania i stopień nasłonecznienia, które pozwalają
obliczyć rzeczywisty kolor w czasie :> Wtedy nie da się porównać dwóch
"czerwonych". Odsyłam do ekspertów - lakierników samochodowych.

>> >> Podobnie w operatorze =, w którym zapobiega to przypisania obiektu
>> >> samemu sobie?
>> > 
>> > Tu już nie, ale to jest związane z tzw. kwestią językową. W przypadku
>> > C++ jest to konieczne, jeżeli obiekt podawany jako argument operatora =
>> > jest przekazywany przez referencję.
>> > 
>> > Nie byłoby natomiast tego problemu w przypadku, gdyby ten obiekt był
>> > tam przekazywany przez wartość.
>> > 
>> > Gdyby hipotetycznie w Javie była możliwość zrobienia czegoś podobnego,
>> > to tam też nie ma konieczności dodawania takiego sprawdzenia:
> 
>> Z tym, że w obu przypadkach nie chodzi o "przykrą konieczność", a
>> o "wspaniałą możliwość" szybkiego stwierdzenia, że chodzi o "te same"
>> a więc na pewno "takie same" obiekty.
> 
> To jest przykra konieczność. Musisz to po prostu zrobić, bo inaczej będzie
> wylot.

W operatorze porównania? Nie sądzę...

> Ta "wspaniała możliwość" z kolei powoduje droższe porównanie.

W pewnych przypadkach może tak być. Implementując operator warto
oszacować prawdopodobieństwo porównywania tych samych obiektów.
Generalnie jednak - nie zgadzam się.

>> >> > Zauważ, po co w C++ stosuje się wskaźniki i referencje do takich
>> >> > typów jak int, czy std::string. Jeśli już, to stosuje się albo
>> >> > uogólnienie przekazywania (const T&), albo przekazuje się do
>> >> > zmodyfikowania (T&, T*). Czy widziałeś kiedykolwiek w jakimś
>> >> > rzeczywistym programie, żeby ktoś porównywał dwa wskaźniki do int
>> >> > (pomijając przypadek, gdy wskaźnik do int jest używany jako iterator
>> >> > do tablicy int-ów - czyli zastosowanie jest inne, niż wartość
>> >> > referencji)?
>> > 
>> >> Tak, w dowolnej konkretyzacji szablonu int'em. Nie każdemu chce się
>> >> robić specjalne implementacje dla typów prostych.
>> > 
>> > Przy uogólnianiu oczywiście jest to prawda, z tą tylko różnicą, że tam
>> > typ parametryczny T traktuje się prawdopodobnie zawsze jak typ
>> > obiektowy, więc sprawa konkretyzacji na int nie ma i tak znaczenia.
> 
>> "Prawdopodobnie" to dla mnie trochę za mało. Szczególnie w przypadku
>> szablonów, które według mojej praktyki z reguły są po prostu przeznaczone
>> dla obiektów oferujących określony interfejs. I innych ograniczeń w ich
>> użyciu właściwie nie ma.
> 
> Tak, dokładnie. Ale typy wartościowe zwykle mają inny interfejs, niż typy
> obiektowe.

Znowu ogólnik: "zwykle"... "Sprzedajesz" nam teorię, która ma działać w
praktyce, ułatwiać ją. Chciałbyś, żeby Twój samochód "zwykle" działał?

> 
>> > Jeśli mówimy już o rzeczywistości - podaj mi przykład obiektu z
>> > rzeczywistości, który posiada jednocześnie wartość i tożsamość.
> 
>> Konto bankowe. Tożsamość: numer, wartość: saldo.
> 
> Oraz wartość: właściciel (można go potem kiedyś zmienić)
> Oraz obiekt: historia transakcji
> Oraz...

Jak wyżej: zależy od kontekstu. Możemy nie wiązać obiektów transakcji do
konta, a zrobić wiązanie odwrotne: każda transakcja ma referencję do konta.
I podobnie z właścicielem. Krótko mówiąc "konto jest anonimowe" i
przechowuje jedynie swoje saldo (wartość) oraz numer (tożsamość).
Nie wiem, czy to ma sens, ale nie możesz chyba wykluczyć, że w jakimś
tam systemie może mieć.

> Czy ty w ogóle wiesz, co to jest "wartość"?

Element ze zbioru (tu: typ, klasa).

>> Nie chciałbym mieć konta w banku, który ma kłopot z odróżnieniem
>> wartości mojego konta od jego tożsamości.
> 
> Na razie to masz problem z odróżnieniem wartości od stanu.

Hmm, mam na ten temat "swoją teorię". Na razie przyjmijmy, że jestem
betonem zamkniętym na Twoją światłą myśl. Na pocieszenie powiem Ci, że jeśli
Twoja teoria się przyjmie i w kilku książkach pojawią się
sformułowania w rodzaju "słynny obiektolog prof. van Skijlen opisuje to w
swojej pracy...", to zgłoszę się do Ciebie po autograf :-)

A tymczasem pozwolę sobie zakończyć, bo już chyba nikt nas nie czyta, 
a i argumenty jakby zaczęły się powtarzać.


-- 
Mariusz Lotko
Technical Details
Message-ID: <esn1nl$7q7$1@bandai.magma-net.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.magma-net.pl!not-for-mail
References: <pl-comp-objects-faq-1-1166202604@ict.pwr.wroc.pl> <es6b6u$2ls$1@kujawiak.man.lodz.pl> <esbllu$51n$1@bandai.magma-net.pl> <esbv7t$7o$1@kujawiak.man.lodz.pl> <1172940339.25227.28.camel@qrnik> <escc9e$2h2$1@kujawiak.man.lodz.pl> <esd1k1$9bp$1@bandai.magma-net.pl> <esemb6$2r3$1@kujawiak.man.lodz.pl> <1173026771.18775.7.camel@qrnik> <esfchn$t5r$1@kujawiak.man.lodz.pl> <esgboi$8i2$2@bandai.magma-net.pl> <esi2kk$skh$2@kujawiak.man.lodz.pl> <esi6uk$4mt$1@bandai.magma-net.pl> <esmu4p$ii1$2@kujawiak.man.lodz.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.magma-net.pl!not-for-mail
From: Mariusz Lotko <imie.nazwisko@wp.pl>
Newsgroups: pl.comp.objects
Subject: Re: pl.comp.objects FAQ (Frequently Asked Questions and more)
Date: Wed, 07 Mar 2007 19:59:52 +0100
Organization: Magma Systemy Komputerowe
Lines: 133
Message-ID: <esn1nl$7q7$1@bandai.magma-net.pl>
References: <pl-comp-objects-faq-1-1166202604@ict.pwr.wroc.pl> <es6b6u$2ls$1@kujawiak.man.lodz.pl> <esbllu$51n$1@bandai.magma-net.pl> <esbv7t$7o$1@kujawiak.man.lodz.pl> <1172940339.25227.28.camel@qrnik> <escc9e$2h2$1@kujawiak.man.lodz.pl> <esd1k1$9bp$1@bandai.magma-net.pl> <esemb6$2r3$1@kujawiak.man.lodz.pl> <1173026771.18775.7.camel@qrnik> <esfchn$t5r$1@kujawiak.man.lodz.pl> <esgboi$8i2$2@bandai.magma-net.pl> <esi2kk$skh$2@kujawiak.man.lodz.pl> <esi6uk$4mt$1@bandai.magma-net.pl> <esmu4p$ii1$2@kujawiak.man.lodz.pl>
NNTP-Posting-Host: 192.168.21.22
Mime-Version: 1.0
X-Trace: bandai.magma-net.pl 1173293621 8007 192.168.21.22 (7 Mar 2007 18:53:41 GMT)
X-Complaints-To: usenet@news.magma-net.pl
NNTP-Posting-Date: Wed, 7 Mar 2007 18:53:41 +0000 (UTC)
User-Agent: KNode/0.10.4
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit