🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #15746

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

#15746
From: Sektor van Skijlen
Date: Sat, 10 Mar 2007 19:17
206 lines
10732 bytes
Dnia Wed, 07 Mar 2007 19:59:52 +0100, Mariusz Lotko skrobie:
> 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".

Nie używaj pojęć, których znaczenia nie rozumiesz.

Swiss army knife to by było, gdyby ten portfel mógł przechowywać pieniądze,
laptopy, meble, samochody, kontenery i elektrownie.

Ilość pieniędzy nie jest wartością portfela. Jest jego stanem. Portfel nie
może mieć wartości - i to nie dlatego, że poza tym może mieć jeszcze wiele
innych stanów i atrytbutów.

> > 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.

Nie przypominam sobie, żebym mówił o lakierze samochodowym. Mówiłem o kolorze.
Kolor może być również atrybutem (a nie wartością, acz przypadkiem też nie
stanem) lakieru.

No to jak, zrozumiałeś już, co to takiego jest wartość, czy douczysz się i
zgłosisz za tydzień?

> >> 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ę...

W operatorze przypisania.

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

> W pewnych przypadkach może tak być.

Statystycznie jest to 99% przypadków.

> Implementując operator warto
> oszacować prawdopodobieństwo porównywania tych samych obiektów.

Zrób sobie małą statystykę użycia takiego typu i ilość porównań, dla których
trafiasz na równość i dla których trafiasz na nierówność.

Prosty przykład - iteratory. Masz pętlę, w której przechodzisz przez wszystkie
iteratory w zakresie od jednego do drugiego. Ile masz w tym momencie porównań,
które wyjdą równe, a ile, które wyjdą nierówne? Tu policzyć bardzo łatwo:

Dla zakresu o długości N, będziesz miał N-1 porównań, które się okażą
nierównością, i jedno, które okaże sie równością. Różnica rośnie wraz z
długością zakresu i tylko w przypadku gdy zakres ma 1 element porównanie jest
szybsze. Dla dwóch elemmentów jest już mniej więcej tak samo kosztowne, wraz z
powiększaniem się długości zakresu porównanie, które najpierw sprawdza
tożsamość, jest kosztowniejsze.

Podałem ci tylko przykład, jak należy prowadzić taką analizę - to, że ten
przykład jest negatywny dla twojej tezy, nie ma znaczenia. Myślę, że dałoby
się znaleźć przykład, który by twoją tezę potwierdzał, ale to nie ma większego
znaczenia.

W odróżnieniu od ciebie jednak, ja rozumiem konieczność wykonania analizy,
która dowiedzie, czy to się nam opłaca, czy nie. Ty przyjmujesz "w ciemno", że
sprawdzanie najpierw tożsamości będzie zawsze bardziej opłacalne. W
ostateczności zgadzasz się nawet, że "najczęściej".

No to podaj mi przykład typu wartościowego, w którym to się opłaca, i oszacuj
ilość porównań trafionych i nietrafionych w typowych algorytmach, które go
używają. Wtedy będziemy wiedzieli, o czym rozmawiamy.

> Generalnie jednak - nie zgadzam się.

Ależ masz pełne prawo się nie zgadzać. Ja w odróżnieniu od ciebie potrafię to
uzasadnić.

> >> >> > 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ł?

Oczywiście teoretycznie może istnieć taki wzorzec, który typom nie stawia
żadnych wymagań, ale w praktyce nie spotkałem się z takim.

Wymagania co do typów zawsze określają poszczególne operacje, które na typie
można wykonać. I te operacje świadczą też o tym, czy typ jest wartościowy, czy
nie.

Przykładowo, typ przechowywany w std::list musi być typem wartościowym.
Niestety, tak jest skonstruowany szablon std::list. Świadczą o tym następujące
wymagania względem typu:
 - przypisywalny
 - kopiowalny
 - domyślnie-konstruowalny

Poza tym wiele algorytmów STL, które mogłyby pracować również na zakresie
wziętym z listy, wymagają dodatkowo, żeby był porównywalny.

Dostarczając do swojego typu wszystkie możliwe rzeczy, żeby spełnić wymagania,
de facto czynisz z niego typ wartościowy - co może się niekoniecznie zgadzać z
logiką twojego programu.

> >> > 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.

Nic nie zależy od żadnego kontekstu.

Saldo jest stanem (cząstkowym) konta. Saldo jest wartością. Konto jest
obiektem.

> Możemy nie wiązać obiektów transakcji do
> konta, a zrobić wiązanie odwrotne: każda transakcja ma referencję do konta.

Ale co to ma do rzeczy?

Transakcja też jest obiektem, tzw. "wartość transakcji" jest atrybutem obiektu
transakcji, a ilość pieniędzy, na którą opiewa transakcja, jest wartością.

> I podobnie z właścicielem. Krótko mówiąc "konto jest anonimowe" i
> przechowuje jedynie swoje saldo (wartość) oraz numer (tożsamość).

Numer jest atrybutem obiektu (unikalnym, więc jest ściśle związany z
tożsamością), właściciel też jest obiektem (w bazie banku jest osobnym
obiektem, który może być podmapowany do kilku kont). Saldo jest stanem konta,
a wartość salda to ilość pieniędzy znajdujących się na koncie.

> Nie wiem, czy to ma sens, ale nie możesz chyba wykluczyć, że w jakimś
> tam systemie może mieć.

Niestety nie. Przykro mi.

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

> Element ze zbioru (tu: typ, klasa).

To znaczy?


-- 
//  _    ___         Michal "Sektor" Malecki <sektor(whirl)kis.p.lodz.pl>
\\ L_ |/ `|  /^\ ,()                         <ethouris(O)gmail.com>
// \_ |\  \/ \_/ /\ C++ bez cholesterolu: http://www.intercon.pl/~sektor/cbx
"Java is answer for a question that has never been stated"
Technical Details
Message-ID: <esv08v$o5d$1@kujawiak.man.lodz.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!news.man.lodz.pl!not-for-mail
References: <pl-comp-objects-faq-1-1166202604@ict.pwr.wroc.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> <esn1nl$7q7$1@bandai.magma-net.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!news.man.lodz.pl!not-for-mail
From: Sektor van Skijlen <ethouris@guess.if.gmail.com.is.valid.or.invalid>
Newsgroups: pl.comp.objects
Subject: Re: pl.comp.objects FAQ (Frequently Asked Questions and more)
Date: Sat, 10 Mar 2007 19:17:51 +0000 (UTC)
Organization: LODMAN - Metropolitan Area Network in LODZ, Poland
Lines: 206
Sender: Michal Malecki <sektor@zly.kis.p.lodz.pl>
Message-ID: <esv08v$o5d$1@kujawiak.man.lodz.pl>
References: <pl-comp-objects-faq-1-1166202604@ict.pwr.wroc.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> <esn1nl$7q7$1@bandai.magma-net.pl>
NNTP-Posting-Host: zly.kis.p.lodz.pl
Mime-Version: 1.0
X-Trace: kujawiak.man.lodz.pl 1173554271 24749 212.191.89.2 (10 Mar 2007 19:17:51 GMT)
X-Complaints-To: abuse@man.lodz.pl
NNTP-Posting-Date: Sat, 10 Mar 2007 19:17:51 +0000 (UTC)
User-Agent: tin/1.6.2-20030910 ("Pabbay") (UNIX) (SunOS/5.9 (sun4u))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit