CONTENTS DELETED
The author has deleted this message.
|
2010/8/11 Владимир Мусулайнен <[hidden email]>:
> Возникла необходимость в реализации следующей функциональности: > требуется сравнивать два объекта А и В. > ОбъектА выступает в качестве эталона, объектом В можетбыть, в теории, > экземпляр любого класса. Пока это строка, число и объект Current > (Ток). > > В большинстве случаев, объект А того же класса, что и В и в сравнении > проблем не возникает. Но в ряде случаев, нужно чтобы, на сравнение А с > любым другим объектом ответ был true. > > Возникла идея создания класса AnyValue. Конечно, это синглтон. > Конечно, равенство у него определено как > > = anObject > ^true > > Но как-то такая реализация смущает немного. > Ни у кого идей светлых в голову не придет, как еще разрешить равенство > чему угодно? > > Да, в предложенном варианте еще правильно hash надо реализовать, > возможны разные варианты, лучшего не выбрал. Мнение по этому поводу > тоже интересно. > Проблема в том, что для обьектов которые равны, хеш тоже должен быть одинаковым. Я не вижу возможности как это воплотить. До тех пор, пока данный обьект не используется в hash-based collections, проблем быть не должно. Но как только его добавить в такую коллекцию .. > -- > http://groups.google.ru/group/sugr -- Best regards, Igor Stasenko AKA sig. -- http://groups.google.ru/group/sugr |
Нет, ну всегда возможен формально-радикальный подход....переопределить
hash в Object'е, чтоб всегда возвращал ноль... -- http://groups.google.ru/group/sugr |
In reply to this post by vmusulainen-2
С равенством скорее всего не получится. А что если добавить к Object и
к этому объекту собственным метод типа #sameAs: ? On 11 авг, 22:57, Владимир Мусулайнен <[hidden email]> wrote: > Возникла необходимость в реализации следующей функциональности: > требуется сравнивать два объекта А и В. > ОбъектА выступает в качестве эталона, объектом В можетбыть, в теории, > экземпляр любого класса. Пока это строка, число и объект Current > (Ток). > > В большинстве случаев, объект А того же класса, что и В и в сравнении > проблем не возникает. Но в ряде случаев, нужно чтобы, на сравнение А с > любым другим объектом ответ был true. > > Возникла идея создания класса AnyValue. Конечно, это синглтон. > Конечно, равенство у него определено как > > = anObject > ^true > > Но как-то такая реализация смущает немного. > Ни у кого идей светлых в голову не придет, как еще разрешить равенство > чему угодно? > > Да, в предложенном варианте еще правильно hash надо реализовать, > возможны разные варианты, лучшего не выбрал. Мнение по этому поводу > тоже интересно. -- http://groups.google.ru/group/sugr |
In reply to this post by vmusulainen-2
Сравнение объектов в Smalltalk могут приводить к неожиданным результатам.
Результаты сравнения (A = B) и (B = А) могут возвращать противоположные результаты, все зависит от того, метод какого объекта выполняется. Возможный способ реализации функциональности, переопределить метод у класса эталонного объекта (A) и сравнивать (A = B). 12 августа 2010 г. 0:57 пользователь Владимир Мусулайнен <[hidden email]> написал: Возникла необходимость в реализации следующей функциональности: -- http://groups.google.ru/group/sugr |
In reply to this post by Dmitry Zamotkin
CONTENTS DELETED
The author has deleted this message.
|
In reply to this post by Nikolay Kleptsov
Метод = переопределить можно далеко не в каждом диалекте. В Dolphin
Smalltalk, к примеру, это примитив. Дмитрий Замоткин 12 августа 2010 г. 11:53 пользователь Nikolay Kleptsov <[hidden email]> написал: > Сравнение объектов в Smalltalk могут приводить к неожиданным результатам. > Результаты сравнения (A = B) и (B = А) могут возвращать противоположные > результаты, все зависит от того, метод какого объекта выполняется. > > Возможный способ реализации функциональности, переопределить метод у класса > эталонного объекта (A) и сравнивать (A = B). > > 12 августа 2010 г. 0:57 пользователь Владимир Мусулайнен > <[hidden email]> написал: >> >> Возникла необходимость в реализации следующей функциональности: >> требуется сравнивать два объекта А и В. >> ОбъектА выступает в качестве эталона, объектом В можетбыть, в теории, >> экземпляр любого класса. Пока это строка, число и объект Current >> (Ток). >> >> В большинстве случаев, объект А того же класса, что и В и в сравнении >> проблем не возникает. Но в ряде случаев, нужно чтобы, на сравнение А с >> любым другим объектом ответ был true. >> >> Возникла идея создания класса AnyValue. Конечно, это синглтон. >> Конечно, равенство у него определено как >> >> = anObject >> ^true >> >> Но как-то такая реализация смущает немного. >> Ни у кого идей светлых в голову не придет, как еще разрешить равенство >> чему угодно? >> >> Да, в предложенном варианте еще правильно hash надо реализовать, >> возможны разные варианты, лучшего не выбрал. Мнение по этому поводу >> тоже интересно. >> >> -- >> http://groups.google.ru/group/sugr > > > > -- > http://groups.google.ru/group/sugr -- http://groups.google.ru/group/sugr |
Но в ряде случаев, нужно чтобы, на сравнение А с
любым другим объектом ответ был true.
Мне кажется это из оперы, что и запрягать лошадь позади телеги, я бы разобрался сначала, а надо ли оно вообще. Пока совершенно непонятно зачем? 2010/8/12 Dmitry Zamotkin <[hidden email]> Метод = переопределить можно далеко не в каждом диалекте. В Dolphin -- http://groups.google.ru/group/sugr |
CONTENTS DELETED
The author has deleted this message.
|
Для величин я делал подобные классы Infinum и Supremum для плюс и
минус бесконечности. Если сравнивать по <= или проблем намного меньше. Дмитрий Замоткин 12 августа 2010 г. 22:18 пользователь Владимир Мусулайнен <[hidden email]> написал: > > Попробую описать ситуацию с помощью метафоры контейнеров и грузов. > > Есть грузы, имеют характеристику "вес". > Есть контейнеры, имеют характеристику "вес груза", которая показывает > какого веса груз, он может вместить. > Причем для упрощения задачи предположим, что надо брать контейнер с > грузоподъемностью равной весу груза. > > Очень удобно было бы искать для груза подходящий контейнер по > принципу: > > containers select: [:each | eachContainer weigth = load weight]. > > Теперь ход конем: некоторые контейнеры умеют вмещать груз любого веса. > > Можно предложить, что для таких контейнеров weight = nil, но все таки > как неудобно: > > containers select: [:each | eachContainer weigth isNil or: > [eachContainer weigth = load weight]]. > > Вот тут уже захотелось класть в container>>weight что-то, что умеет > отвечать true, если его сравнивают с любым весом. > > Теперь добавим к грузу еще ряд характеристик, например, форма, цвет, > температура. > Какие-то контейнеры могут вмещать кубические грузы, какие-то круглые, > а какие-то любые. > С цветами, температурой все точно также. > Еще раз захотелось иметь какой-то объект умеющий отвечать true на > сравнение с любым объектом, чтобы избежать: > > containers select: [:each | eachContainer weigth isNil or: > [eachContainer weigth = load weight]]. > containers select: [:each | eachContainer color isNil or: > [eachContainer color = load color ]]. > containers select: [:each | eachContainer shape isNil or: > [eachContainer shape = load shape]]. > > > > В.М. > > On 12 авг, 21:48, Alex Kogan <[hidden email]> wrote: >> *Но в ряде случаев, нужно чтобы, на сравнение А с любым другим объектом >> ответ был true.* >> Мне кажется это из оперы, что и запрягать лошадь позади телеги, я бы >> разобрался сначала, а надо ли оно вообще. Пока совершенно непонятно зачем? >> > > -- > http://groups.google.ru/group/sugr -- http://groups.google.ru/group/sugr |
In reply to this post by vmusulainen-2
Только вот поддерживать такой код наследниками будет нелегко в отличии от четко прописаного алгоритма.
Правильнее для класса контейнер создать методы сравнения типа Container>>canHandleWeight: aWeight ^self weight isNil or: [aWeight <= self weight] ну и соответвенно выбирать из колекции пользуя его. containers select: [:each |each canHandleWeight: someWeight] метод конечно можно развернуть добавив некий singleton state характеризующий контейнер Но я бы не стал прикрываться базовым поведением обьектов. Четко прописаные правила, понять и поддерживать проще. 2010/8/12 Владимир Мусулайнен <[hidden email]>
-- http://groups.google.ru/group/sugr |
In reply to this post by Dmitry Zamotkin
CONTENTS DELETED
The author has deleted this message.
|
CONTENTS DELETED
The author has deleted this message.
|
containers select: [:each | eachContainer weigth isEqualTo: load
weight]. Так вот и почему бы не научить Container это делать самому. 2010/8/12 Владимир Мусулайнен <[hidden email]> да, конечно, везде используется сравнение следующего вида -- http://groups.google.ru/group/sugr |
In reply to this post by Alex Kogan
12 августа 2010 г. 22:39 пользователь Alex Kogan <[hidden email]> написал:
> Только вот поддерживать такой код наследниками будет нелегко в отличии от > четко прописаного алгоритма. > > Правильнее для класса контейнер создать методы сравнения типа > Container>>canHandleWeight: aWeight > > ^self weight isNil or: [aWeight <= self weight] > > ну и соответвенно выбирать из колекции пользуя его. > containers select: [:each |each canHandleWeight: someWeight] Сорри за оффтоп, но уж больно пример хорош :) А я бы ещё определил метод Container>>canHandle: aProperty, и коллекцию специальную ContainerCollection с методом selectCapableToHandle: aProperty. И использовал бы двойную диспетчеризацию. Пусть каждая характеристика спрашивает у контейнера удовлетворяет ли он ей или нет: Container>>canHandle: aProperty ^ aProperty canBeHandledWith: self. WeightProperty>>canBeHandledWith: aContainer ^ aContainer canHandleWeight: self. Так можно даже составные характеристики легко обрабатывать. -- http://groups.google.ru/group/sugr |
CONTENTS DELETED
The author has deleted this message.
|
13 августа 2010 г. 1:01 пользователь Владимир Мусулайнен
<[hidden email]> написал: > только убрать специальные классы свойств. А без них не будет работать двойная диспетчеризация :( -- http://groups.google.ru/group/sugr |
Free forum by Nabble | Edit this page |