Здравствуйте, samius, Вы писали: S>Словами: идентичность — это такое свойство объекта, которое позволяет отличать его от остальных.
Это правильно. S>Опровергнуть идентичность можно следующими способами — сравнить поведение объектов. Если изменение состояния одного объекта не приводит к изменению состояния другого — объекты не идентичны. Если такие отличия не могут быть найдены, то это свидетельствует об идентичности, но быть уверенным что они идентичны нельзя.
Это — нет. Вы берёте базовое свойство ООП-модели и начинаете выражать его через другие два свойства, которые на самом деле от него зависят.
Вы почти всё понимаете правильно, кроме одного: идентичность обеспечивается в ООП независимым от поведения и состояния способом.
Всё. Точка.
Способов реализации этой идентичности — масса.
В системах с persistent storage в качестве identity используют OID — явный идентификатор, присущий любому объекту.
По OID всегда можно понять, идёт ли речь об одном и том же объекте, или нет, безо всяких апелляций к его поведению (которое может быть сейчас вообще недоступно, если объект offline).
В системах с flat моделью памяти и неперемещаемыми объектами в качестве identity можно использовать адрес объекта.
В системах типа COM для обеспечения идентичности приходится делать специальные приседания — QueryInterface для IUnknown.
Ссылочную эквивалентность можно использовать для идентичности в том случае, если соблюдаются определённые требования к ссылкам. В частности, в Java и .Net эти требования соблюдаются. В COM — нет.
Вообще, в целом, ссылка отличается от identity тем, что ссылку можно гарантированно разрешить, то есть выполнить dereference.
Identity нам такой возможности давать не обязана.
Из определения ссылки следует, что из ссылочной эквивалентности следует идентичность — ссылка однозначно определяет объект.
То есть у двух разных объектов гарантированно разные ссылки.
S>Ты можешь показать их неидентичность не используя сравнение ссылок? ПОчему ты вообще используешь ссылки для определения идентичности? На каком формальном основании? Где в определении идентичности ссылки? Почему ты ссылку считаешь свойством объекта?
Если хочется экспериментов с идентичностью в .Net, можно невиртуально вызвать object.GetHashCode() на двух "одинаковых" строках. Его реализация как раз возвращает различные int-ы для различных объектов
Но в целом, рекомендую перестать спорить с очевидным. В .Net идентичность через ссылочную эквивалентность принята по определению. Она лучше, чем предлагаемая "логическая идентичность" (которую в .Net называют просто "эквивалентностью") потому, что работает для всех объектов, а не только для immutable.
S>Существование отличий в поведении дает логическую неидентичность. Показать тебе все способы нахождения отличий?
Неэквивалентность. S>Логическая определяется через поведение объекта, а не через ссылку. Проверять всевозможное поведение объекта слишком муторно для форума.
Предлагаю вместо новоизобретённого термина "логическая идентичность" использовать общепонятный "эквивалентность поведения". В отличие от "логической идентичности", любое определение которой будет оксюмороном, этот термин легко определить формально.
Два объекта будут поведенчески эквивалентны, если их реакция на любое сообщение будет одинаковой.
Через эквивалентность поведения выражается понятие состояния — два поведенчески эквивалентных объекта будут находиться в одном состоянии. Напомню, что напрямую наблюдать состояние объекта в ООП нельзя — это чёрный ящик.
Эквивалентность поведения нельзя использовать для идентичности — это отдельное отношение эквивалентности, и оно разбивает объекты на другие классы эквивалентности.
S>Их не я придумал. Есть несколько источников, где эти вещи описаны. Отрицай существование этих источников.
Пока что ни один источник приведён не был. Было приведено неправильное толкование статьи из википедии.
G>>Я его отбрасываю потому что оно неформализуемо. S>Оно формализуемо. Неформализуемо следствие по которому существует лишь физическая идентичность.
G>>Вообще странно ты пытаешься поступить. Есть вполне формальное определение identity — отличить объект от всех остальных, для этого в C# например еcть Object.ReferenceEquals, который как-бы говорит нам о сравнении ссылок. S>ReferenceEquals для сравнения ссылок, он не определяет идентичность формально. В нескольких источниках написано что неравенство ссылок не приводит к различным идентичностям. Оспаривай эти источники.
S>Скажи что все мои источники нагло врут, либо я их неверно понимаю. На этом закончим.
Неверно понимаете.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
S>What makes up the identity of an object in an object-oriented system? A common answer is "object identity" is defined by being in the same spot in memory, which is called "reference equality" and matches Java's == operator. A consequence of this situation is if two objects are identical, a change to one will always affect the other. This distinguishes identity from the notion of "being equal," which can change over time. In fact, multiple notions of being equal are possible, such as String.equals() and String.equalsIgnoreCase().
S>Using reference equality as the only notion of object identity seems a good solution at first, but unfortunately this point of view is a little naive.
И? Я вижу здесь только подтверждение моим словам. Нет никаких упоминаний "логической идентичности" vs "физической идентичности".
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
A consequence of this situation is if two objects are identical, a change to one will always affect the other.
S>И? Я вижу здесь только подтверждение моим словам. Нет никаких упоминаний "логической идентичности" vs "физической идентичности".
Отвечу сначала на это, потому как это быстро.
class Monostate
{
static int a;
public int A { get { return a; } set { a = value; } }
}
var a = new Monostate();
var b = new Monostate();
a.A = 42;
Assert(42 == b.A);
Нет способа изменить лишь один из них. Они удовлетворяют процитированному. Т.е. согласно процитированному являются идентичными.
Здравствуйте, samius, Вы писали:
S>Я не могу это опровергнуть, могу лишь дать ссылку на статью, автор которой не я http://c2.com/cgi/wiki?ObjectIdentity S>Со своей стороны могу сказать что то что логическую идентичность выдумал я, выдумали лично вы.
S>>Больше им не пользуется никто. Все остальные отличают идентичность от иных видов эквивалентности. S>Как минимум автор указанной статьи им пользуется. Вы не можете игнорировать существование этой и других статей, к которым я непричастен.
А вы не обратили внимание, что во фрагменте Ричарда Хендерсона речь идёт о базах данных, а не об ООП?
У него "логически идентичными" называются те "объекты" (не в смысле ООП, а в более широком смысле), которые имеют т.н. value-семантику. В частности, для них главной является эквивалентность состояния. С точки зрения строгой теории, никакой идентичности у них нет.
S>>Идентичность — это такое отношение эквивалентности, при котором объект эквивалентен себе и не эквивалентен больше никакому другому объекту. S>Это ниоткуда не следует.
Правильно, потому что это определение.
S>Не уверен в этом. Классические определения, данные до появления кома, допускают логическую эквивалентность.
Напримеру, какие?
S>Я говорил о том что логическая идентичность не ведет к ссылочной эквивалентности. Физическая идентичность ведет к любым эквивалентностям в силу рефлексивности.
А я говорил о том, что никакой "логической идентичности" в ООП нет. Та "логическая идентичность", на которую вы ссылаетесь, в ООП не применяется. Она применяется для value-типов, которые ведут себя не так, как объекты.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, samius, Вы писали:
G>Ты сам приводишь все нужные ссылки. Только выводы делаешь неправильные.
Я уверен в своей правоте. Словами о неправильных выводах меня не убедить.
S>>Опровергнуть идентичность можно следующими способами — сравнить поведение объектов. G>Identity не зависит от поведения и состояния.
G>
G>object identity — a characteristic of an object that provides a means to uniquely denote or refer to the object independent of its state or behavior
G>Сам же приводил.
Верно не зависит. Изменение состояния и поведение объекта не изменяет его идентичность. Фраза об этом. Потому изменив состояние одного объетка и не увидев изменения другого объекта можно опровергнуть их идентичность.
S>>Дай определение идентичности, которому ты доверяешь. G>http://www.objectarchitects.de/ObjectArchitects/orpatterns/index.htm?OID/index.htm G>всем трем доверяю, причем одновременно, а не по-отдельности.
Я не вижу как оттуда вытекает лишь физический аспект идентичности.
G>>>Да нет, меня как раз интересует твое понимание идентичности. S>>Выше G>Оно неверно
В чем его отличие от тех, которым ты доверяешь?
G>>>Ну, ты сделаешь два экивалентных, но не идентичных объекта. S>>Ты можешь показать их неидентичность не используя сравнение ссылок? G>Нет, потому что ссылка и есть identity. Ты можешь показать другое — показывай. Формально, кодом.
Где об этом сказано? Вот синклер написал что разные ссылки могут ссылаться на один объект. В таком случае идентичность этого объекта самому себе будет опровергнута.
S>>ПОчему ты вообще используешь ссылки для определения идентичности? На каком формальном основании? Где в определении идентичности ссылки? Почему ты ссылку считаешь свойством объекта? G>В концептуальном определении их нет, но реализация identity во всех известных мне языках с поддержкой ООП опирается на ссылки в том или ином виде. Вообще слабо себе представляю ООП без ссылок.
Это не проблемы концепции. Допустим, в некой реализации ссылки нельзя сравнивать. Ты скажешь что это не ООП на том основании что в известных тебе реализациях это не так?
S>>Существование отличий в поведении дает логическую неидентичность. Показать тебе все способы нахождения отличий? G>Идентичность не зависит от поведения. Отличия в поведении — неидентичны. Зачем разделять на физическую и логическую?
Идентичность не зависит от поведения, но опираясь на наблюдаемое поведение можно опровергнуть логическую идентичность двух объектов.
S>>Логическая определяется через поведение объекта, а не через ссылку. Проверять всевозможное поведение объекта слишком муторно для форума. G>Идентичность не зависит от поведения. Совпадения поведения в некотором смысле, который ты заранее задаешь, дает эквивалентность, а не идентичность.
Эквивалентность можно построить на чем угодно, удовлетворив выполнение свойств отношения эквивалентности.
S>>Их не я придумал. Есть несколько источников, где эти вещи описаны. Отрицай существование этих источников. G>Да пусть хоть на каждом шагу написано, но оно не становится от этого формализуемым, ты не можешь доказать что что-то есть, следовательно этого нет.
Ты не можешь доказать физическую идентичность. Следовательно ее нет?
S>>Это ссылочная эквивалентность а не идентичность. Из нее следует физическая идентичность. Из физической идентичности следует ссылочная эквивалентность. Но это не одно и то же. Понятия разные, но наблюдаются они у объекта одновременно. Смотри определения. G> G>Если A -> B && B -> A, то A == B, это формальная логика, можешь с ней не спорить.
Нет такой логики. Есть такая:
A => B && B => A, то A <=> B (читается тогда и только тогда) не путай их. Не делает чести.
G>Ты только что доказал что совпадение ссылок есть "физическая идентичность", теперь осталось выяснить чем логическая идентичность отличается от физической идентичности.
Тем что она не опирается на расположение в памяти.
G>Для этого просто приведи код, где будет "логическая идентичность" как некоторое выражение, возвращающее true для двух объектов, но не будет "физической идентичности" (равенства ссылок). Ну и естественно это должно быть выражение для любого типа, а не для какого-то класса.
С чего бы для любого типа? Для конкретного типа — пожалуйста
class Monostate
{
static int a;
public int A { get { return a; } set { a = value; } }
}
var a = new Monostate();
var b = new Monostate();
a.A = 42;
Assert(42 == b.A);
Только как ты не можешь доказать физическую идентичность объекта самому себе, так и я не смогу доказать логическую идентичность a и b. Тем не менее, я их считаю их идентичными согласно определению.
S>>Если для тебя это треп, то давай завязывать. Я тебе уже устал повторять, что доказать идентичность даже объекта самому себе кодом невозможно. Формально определение идентичности ссылается на свойства, которые позволяют отличать объекты друг от друга. G>Я просто поверю создателям языка что Object.ReferenceEquals — сравнивает identity. Причем ссылки, которые сравниваются, вполне соответствуют всем трем определениям отсюда.
Это не доказательство идентичности кодом. Ты оперируешь кучей допущений, сделанными создателями платформы. Что у объектов есть ссылки, что ссылки можно сравнивать, что из равенства ссылок следует что объекты расположены по одному адресу, что объекты, расположенные по одному адресу не могут обладать свойствами, отличающими их друг от друга.
Что будешь делать если ссылки сравнить нельзя, либо как подметил Ikemefula, если две неравные ссылки ссылаются на один объект и из неравенства ссылок не следует неидентичность?
G>А ты, если не веришь, попробуй доказать обратное. G>Одним написанием определений ты ничего не докажешь. Нужен код.
Ты не написал код, убеждающий в идентичности объекта самому себе строго
S>>Докажи идентичность объекта самому себе кодом, что бы сошлось с определением. G>Идентичность не нужно доказывать, она или есть, или нет. Это неотъемлемое свойство объекта.
Тогда не проси с меня код G>Идентичность и позволяет отличить объект от других, то есть id(a) == id(b) только когда a и b это один и тот же объект.
Это выдумка, которая не следует из определения идентичности. В частности в определении не упоминается "один и тот же".
G>>>Концептуально — ниоткуда, а в контретной реализации ООП — очень даже понятно откуда. Других реализаций ООП не видел. S>>Это не значит, что других реализаций не может быть. G>Приведи реализацию, я склонен считать что если в программировании что-то невозможно сделать в коде, то этого просто нет. Программирование не требует затрат больших энергии на проведение эксперимента.
Мне необязательно доказывать тебе возможность существования другой реализации конкретным примером. Хотя ключ я уже дал. Представь себе ООП систему, где невозможно сравнение ссылок либо убеди себя что такой не может существовать.
G>>>Я его отбрасываю потому что оно неформализуемо. S>>Оно формализуемо. G>Так приведи код, который проверит "логическую идентичность".
Приведи код, который проверит физическую идентичность формально, а не по ReferenceEquals.
G>Уже писали про это: наприемр если взять указатель на область памяти или на COM объект, то он может иметь разные адреса при указании на один объект, но в любом случае существует "инвариантный" указатель, который будет совпадать. Вот этот инвариантный указатель можно считать ссылкой в общем (в математическом понимании). Ссылки в C# инварианты, и внутрь залезть нельзя.
Это частный случай с COM, который не исчерпывает широту определения. G>В соответствии с высказыванием ты утверждаешь что бывает так что Object.ReferenceEquals(a,b) == false, но это один и тот же объект.
Я такого не утвреждаю. G>Приведи пример языка где инвариантные ссылки не совпадают, но это один и тот же объект.
Это не обязательно. Я рассуждаю о концептуальной модели, а не о частной ее реализации.
S>>Я пользуюсь формальным определением. То что из него следует лишь физическая идентичность — не факт для меня. И еще раз — мопед не мой. Я указал как минимум 3 источника. Почему ты обвиняешь в придумывании и демагогии именно меня? G>Потому что ты опираешься на неформализуемое определение логической идентичности.
а ты пользуешься неформализуемым определением физической идентичности.
S>>Скажи что все мои источники нагло врут, либо я их неверно понимаю. На этом закончим. G>Во-ервых не все, во-вторых не врут, а заблуждаются или смешивают концепцию с деталями реализации.
Давай завязывать. Мы так ни к чему не придем, просто потратим время.
A consequence of this situation is if two objects are identical, a change to one will always affect the other.
S>>И? Я вижу здесь только подтверждение моим словам. Нет никаких упоминаний "логической идентичности" vs "физической идентичности".
S>Отвечу сначала на это, потому как это быстро. S>
S>class Monostate
S>{
S> static int a;
S> public int A { get { return a; } set { a = value; } }
S>}
S>var a = new Monostate();
S>var b = new Monostate();
S>a.A = 42;
S>Assert(42 == b.A);
S>
S>Нет способа изменить лишь один из них. Они удовлетворяют процитированному. Т.е. согласно процитированному являются идентичными.
Нет, не являются.
Исходое выражение : если А, то Б, где А — идентичность двух объектов, Б — изменение свойств отражающееся на обоих.
В логике "если x, то y" называют импликацией.
Она верна в том числе когда А — ложно и Б — истинно. В коде выше именно Б истинно, но А ложно.
Но импликация ложна, когда посылка истинна, а следствие ложно. То есть выражение вида "если изменения одного объекта влияют на другой, то они эквивалентны" ложно.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, samius, Вы писали: S>>Опровергнуть идентичность можно следующими способами — сравнить поведение объектов. Если изменение состояния одного объекта не приводит к изменению состояния другого — объекты не идентичны. Если такие отличия не могут быть найдены, то это свидетельствует об идентичности, но быть уверенным что они идентичны нельзя. S>Это — нет. Вы берёте базовое свойство ООП-модели и начинаете выражать его через другие два свойства, которые на самом деле от него зависят. S>Вы почти всё понимаете правильно, кроме одного: идентичность обеспечивается в ООП независимым от поведения и состояния способом. S>Всё. Точка.
С этим согласен. Но я не вижу, что я понял неправильно. Я показал как можно доказать неидентичность объектов, исходя из этого свойства идентичности.
S>Способов реализации этой идентичности — масса. S>В системах с persistent storage в качестве identity используют OID — явный идентификатор, присущий любому объекту.
Это не относится к OO идентичности. S>По OID всегда можно понять, идёт ли речь об одном и том же объекте, или нет, безо всяких апелляций к его поведению (которое может быть сейчас вообще недоступно, если объект offline).
тоже. S>В системах с flat моделью памяти и неперемещаемыми объектами в качестве identity можно использовать адрес объекта.
это верно S>В системах типа COM для обеспечения идентичности приходится делать специальные приседания — QueryInterface для IUnknown.
да.
Но формально по определению — если найдется свойство объекта, которое будет его отличать от другого, они будут неидентичны. ссылка не является свойством объекта.
S>Ссылочную эквивалентность можно использовать для идентичности в том случае, если соблюдаются определённые требования к ссылкам. В частности, в Java и .Net эти требования соблюдаются. В COM — нет.
Для определения физической идентичности можно (не в COM).
На COM предлагаю забить, потому как с ним явно оговорено, что ссылочная эквивалентность у него по IUnknown. Учитывая это он ведет себя вполне ожидаемо и соответственно объеткам в других популярных языках/платформах.
S>Вообще, в целом, ссылка отличается от identity тем, что ссылку можно гарантированно разрешить, то есть выполнить dereference. S>Identity нам такой возможности давать не обязана.
Верно. S>Из определения ссылки следует, что из ссылочной эквивалентности следует идентичность — ссылка однозначно определяет объект.
Ссылочная эквивалентность налагает дополнительное требование к концепции — существование ссылок и возможность проверить их эквивалентность, из которой должно следовать что объекты находятся по одному адресу и не могут обладать свойствами, отличающими их друг от друга. Слишком много допущений. S>То есть у двух разных объектов гарантированно разные ссылки.
Это верно. Но это не вытекает из определения идентичности.
S>>Ты можешь показать их неидентичность не используя сравнение ссылок? ПОчему ты вообще используешь ссылки для определения идентичности? На каком формальном основании? Где в определении идентичности ссылки? Почему ты ссылку считаешь свойством объекта? S>Если хочется экспериментов с идентичностью в .Net, можно невиртуально вызвать object.GetHashCode() на двух "одинаковых" строках. Его реализация как раз возвращает различные int-ы для различных объектов
Не знал. Не буду проверять, но они могли бы вернуть один int. И что тогда?
S>Но в целом, рекомендую перестать спорить с очевидным.
Для меня очевидно другое S>В .Net идентичность через ссылочную эквивалентность принята по определению.
Можно определение, которое бы гарантировало идентичность через ссылочную экивалентность напрямую, а не через серию уточнений? S>Она лучше, чем предлагаемая "логическая идентичность" (которую в .Net называют просто "эквивалентностью") потому, что работает для всех объектов, а не только для immutable.
То что она лучше — это неважно.
S>>Существование отличий в поведении дает логическую неидентичность. Показать тебе все способы нахождения отличий? S>Неэквивалентность.
неидентичность. Как показать неэквивалентность я посмотрю у конкретного отношения эквивалентности.
S>Предлагаю вместо новоизобретённого термина "логическая идентичность" использовать общепонятный "эквивалентность поведения". В отличие от "логической идентичности", любое определение которой будет оксюмороном, этот термин легко определить формально.
Окей, я согласен заменить логическую идентичность на эквивалентность поведения. Этот термин хорошо отражает суть. Но надо заметить что формально "эквивалентность поведения" подпадает под определение идентичности. Иначе — мы будем подразумевать что-то разное.
S>Два объекта будут поведенчески эквивалентны, если их реакция на любое сообщение будет одинаковой.
Это определение не годится. Нужно такое: если невозможно найти свойства, отличающие их
S>Через эквивалентность поведения выражается понятие состояния — два поведенчески эквивалентных объекта будут находиться в одном состоянии. Напомню, что напрямую наблюдать состояние объекта в ООП нельзя — это чёрный ящик.
Согласен
S>Эквивалентность поведения нельзя использовать для идентичности — это отдельное отношение эквивалентности, и оно разбивает объекты на другие классы эквивалентности.
Другое чем физическая идентичность — согласен. Но оно вытекает из определения идентичности.
S>>Их не я придумал. Есть несколько источников, где эти вещи описаны. Отрицай существование этих источников. S>Пока что ни один источник приведён не был. Было приведено неправильное толкование статьи из википедии.
их все можно обвинить в неправильном толковании википедии
Но по-моему налицо повсеместное неправильное толкования определения идентичности.
S>>Скажи что все мои источники нагло врут, либо я их неверно понимаю. На этом закончим. S>Неверно понимаете.
По-моему вы неверно понимаете.
На этом можно закруглиться.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, samius, Вы писали:
S>>>Больше им не пользуется никто. Все остальные отличают идентичность от иных видов эквивалентности. S>>Как минимум автор указанной статьи им пользуется. Вы не можете игнорировать существование этой и других статей, к которым я непричастен. S>А вы не обратили внимание, что во фрагменте Ричарда Хендерсона речь идёт о базах данных, а не об ООП? S>У него "логически идентичными" называются те "объекты" (не в смысле ООП, а в более широком смысле), которые имеют т.н. value-семантику. В частности, для них главной является эквивалентность состояния. С точки зрения строгой теории, никакой идентичности у них нет.
Я нахожу что его логическая идентичность вписывается в определение идентичности.
S>>>Идентичность — это такое отношение эквивалентности, при котором объект эквивалентен себе и не эквивалентен больше никакому другому объекту. S>>Это ниоткуда не следует. S>Правильно, потому что это определение.
S>>Не уверен в этом. Классические определения, данные до появления кома, допускают логическую эквивалентность. S>Напримеру, какие?
например, эти http://www.objectarchitects.de/ObjectArchitects/orpatterns/index.htm?OID/index.htm
S>>Я говорил о том что логическая идентичность не ведет к ссылочной эквивалентности. Физическая идентичность ведет к любым эквивалентностям в силу рефлексивности. S>А я говорил о том, что никакой "логической идентичности" в ООП нет. Та "логическая идентичность", на которую вы ссылаетесь, в ООП не применяется. Она применяется для value-типов, которые ведут себя не так, как объекты.
То что value не объекты, вы не смогли меня убедить весной.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, samius, Вы писали:
S>>>>
A consequence of this situation is if two objects are identical, a change to one will always affect the other.
S>>>И? Я вижу здесь только подтверждение моим словам. Нет никаких упоминаний "логической идентичности" vs "физической идентичности".
S>>Нет способа изменить лишь один из них. Они удовлетворяют процитированному. Т.е. согласно процитированному являются идентичными.
G>Нет, не являются.
G>Исходое выражение : если А, то Б, где А — идентичность двух объектов, Б — изменение свойств отражающееся на обоих. G>В логике "если x, то y" называют импликацией. G>Она верна в том числе когда А — ложно и Б — истинно. В коде выше именно Б истинно, но А ложно.
G>Но импликация ложна, когда посылка истинна, а следствие ложно. То есть выражение вида "если изменения одного объекта влияют на другой, то они эквивалентны" ложно.
Верно. Прошу прощения. запутался. Искренне благодарю за внимательность.
Но вот следствие из википедии
The object identity of two objects of the same type is the same, if every change to either object is also a change to the other object.
согласно ему a и b идентичны. Верно? Да и ссылка на same type есть, т.е. для любого типа это не надо показывать.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, samius, Вы писали:
G>>Ты сам приводишь все нужные ссылки. Только выводы делаешь неправильные. S>Я уверен в своей правоте. Словами о неправильных выводах меня не убедить.
Но это не делает тебя правым
S>>>Опровергнуть идентичность можно следующими способами — сравнить поведение объектов. G>>Identity не зависит от поведения и состояния.
G>>
G>>object identity — a characteristic of an object that provides a means to uniquely denote or refer to the object independent of its state or behavior
G>>Сам же приводил. S>Верно не зависит. Изменение состояния и поведение объекта не изменяет его идентичность. Фраза об этом. Потому изменив состояние одного объетка и не увидев изменения другого объекта можно опровергнуть их идентичность.
Так опровергни идентичность объектов для которых object.ReferenceEquals(a,b) == true, если ты утверждаешь что object.ReferenceEquals не является выражением идентичности.
S>>>Дай определение идентичности, которому ты доверяешь. G>>http://www.objectarchitects.de/ObjectArchitects/orpatterns/index.htm?OID/index.htm G>>всем трем доверяю, причем одновременно, а не по-отдельности. S>Я не вижу как оттуда вытекает лишь физический аспект идентичности.
Нету отдельно физического и логического аспекта, ты их выдумал.
G>>>>Да нет, меня как раз интересует твое понимание идентичности. S>>>Выше G>>Оно неверно S>В чем его отличие от тех, которым ты доверяешь?
Ты не привел формального определения.
G>>>>Ну, ты сделаешь два экивалентных, но не идентичных объекта. S>>>Ты можешь показать их неидентичность не используя сравнение ссылок? G>>Нет, потому что ссылка и есть identity. Ты можешь показать другое — показывай. Формально, кодом. S>Где об этом сказано?
Может и нигде, но object.ReferenceEquals позволяет отличить один объект от другого как раз с помощью ссылки. Именно это и можно принять за identity. И действительно, если object.ReferenceEquals(a,b) == true, то любое изменение a отразится на b.
S>Вот синклер написал что разные ссылки могут ссылаться на один объект. В таком случае идентичность этого объекта самому себе будет опровергнута.
Это зависит от реализации ссылки в языке, конкретно в C# ссылка и есть identity. А если в каком-то языке это не так, то там все равно есть способ получить некоторое инвариантное значение, которое мы и будем называть ссылкой. Например в БД это ключ записи.
S>>>ПОчему ты вообще используешь ссылки для определения идентичности? На каком формальном основании? Где в определении идентичности ссылки? Почему ты ссылку считаешь свойством объекта? G>>В концептуальном определении их нет, но реализация identity во всех известных мне языках с поддержкой ООП опирается на ссылки в том или ином виде. Вообще слабо себе представляю ООП без ссылок. S>Это не проблемы концепции. Допустим, в некой реализации ссылки нельзя сравнивать. Ты скажешь что это не ООП на том основании что в известных тебе реализациях это не так?
Ок, приведи такую реализацию.
Но это ты пытаешься сменить тему. По сути ты хотел доказать что неравенство ссылок в C# может быть и для идентичных объектов. Тебе то не удастся. Поэтому ты начала извращать понятие identity разводя демагогию.
S>>>Существование отличий в поведении дает логическую неидентичность. Показать тебе все способы нахождения отличий? G>>Идентичность не зависит от поведения. Отличия в поведении — неидентичны. Зачем разделять на физическую и логическую? S>Идентичность не зависит от поведения, но опираясь на наблюдаемое поведение можно опровергнуть логическую идентичность двух объектов.
Что такое логическая идентичность?
S>>>Логическая определяется через поведение объекта, а не через ссылку. Проверять всевозможное поведение объекта слишком муторно для форума. G>>Идентичность не зависит от поведения. Совпадения поведения в некотором смысле, который ты заранее задаешь, дает эквивалентность, а не идентичность. S>Эквивалентность можно построить на чем угодно, удовлетворив выполнение свойств отношения эквивалентности.
Можно.
S>>>Их не я придумал. Есть несколько источников, где эти вещи описаны. Отрицай существование этих источников. G>>Да пусть хоть на каждом шагу написано, но оно не становится от этого формализуемым, ты не можешь доказать что что-то есть, следовательно этого нет. S>Ты не можешь доказать физическую идентичность. Следовательно ее нет?
Ок, давай выяснять что такое физическая идентичность. Покажи чем физическая идентичность отличается от ссылки? Напомню что в прошлом посте ты показал эквивалентность этих понятий.
S>>>Это ссылочная эквивалентность а не идентичность. Из нее следует физическая идентичность. Из физической идентичности следует ссылочная эквивалентность. Но это не одно и то же. Понятия разные, но наблюдаются они у объекта одновременно. Смотри определения. G>> G>>Если A -> B && B -> A, то A == B, это формальная логика, можешь с ней не спорить. S>Нет такой логики. Есть такая: S>A => B && B => A, то A <=> B (читается тогда и только тогда) не путай их. Не делает чести.
Другой распространенной операцией является эквивалентность. Ее аналог в разговорной речи — фразы, подобные словосочетанию тогда и только тогда, когда ... или если и только если ... Для ее обозначения используется символ <-> или просто =.
На википедии кстати статьи про логическую эквивалентность нет, надо что-то кроме википедии читать
G>>Ты только что доказал что совпадение ссылок есть "физическая идентичность", теперь осталось выяснить чем логическая идентичность отличается от физической идентичности. S>Тем что она не опирается на расположение в памяти.
Раскрою тайну: ссылки в C# тоже не опираются на расположение в памяти в общем случае, так как объекты могут перемещаться. Ссылки — не адреса.
G>>Для этого просто приведи код, где будет "логическая идентичность" как некоторое выражение, возвращающее true для двух объектов, но не будет "физической идентичности" (равенства ссылок). Ну и естественно это должно быть выражение для любого типа, а не для какого-то класса. S>С чего бы для любого типа? Для конкретного типа — пожалуйста S>
S>class Monostate
S>{
S> static int a;
S> public int A { get { return a; } set { a = value; } }
S>}
S>var a = new Monostate();
S>var b = new Monostate();
S>a.A = 42;
S>Assert(42 == b.A);
S>
См выделенное. Ты по сути построил класс все экземпляры которого могут быть эквивалентны между собой.
S>Только как ты не можешь доказать физическую идентичность объекта самому себе, так и я не смогу доказать логическую идентичность a и b.
Видимо ты не те определения выбрал что не можешь доказать что-то из них.
S>Тем не менее, я их считаю их идентичными согласно определению.
Согласно определению они как раз неидентичны, потому что я тебе легко приведу выражение отличающее их друг от друга (угадай какое).
S>>>Если для тебя это треп, то давай завязывать. Я тебе уже устал повторять, что доказать идентичность даже объекта самому себе кодом невозможно. Формально определение идентичности ссылается на свойства, которые позволяют отличать объекты друг от друга. G>>Я просто поверю создателям языка что Object.ReferenceEquals — сравнивает identity. Причем ссылки, которые сравниваются, вполне соответствуют всем трем определениям отсюда. S>Это не доказательство идентичности кодом. Ты оперируешь кучей допущений, сделанными создателями платформы. Что у объектов есть ссылки, что ссылки можно сравнивать, что из равенства ссылок следует что объекты расположены по одному адресу, что объекты, расположенные по одному адресу не могут обладать свойствами, отличающими их друг от друга.
Ну ведь эти "допущения" не нарушаются, так? Значит все таки ссылка — identity?
S>Что будешь делать если ссылки сравнить нельзя, либо как подметил Ikemefula, если две неравные ссылки ссылаются на один объект и из неравенства ссылок не следует неидентичность?
Приведи язык где нельзя сравнить ссылки? Если ссылки не одинаковы в битовом представлении, то есть инвариантный формат, их надо привести и сравнить.
Для простоты давай называть ссылкой инвариантый формат, чтобы не усложнять рассуждения.
G>>А ты, если не веришь, попробуй доказать обратное. G>>Одним написанием определений ты ничего не докажешь. Нужен код. S>Ты не написал код, убеждающий в идентичности объекта самому себе строго
object.ReferenceEquals(a,a) не? ведь ссылка работает как identity, тебе не удалось этого опровергнуть.
S>>>Докажи идентичность объекта самому себе кодом, что бы сошлось с определением. G>>Идентичность не нужно доказывать, она или есть, или нет. Это неотъемлемое свойство объекта. S>Тогда не проси с меня код G>>Идентичность и позволяет отличить объект от других, то есть id(a) == id(b) только когда a и b это один и тот же объект. S>Это выдумка, которая не следует из определения идентичности. В частности в определении не упоминается "один и тот же".
Да, там упоминается "отличить от других". Давай пререфразирую, id(a) != id(b) только когда a и b — разные объекты. Опять-таки формальная логика рулит, я просто сделал отрицание обеих частей выражения, таблица истинности не поменялась.
G>>>>Концептуально — ниоткуда, а в контретной реализации ООП — очень даже понятно откуда. Других реализаций ООП не видел. S>>>Это не значит, что других реализаций не может быть. G>>Приведи реализацию, я склонен считать что если в программировании что-то невозможно сделать в коде, то этого просто нет. Программирование не требует затрат больших энергии на проведение эксперимента. S>Мне необязательно доказывать тебе возможность существования другой реализации конкретным примером. Хотя ключ я уже дал. Представь себе ООП систему, где невозможно сравнение ссылок либо убеди себя что такой не может существовать.
Ок, представим. Как ты в такой системе обеспечишь identity? Как ты напишешь выражение, которое позволяет отличить один объект от другого?
G>>>>Я его отбрасываю потому что оно неформализуемо. S>>>Оно формализуемо. G>>Так приведи код, который проверит "логическую идентичность". S>Приведи код, который проверит физическую идентичность формально, а не по ReferenceEquals.
Давай начнем с определения "физической идентичности", что это такое? Как оно выражается в языке?
G>>Уже писали про это: наприемр если взять указатель на область памяти или на COM объект, то он может иметь разные адреса при указании на один объект, но в любом случае существует "инвариантный" указатель, который будет совпадать. Вот этот инвариантный указатель можно считать ссылкой в общем (в математическом понимании). Ссылки в C# инварианты, и внутрь залезть нельзя. S>Это частный случай с COM, который не исчерпывает широту определения.
И? Ну приведи случай реализации ООП где
1)Ссылки на объекты нельзя сравнить
2)Ссылки на один и тот же объект могут быть различными
3)Что будет identity в таком случае?
4)Как отличать объекты один от другого?
G>>В соответствии с высказыванием ты утверждаешь что бывает так что Object.ReferenceEquals(a,b) == false, но это один и тот же объект. S>Я такого не утвреждаю.
А что тогда утверждаешь? только кодом.
G>>Приведи пример языка где инвариантные ссылки не совпадают, но это один и тот же объект. S>Это не обязательно. Я рассуждаю о концептуальной модели, а не о частной ее реализации.
Рассуждать можно о чем угодно, даже том чего не существует. В программировании легко провести эксперимент, он не требует ничего кроме умственных усилий и немного времени. Покажи пример того о чем ты пытаешься рассуждать.
S>>>Я пользуюсь формальным определением. То что из него следует лишь физическая идентичность — не факт для меня. И еще раз — мопед не мой. Я указал как минимум 3 источника. Почему ты обвиняешь в придумывании и демагогии именно меня? G>>Потому что ты опираешься на неформализуемое определение логической идентичности. S>а ты пользуешься неформализуемым определением физической идентичности.
Я вообще не делю идентичность на физическую и логическую.
Я говорю что во всех практических реализациях есть ссылки на объекты (инвариантные ссылки если угодно), которые как раз выполняют роль identity. При этом сами ссылки могут не совпадать (COM), но приводятся к инварианту, которые совпадают для одинаковых объектов, также ссылки могут иметь непостоянное битовое представление (.NET и Java). Могут быть сложными значениями — ключи строк в БД.
Ты же понамешал сюда логическую и физическую идентичность, при этом не можешь дать определение ни одной, ни другой.
Это и есть демагогия.
Здравствуйте, samius, Вы писали:
S>Нет способа изменить лишь один из них. Они удовлетворяют процитированному. Т.е. согласно процитированному являются идентичными.
Ошибка в логике. Из идентичности следует изменение "обоих". Из "изменения обоих" идентичность никак не следует.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, samius, Вы писали:
S>С этим согласен. Но я не вижу, что я понял неправильно. Я показал как можно доказать неидентичность объектов, исходя из этого свойства идентичности.
Нет. S>Это не относится к OO идентичности.
Относится. Плоха была бы ОО-модель, если бы работала только для одного адресного пространства.
S>Для определения физической идентичности можно (не в COM). S>На COM предлагаю забить, потому как с ним явно оговорено, что ссылочная эквивалентность у него по IUnknown. Учитывая это он ведет В себя вполне ожидаемо и соответственно объеткам в других популярных языках/платформах.
В ответ предлагаю забить на понятие логической идентичности.
S>Ссылочная эквивалентность налагает дополнительное требование к концепции — существование ссылок и возможность проверить их эквивалентность, из которой должно следовать что объекты находятся по одному адресу и не могут обладать свойствами, отличающими их друг от друга. Слишком много допущений.
Смотря где. В чистой теории — да. Но в чистой теории словосочетание "свойство идентичности" означает всего лишь наличие функции ID(o:object), которая возвращает значение из некоторого множества, на котором определено отношение эквивалентности.
При этом ID(o1) == ID(o2) тогда и только тогда, когда o1 и o2 обозначают один и тот же объект.
В чистой теории можно "обозначить" объект как o1 или как o2, никак не оперируя ссылками.
На практике же ОО-систем без ссылок не бывает — понятие ссылки и разыменования необходимо для того, чтобы писать сколь-нибудь полезные программы. В программе нельзя сказать "отправить сообщение объекту, обозначенному как о1".
Поэтому этих допущений не "слишком много", а как раз нормально. Далее, про находимость "по одному адресу" я бы упоминать не рекомендовал — адрес в программировании является значительно более сильным понятием, чем ссылка, и, в отличие от последней, допускает значительно больше операций.
Кроме того, употреблять "объекты находятся" во множественном числе здесь не имеет смысла, даже отвлекаясь от понятия адреса.
Правильно говорить так: "из ссылочной эквивалентности следует то, что ссылки ссылаются на один и тот же объект".
S>>То есть у двух разных объектов гарантированно разные ссылки. S>Это верно. Но это не вытекает из определения идентичности.
Это вытекает из определения ссылки.
S>Не знал. Не буду проверять, но они могли бы вернуть один int. И что тогда?
Да, в общем-то, ничего.
S>Можно определение, которое бы гарантировало идентичность через ссылочную экивалентность напрямую, а не через серию уточнений?
Конечно http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf, секция 8.2.5.1, стр. 30.
Otherwise, if their exact type is a reference type, then they are identical if and only if the locations of the values are the same.
value-типы в .Net выходят за рамки чистого ООП, поэтому для них идентичность определена по-другому.
Секция 8.2.5 там же описывает ваш пример со строками с точки зрения стандарта.
Thus, the values of variables A and B are identical, the values of variables A and C as well as B and C are not identical, and the values of all three of A, B, and C are equal
S>Окей, я согласен заменить логическую идентичность на эквивалентность поведения. Этот термин хорошо отражает суть. Но надо заметить что формально "эквивалентность поведения" подпадает под определение идентичности. Иначе — мы будем подразумевать что-то разное.
Нет, не попадает. Два различимых объекта могут демонстрировать одинаковое поведение, находясь в одинаковом состоянии.
S>>Два объекта будут поведенчески эквивалентны, если их реакция на любое сообщение будет одинаковой. S>Это определение не годится. Нужно такое: если невозможно найти свойства, отличающие их
Нет.
1. Что вы называете "свойствами"?
2. Зачем вы их пихаете в понятие "эквивалентного поведения"? Очевидно, что эквивалентность поведения должна определяться в терминах поведения, и ничего больше. Пример на пальцах: "цветовая эквивалентность" для предметов не должна подразумевать одинаковость их формы.
S>Другое чем физическая идентичность — согласен. Но оно вытекает из определения идентичности.
Что откуда вытекает?
S>Но по-моему налицо повсеместное неправильное толкования определения идентичности.
Нет, неправильное толкование определения идентичности сосредоточено ровно в одном человеке.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, samius, Вы писали: S>Я нахожу что его логическая идентичность вписывается в определение идентичности.
В определение идентичности из ООП — нет.
S>>Напримеру, какие? S>например, эти http://www.objectarchitects.de/ObjectArchitects/orpatterns/index.htm?OID/index.htm
Ну вы сами-то хоть читайте, на что ссылаетесь!
Все три определения говорят об идентичности, которая отличает объект от всех остальных объектов. Понимаете, от всех!
И вы тут же в пример "логической идентичности" приводите две разных экземпляра строки, у которых ваше определение идентичности даёт одинаковый результат!
Далее, читаем там же
This means the objects can be distinguished from each other without comparing their values or their behavior.
А вы пытаетесь рассказать про идентичность, которая работает как раз через сравнение поведения.
S>То что value не объекты, вы не смогли меня убедить весной.
Очень может быть. Вас вообще очень трудно в чём-то убедить. Вы ухитряетёсь цитировать источники, которые вас же опровергают, в защиту своих заблуждений.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, samius, Вы писали:
S>Это не проблемы концепции. Допустим, в некой реализации ссылки нельзя сравнивать. Ты скажешь что это не ООП на том основании что в известных тебе реализациях это не так?
Если в этой реализации не предложен другой способ получения идентити объекта, то я таки скажу, что это — не ООП.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, samius, Вы писали:
S>>Я уверен в своей правоте. Словами о неправильных выводах меня не убедить. G>Но это не делает тебя правым
Тоже верно.
S>>Верно не зависит. Изменение состояния и поведение объекта не изменяет его идентичность. Фраза об этом. Потому изменив состояние одного объетка и не увидев изменения другого объекта можно опровергнуть их идентичность. G>Так опровергни идентичность объектов для которых object.ReferenceEquals(a,b) == true, если ты утверждаешь что object.ReferenceEquals не является выражением идентичности.
Я нигде не утверждал что объекты с равными ссылками могут быть неидентичными.
S>>Я не вижу как оттуда вытекает лишь физический аспект идентичности. G>Нету отдельно физического и логического аспекта, ты их выдумал.
не я
S>>В чем его отличие от тех, которым ты доверяешь? G>Ты не привел формального определения.
Приводил
G>>>Нет, потому что ссылка и есть identity. Ты можешь показать другое — показывай. Формально, кодом. S>>Где об этом сказано? G>Может и нигде, но object.ReferenceEquals позволяет отличить один объект от другого как раз с помощью ссылки. Именно это и можно принять за identity. И действительно, если object.ReferenceEquals(a,b) == true, то любое изменение a отразится на b.
Это верно. Но из того что любое изменение a отразится на b не следует равенство ссылок.
S>>Вот синклер написал что разные ссылки могут ссылаться на один объект. В таком случае идентичность этого объекта самому себе будет опровергнута. G>Это зависит от реализации ссылки в языке, конкретно в C# ссылка и есть identity. А если в каком-то языке это не так, то там все равно есть способ получить некоторое инвариантное значение, которое мы и будем называть ссылкой. Например в БД это ключ записи.
Мы говорим про ООП а не про БД. Для ООП ссылка не нужна. Об этом нигде не написано. Требуется механизм посылки сообщения с точностью до identity. Это можно обеспечить идентификатором.
S>>>>ПОчему ты вообще используешь ссылки для определения идентичности? На каком формальном основании? Где в определении идентичности ссылки? Почему ты ссылку считаешь свойством объекта? G>>>В концептуальном определении их нет, но реализация identity во всех известных мне языках с поддержкой ООП опирается на ссылки в том или ином виде. Вообще слабо себе представляю ООП без ссылок. S>>Это не проблемы концепции. Допустим, в некой реализации ссылки нельзя сравнивать. Ты скажешь что это не ООП на том основании что в известных тебе реализациях это не так? G>Ок, приведи такую реализацию.
В этом нет необходимости. G>Но это ты пытаешься сменить тему. По сути ты хотел доказать что неравенство ссылок в C# может быть и для идентичных объектов. Тебе то не удастся. Поэтому ты начала извращать понятие identity разводя демагогию.
Ты слишком узко смотришь на определение идентичности.
S>>Идентичность не зависит от поведения, но опираясь на наблюдаемое поведение можно опровергнуть логическую идентичность двух объектов. G>Что такое логическая идентичность?
Это идентичность, основанная на отсутствии свойств объектов, отличающих их. Под свойствами я подразумеваю не поля объекта и не свойства аксессоры к полям. Физический адрес я тоже не отношу к свойствам объекта.
S>>Ты не можешь доказать физическую идентичность. Следовательно ее нет? G>Ок, давай выяснять что такое физическая идентичность. Покажи чем физическая идентичность отличается от ссылки? Напомню что в прошлом посте ты показал эквивалентность этих понятий.
Они отличаются определением.
S>>>>Это ссылочная эквивалентность а не идентичность. Из нее следует физическая идентичность. Из физической идентичности следует ссылочная эквивалентность. Но это не одно и то же. Понятия разные, но наблюдаются они у объекта одновременно. Смотри определения. G>>> G>>>Если A -> B && B -> A, то A == B, это формальная логика, можешь с ней не спорить. S>>Нет такой логики. Есть такая: S>>A => B && B => A, то A <=> B (читается тогда и только тогда) не путай их. Не делает чести. G>
G>Ты привел одно и тоже заменив -> на => и == на <=>. G>http://www.ctc.msiu.ru/materials/Book2/ch_07_sheets/01_logic/03_implies/
G>
G>Другой распространенной операцией является эквивалентность. Ее аналог в разговорной речи — фразы, подобные словосочетанию тогда и только тогда, когда ... или если и только если ... Для ее обозначения используется символ <-> или просто =.
То что ты мне привел — это эквивалентность между высказываниями или формулами, когда они принимают одни и те же истинностные значения. Из эквивалентности высказываний не следует эквивалентность понятий, заданными разными определениями. Ты же мне написал что физическая идентичность эквивалентна равеству ссылок, а потом поставил знак ==.
G>На википедии кстати статьи про логическую эквивалентность нет, надо что-то кроме википедии читать
выбирай, что читать.
S>>Тем что она не опирается на расположение в памяти. G>Раскрою тайну: ссылки в C# тоже не опираются на расположение в памяти в общем случае, так как объекты могут перемещаться. Ссылки — не адреса.
Не прямые адреса, разве что.
G>>>Для этого просто приведи код, где будет "логическая идентичность" как некоторое выражение, возвращающее true для двух объектов, но не будет "физической идентичности" (равенства ссылок). Ну и естественно это должно быть выражение для любого типа, а не для какого-то класса. S>>С чего бы для любого типа? Для конкретного типа — пожалуйста S>>
S>> static int a;
S>> public int A { get { return a; } set { a = value; } }
S>>
G>См выделенное. Ты по сути построил класс все экземпляры которого могут быть эквивалентны между собой.
не я его построил. Это известный паттерн.
Следствие в википедии говорит об объектах одного типа. Откуда ты взял "для любого типа" — не знаю.
S>>Только как ты не можешь доказать физическую идентичность объекта самому себе, так и я не смогу доказать логическую идентичность a и b. G>Видимо ты не те определения выбрал что не можешь доказать что-то из них.
Выбери определение идентичности и докажи кодом идентичность объекта самому себе, не опираясь на ссылки, упоминания о которых, надеюсь в твоем определении не будет.
S>>Тем не менее, я их считаю их идентичными согласно определению. G>Согласно определению они как раз неидентичны, потому что я тебе легко приведу выражение отличающее их друг от друга (угадай какое).
Я помню что ты считаешь ссылку на объект свойством объекта. Только в определении об этом почему-то не написано. Так что твое выражение отличающее ссылки не будет иметь прямого отношения к определению идентичности.
S>>Это не доказательство идентичности кодом. Ты оперируешь кучей допущений, сделанными создателями платформы. Что у объектов есть ссылки, что ссылки можно сравнивать, что из равенства ссылок следует что объекты расположены по одному адресу, что объекты, расположенные по одному адресу не могут обладать свойствами, отличающими их друг от друга. G>Ну ведь эти "допущения" не нарушаются, так? Значит все таки ссылка — identity?
Нет. Это значит что из равенства ссылок следует identity. То что верно обратное ты не показал. Извини, в определении идентичности ничего про ссылки нет, поэтому тебе придется формально доказывать что идентичные объекты имеют равные ссылки.
И то, если покажешь, то получишь лишь эквивалентность высказываний, но не эквивалентность понятий.
S>>Что будешь делать если ссылки сравнить нельзя, либо как подметил Ikemefula, если две неравные ссылки ссылаются на один объект и из неравенства ссылок не следует неидентичность? G>Приведи язык где нельзя сравнить ссылки? Если ссылки не одинаковы в битовом представлении, то есть инвариантный формат, их надо привести и сравнить.
Незачем приводить язык без ссылок. Но если хочется — можно пофантазировать. Пусть будет C#--, который будет в точности C#, но без возможности сравнения ссылок. Обращаться по ссылке можно, сравнивать — нет. G>Для простоты давай называть ссылкой инвариантый формат, чтобы не усложнять рассуждения.
Незачем. Тебе C# позволяет привести ссылку к инвариантному формату?
G>>>Одним написанием определений ты ничего не докажешь. Нужен код. S>>Ты не написал код, убеждающий в идентичности объекта самому себе строго G>object.ReferenceEquals(a,a) не? ведь ссылка работает как identity, тебе не удалось этого опровергнуть.
Тебе не удалось это доказать.
G>>>Идентичность и позволяет отличить объект от других, то есть id(a) == id(b) только когда a и b это один и тот же объект. S>>Это выдумка, которая не следует из определения идентичности. В частности в определении не упоминается "один и тот же". G>Да, там упоминается "отличить от других". Давай пререфразирую, id(a) != id(b) только когда a и b — разные объекты. Опять-таки формальная логика рулит, я просто сделал отрицание обеих частей выражения, таблица истинности не поменялась.
Не рулит логика, когда неверен посыл. Докажи что разные объекты а и b будут иметь различные if(a) и id(b). Формально из определения, пожалуйста, а не руководствуясь домыслами о равенстве ссылок.
S>>Мне необязательно доказывать тебе возможность существования другой реализации конкретным примером. Хотя ключ я уже дал. Представь себе ООП систему, где невозможно сравнение ссылок либо убеди себя что такой не может существовать. G>Ок, представим. Как ты в такой системе обеспечишь identity? Как ты напишешь выражение, которое позволяет отличить один объект от другого?
ООП не требует возможности отличать объекты, ООП требует доставки сообщений объекту с некоторой identity.
G>>>Так приведи код, который проверит "логическую идентичность". S>>Приведи код, который проверит физическую идентичность формально, а не по ReferenceEquals. G>Давай начнем с определения "физической идентичности", что это такое? Как оно выражается в языке?
Определение то же самое. Выражения в языке нет. ReferenceEquals выражает равенство ссылок а не идентичность. Покажи что не найдется свойства, по которым можно отличить объект от самого себя. Кодом!
S>>Это частный случай с COM, который не исчерпывает широту определения. G>И? Ну приведи случай реализации ООП где G>1)Ссылки на объекты нельзя сравнить
приводил G>2)Ссылки на один и тот же объект могут быть различными
добавим к C#-- то свойство, что ссылка включает в себя время ее получения. Вот такой я странный. G>3)Что будет identity в таком случае?
То же самое, см. формальное определение. G>4)Как отличать объекты один от другого?
Зачем? Механизм доставки сообщений по заданному identity работает. Большего не требуется. Я не собираюсь этот язык внедрять в производство или решать на нем какие-либо задачи.
G>>>В соответствии с высказыванием ты утверждаешь что бывает так что Object.ReferenceEquals(a,b) == false, но это один и тот же объект. S>>Я такого не утвреждаю. G>А что тогда утверждаешь? только кодом.
Я утверждаю что из неравенства ссылок может следовать same identity. Кодом я identity записать не могу. Да и ты пока не смог.
G>>>Приведи пример языка где инвариантные ссылки не совпадают, но это один и тот же объект. S>>Это не обязательно. Я рассуждаю о концептуальной модели, а не о частной ее реализации. G>Рассуждать можно о чем угодно, даже том чего не существует. В программировании легко провести эксперимент, он не требует ничего кроме умственных усилий и немного времени. Покажи пример того о чем ты пытаешься рассуждать.
См. пример с monostate.
G>>>Потому что ты опираешься на неформализуемое определение логической идентичности. S>>а ты пользуешься неформализуемым определением физической идентичности. G>Я вообще не делю идентичность на физическую и логическую.
Я заметил. Но формализовать кодом просто определение идентичности ты тоже не смог пока.
G>Я говорю что во всех практических реализациях есть ссылки на объекты (инвариантные ссылки если угодно), которые как раз выполняют роль identity. При этом сами ссылки могут не совпадать (COM), но приводятся к инварианту, которые совпадают для одинаковых объектов, также ссылки могут иметь непостоянное битовое представление (.NET и Java). Могут быть сложными значениями — ключи строк в БД.
Я говорю об концептуальной модели а не о практических реализациях.
G>Ты же понамешал сюда логическую и физическую идентичность, при этом не можешь дать определение ни одной, ни другой. G>Это и есть демагогия.
Я давал. Еще раз. Физическая идентичность — идентичность основанная на равенстве ссылок/адресов/хэндлов/уникальных системных идентификаторов. Хочется назвать ее суррогатной идентичностью, т.к. ссылки и т.п. не имеют отношения к объекту, его состоянию и поведению. Логическая идентичность — идентичность, которая основывается на наблюдаемом поведении объекта. И да, я знаю что поведение и состояние не влияют на идентичность. Потому предлагается устанавливать идентичность по разнице в наблюдаемом поведении.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, samius, Вы писали:
S>>Нет способа изменить лишь один из них. Они удовлетворяют процитированному. Т.е. согласно процитированному являются идентичными. S>Ошибка в логике. Из идентичности следует изменение "обоих". Из "изменения обоих" идентичность никак не следует.
gandjustas-у уже ответил, не на то сослался.
Вот из вики.
The object identity of two objects of the same type is the same, if every change to either object is also a change to the other object.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, samius, Вы писали:
S>>Но вот следствие из википедии S>>
S>>The object identity of two objects of the same type is the same, if every change to either object is also a change to the other object.
S>>согласно ему a и b идентичны. Верно? Да и ссылка на same type есть, т.е. для любого типа это не надо показывать.
G>Это глупость написана.
Это надо доказывать. G>Банально опровергается сравнением ссылок.
Для этого надо доказать что все идентичные объекты обладают равными ссылками. Формально.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, samius, Вы писали:
S>>С этим согласен. Но я не вижу, что я понял неправильно. Я показал как можно доказать неидентичность объектов, исходя из этого свойства идентичности. S>Нет. S>>Это не относится к OO идентичности. S>Относится. Плоха была бы ОО-модель, если бы работала только для одного адресного пространства.
Не я предлагал привязываться к адресному пространству. Но в разных адресных пространствах легко обнаружить противоречие определению идентичности для идентичных объектов.
S>>Ссылочная эквивалентность налагает дополнительное требование к концепции — существование ссылок и возможность проверить их эквивалентность, из которой должно следовать что объекты находятся по одному адресу и не могут обладать свойствами, отличающими их друг от друга. Слишком много допущений. S>Смотря где. В чистой теории — да. Но в чистой теории словосочетание "свойство идентичности" означает всего лишь наличие функции ID(o:object), которая возвращает значение из некоторого множества, на котором определено отношение эквивалентности.
Да. S>При этом ID(o1) == ID(o2) тогда и только тогда, когда o1 и o2 обозначают один и тот же объект.
Откуда это следует? Именно про один и тот же объект.
S>В чистой теории можно "обозначить" объект как o1 или как o2, никак не оперируя ссылками.
да
S>На практике же ОО-систем без ссылок не бывает — понятие ссылки и разыменования необходимо для того, чтобы писать сколь-нибудь полезные программы. В программе нельзя сказать "отправить сообщение объекту, обозначенному как о1".
В программе на C++ можно отправить сообщение объекту, обозначенному идентификатором o1 без ссылки.
S>Поэтому этих допущений не "слишком много", а как раз нормально. Далее, про находимость "по одному адресу" я бы упоминать не рекомендовал — адрес в программировании является значительно более сильным понятием, чем ссылка, и, в отличие от последней, допускает значительно больше операций. S>Кроме того, употреблять "объекты находятся" во множественном числе здесь не имеет смысла, даже отвлекаясь от понятия адреса. S>Правильно говорить так: "из ссылочной эквивалентности следует то, что ссылки ссылаются на один и тот же объект".
Согласен.
S>>>То есть у двух разных объектов гарантированно разные ссылки. S>>Это верно. Но это не вытекает из определения идентичности. S>Это вытекает из определения ссылки.
Я неверно ответил по поводу разных. У разных объектов ссылки разные. Но то что у двух идентичных объектов ссылки разные — неочевидно. И не вытекает из определения идентичности.
S>>Не знал. Не буду проверять, но они могли бы вернуть один int. И что тогда? S>Да, в общем-то, ничего.
S>>Можно определение, которое бы гарантировало идентичность через ссылочную экивалентность напрямую, а не через серию уточнений? S>Конечно S>http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf, секция 8.2.5.1, стр. 30. S>
S>Otherwise, if their exact type is a reference type, then they are identical if and only if the locations of the values are the same.
В ECMA собственное определение идентичности. Я не вижу его соответсвия или даже похожести на определение идентичности в ООП. S>value-типы в .Net выходят за рамки чистого ООП, поэтому для них идентичность определена по-другому. S>Секция 8.2.5 там же описывает ваш пример со строками с точки зрения стандарта.
S>
S>Thus, the values of variables A and B are identical, the values of variables A and C as well as B and C are not identical, and the values of all three of A, B, and C are equal
S>>Окей, я согласен заменить логическую идентичность на эквивалентность поведения. Этот термин хорошо отражает суть. Но надо заметить что формально "эквивалентность поведения" подпадает под определение идентичности. Иначе — мы будем подразумевать что-то разное. S>Нет, не попадает. Два различимых объекта могут демонстрировать одинаковое поведение, находясь в одинаковом состоянии.
Тогда эквивалентность поведение это не то же, что логическая эквивалентность.
S>>>Два объекта будут поведенчески эквивалентны, если их реакция на любое сообщение будет одинаковой. S>>Это определение не годится. Нужно такое: если невозможно найти свойства, отличающие их S>Нет. S>1. Что вы называете "свойствами"?
Нечто, по чему можно отличить объекты. S>2. Зачем вы их пихаете в понятие "эквивалентного поведения"? Очевидно, что эквивалентность поведения должна определяться в терминах поведения, и ничего больше. Пример на пальцах: "цветовая эквивалентность" для предметов не должна подразумевать одинаковость их формы.
Я именно про поведение. Если в контракте объекта сказано что когда мы вызовем SetValue(42), то после этого будем получать GetValue() == 42, то это такое свойство поведения, по которому мы его сможем отличить от объектов, для которых мы не вызывали SetValue(42).
S>>Другое чем физическая идентичность — согласен. Но оно вытекает из определения идентичности. S>Что откуда вытекает?
Определение идентичности не указыват о том, что свойства, отличающие объекты есть именно ссылки/адреса/хэндлы и т.п. Значит может быть что-то еще, что их отличает. Я подразумеваю что это может быть наблюдаемое поведение.
S>>Но по-моему налицо повсеместное неправильное толкования определения идентичности. S>Нет, неправильное толкование определения идентичности сосредоточено ровно в одном человеке.
Не неправильное, а не такое как у участников дискуссии.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, samius, Вы писали: S>>Я нахожу что его логическая идентичность вписывается в определение идентичности. S>В определение идентичности из ООП — нет.
S>>>Напримеру, какие? S>>например, эти http://www.objectarchitects.de/ObjectArchitects/orpatterns/index.htm?OID/index.htm S>Ну вы сами-то хоть читайте, на что ссылаетесь! S>Все три определения говорят об идентичности, которая отличает объект от всех остальных объектов. Понимаете, от всех!
От всех с другой идентичностью. S>И вы тут же в пример "логической идентичности" приводите две разных экземпляра строки, у которых ваше определение идентичности даёт одинаковый результат! S>Далее, читаем там же S>
S>This means the objects can be distinguished from each other without comparing their values or their behavior.
S>А вы пытаетесь рассказать про идентичность, которая работает как раз через сравнение поведения.
А что это вы процитировали? Какое это имеет отношение к определениям, кроме того что оно написано под ними? Наверное, чья-то догадка?
S>>То что value не объекты, вы не смогли меня убедить весной. S>Очень может быть. Вас вообще очень трудно в чём-то убедить. Вы ухитряетёсь цитировать источники, которые вас же опровергают, в защиту своих заблуждений.
Возможно.
Прокомментируйте, пожалуйста еще раз следствия из вики
1. If the references do not compare equal, then it's not necessarily guaranteed that the identity of the objects behind those references is different.
2. The object identity of two objects of the same type is the same, if every change to either object is also a change to the other object.