🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #15726

Re: Wartości i obiekty

#15726
From: Marcin 'Qrczak' Kowalczyk
Date: Sat, 10 Mar 2007 23:11
117 lines
7040 bytes
Dnia 10-03-2007, sob o godzinie 18:47 +0000, Sektor van Skijlen
napisał(a):

> > Jest jeszcze trzecia kategoria leżąca pomiędzy tymi dwiema:
> > wskaźniki na singletony, czyli na jedyne obiekty danego rodzaju,
> > np. true / false / nil. Te obiekty są niezmienialne, ale tożsamość
> > tych obiektów jest dobrze zdefiniowana; rozróżnianie ich po tożsamości
> > jest równoważne rozróżnianiu po cechach wewnętrznych.
> 
> Nie tworzyłbym specjalnej kategorii dla tych obiektów.

Zwykle można je traktować razem z wartościowymi. Różnica objawia
się tylko wtedy, kiedy w języku mamy do dyspozycji operację jawnie
porównującą dwa obiekty po tożsamości. Tę operację można uznać za
niskopoziomową i rzadko się jej wprost używa, ale w wielu językach
jest dostępna, bo może być tańsza od domyślnego porównania, a dla
pewnego zbioru obiektów jest mu równoważna (Lisp: EQ, Scheme: eq?,
Python: is, Kogut: Is, OCaml: ==). Na przykład w Pythonie porównanie
"x is None" jest praktyczne, a "x is 5" nie jest.

> > Jeśli spróbować dopasować do tego modelu C++, to się okaże, że zmienną
> > C++ zawierającą obiekt można rozumieć na dwa sposoby:
> 
> > a) Jako zmienialny obiekt, przywiązany na stałe do swojej nazwy.
> >    To tłumaczenie jest odpowiednie w przypadku obiektów z tożsamością,
> >    zwłaszcza złożonych, bo pozwala wymodelować możliwość zmiany
> >    indywidualnych pól obiektu z zachowaniem tożsamości całego obiektu.
> >    Takie obiekty są zwykle przekazywane przez referencje C++ albo
> >    wskaźniki C++, co odpowiada przekazaniu wskaźnika na obiekt
> >    w modelu, a więc odpowiada naturalnemu sposobowi przekazania
> >    wartości w modelu.
> 
> > b) Jako zmienną zawierającą wartość, która sama jest niezmienialna.
> >    To tłumaczenie jest lepsze dla atomowych typów wartościowych,
> >    bo pozwala wymodelować wartość wyabstrahowaną od miejsca
> >    przechowywania. Takie obiekty są w C++ zwykle kopiowane,
> >    co odpowiada przekazaniu odczytanej bieżącej wartości zmiennej
> >    w modelu, czyli znowu jest naturalnym sposobem przekazania wartości,
> >    mimo że w C++ jest inne niż tamto.
> 
> Szczerze mówiąc to nic z tego nie rozumiem.

Bo opisałem odpowiedniki zmiennej w C++ językiem (ludzkim)
przystosowanym do opisywania innych języków (programowania).
Jesteś przyzwyczajony do języka (ludzkiego) przystosowanego
do opisywania C++.

Jeśli w C++ mamy zmienną zawierającą obiekt udostępniający jakieś metody
(w tym metody zmieniające jego stan), to w innym języku odpowiednik tej
konstrukcji wygląda z reguły na jeden z dwóch sposobów, zależnie od
stylu, w jakim przeważnie wygodnie jest używać obiektów danego typu:

a) Typowy przykład: tablica.

   Zmienna wskazuje na obiekt udostępniający analogiczne operacje jak
   w C++. Obiekt jest tworzony na stercie. Do tej zmiennej nie jest
   nigdy przypisywany wskaźnik na inny obiekt.

   Tam, gdzie w C++ obiekt jest przekazywany przez referencję, w innym
   języku przekazywana jest wartość tej zmiennej (wskazująca na ten
   obiekt). Tam, gdzie w C++ obiekt jest przekazywany przez wartość,
   w innym języku obiekt jest klonowany (czymś w rodzaju metody Clone).

