Article View: pl.comp.objects
Article #15745Re: pl.comp.objects FAQ (Frequently Asked Questions and more)
From: Mariusz Lotko
Date: Wed, 07 Mar 2007 18:59
Date: Wed, 07 Mar 2007 18:59
132 lines
7235 bytes
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-mailReferences:
<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