b) Typowy przykład: liczba.

   Zmienna wskazuje na niezmienialny obiekt innego języka reprezentujący
   bieżący stan obiektu C++. Metodom C++, które zmieniały stan obiektu,
   odpowiadają operacje zwracające nowy obiekt, który jest przypisywany
   z powrotem tej zmiennej.

   Tam, gdzie w C++ obiekt jest przekazywany przez wartość, w innym
   języku przekazywana jest bieżąca wartość zmiennej. Tam, gdzie
   w C++ obiekt jest przekazywany przez referencję, w innym języku
   przekazywana jest referencja na zmienną.

> String zawsze powinien być traktowany jak wartość, natomiast wektor zawsze
> jak obiekt.

Zgodzę się, że zazwyczaj. Nie zgadzam się, że zawsze.

A wektor znaków? Z jednej strony to jest wektor. Z drugiej strony to
jest w zasadzie to samo, co string. Różnice są w dodatkowych metodach,
ale one są raczej poboczne, nie wpływają na istotę rzeczy.

> > Pisałem tutaj o zmienialnym stringu, zakładając, że to jest jedyny
> > string w danym języku. Czyli kiedy złożony typ pełniący rolę typu
> > wartościowego jest jednak zmienialny. Taka sytuacja jest kłopotliwa.
> 
> Oj... nie bardzo to widzę.

No i właśnie mówię, że to jest kłopotliwe. Lepiej tego unikać.

W to C++ pasuje. W Perlu też; to jest jeden z nielicznych języków
(obok Pascala, C i C++), który kopiuje zawartość stringa przy
przypisaniu, choć przy przekazaniu jako argument funkcji formalnie
już nie (ale w praktyce zwykle tak, bo większość funkcji zaczyna się
od skopiowania argumentów do osobnych lokalnych zmiennych - specyfika
Perla).

Przykłady języków, które mają wyłącznie zmienialne stringi mimo
paradygmatu, który do tego nie pasuje: Lisp, Scheme, OCaml, Ruby
(czasem są zmienialne łącznie ze zmianą długości, a czasem nie).

> > Mój model w wersji czystej wymaga zdecydowania się, który styl użycia
> > jest tutaj dominujący. Pomieszanie styli grozi błędami aliasowania albo
> > niepotrzebnymi kopiami.
> 
> No właśnie - ale nie możesz zrobić tak, że w całym języku jeden model
> obowiązuje wszystkie obiekty.

Oczywiście, tego nie proponowałem. Byle był ustalony styl dla danego
typu.

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak@knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/
Technical Details
Message-ID: <1173568302.9234.25.camel@qrnik>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!newsfeed.atman.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
References: <pl-comp-objects-faq-1-1166202604@ict.pwr.wroc.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> <eses6u$8fm$1@inews.gazeta.pl> <esf3am$r52$1@bandai.magma-net.pl> <esfg25$b2m$1@kujawiak.man.lodz.pl> <1173137761.17765.52.camel@qrnik> <esmtmk$ii1$1@kujawiak.man.lodz.pl> <1173310324.15622.77.camel@qrnik> <esuufm$jfv$1@kujawiak.man.lodz.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!newsfeed.atman.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
From: Marcin 'Qrczak' Kowalczyk <qrczak@knm.org.pl>
Newsgroups: pl.comp.objects
Subject: Re: Wartości i obiekty
Date: Sun, 11 Mar 2007 00:11:42 +0100
Organization: tp.internet - http://www.tpi.pl/
Lines: 172
Message-ID: <1173568302.9234.25.camel@qrnik>
References: <pl-comp-objects-faq-1-1166202604@ict.pwr.wroc.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>  <eses6u$8fm$1@inews.gazeta.pl> <esf3am$r52$1@bandai.magma-net.pl>  <esfg25$b2m$1@kujawiak.man.lodz.pl> <1173137761.17765.52.camel@qrnik>  <esmtmk$ii1$1@kujawiak.man.lodz.pl> <1173310324.15622.77.camel@qrnik>  <esuufm$jfv$1@kujawiak.man.lodz.pl>
NNTP-Posting-Host: paf87.warszawa.sdi.tpnet.pl
Mime-Version: 1.0
X-Trace: nemesis.news.tpi.pl 1173568541 14140 217.96.225.87 (10 Mar 2007 23:15:41 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Sat, 10 Mar 2007 23:15:41 +0000 (UTC)
In-Reply-To: <esuufm$jfv$1@kujawiak.man.lodz.pl>
X-Mailer: Evolution 2.8.3 PLD Linux
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit