Маленький, равный чему не попади, объект

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
17 messages Options
Reply | Threaded
Open this post in threaded view
|

Маленький, равный чему не попади, объект

vmusulainen-2
CONTENTS DELETED
The author has deleted this message.
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

Igor Stasenko
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
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

Yuriy Mironenko
Нет, ну всегда возможен формально-радикальный подход....переопределить
hash в Object'е, чтоб всегда возвращал ноль...

--
http://groups.google.ru/group/sugr
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

Dmitry Zamotkin
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
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

Nikolay Kleptsov
In reply to this post by vmusulainen-2
Сравнение объектов в 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
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

vmusulainen-2
In reply to this post by Dmitry Zamotkin
CONTENTS DELETED
The author has deleted this message.
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

Dmitry Zamotkin
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
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

Alex Kogan
Но в ряде случаев, нужно чтобы, на сравнение А с любым другим объектом ответ был true.
Мне кажется это из оперы, что и запрягать лошадь позади телеги, я бы разобрался сначала, а надо ли оно вообще. Пока совершенно непонятно зачем?


2010/8/12 Dmitry Zamotkin <[hidden email]>
Метод = переопределить можно далеко не в каждом диалекте. В 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
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

vmusulainen-2
CONTENTS DELETED
The author has deleted this message.
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

Dmitry Zamotkin
Для величин я делал подобные классы 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
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

Alex Kogan
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]>

Попробую описать ситуацию с помощью метафоры контейнеров и грузов.

Есть грузы, имеют характеристику "вес".
Есть контейнеры, имеют характеристику "вес груза", которая показывает
какого веса груз, он может вместить.
Причем для упрощения задачи предположим, что надо брать контейнер с
грузоподъемностью  равной весу груза.

Очень удобно было бы искать для груза подходящий контейнер по
принципу:

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
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

vmusulainen-2
In reply to this post by Dmitry Zamotkin
CONTENTS DELETED
The author has deleted this message.
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

vmusulainen-2
CONTENTS DELETED
The author has deleted this message.
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

Alex Kogan
containers select: [:each | eachContainer weigth isEqualTo: load
weight].

Так вот и почему бы не научить Container это делать самому.

2010/8/12 Владимир Мусулайнен <[hidden email]>
да, конечно, везде используется сравнение следующего вида

containers select: [:each | eachContainer weigth isEqualTo: load
weight].


В.М.

--
http://groups.google.ru/group/sugr
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

George Herolyants-3
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
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

vmusulainen-2
CONTENTS DELETED
The author has deleted this message.
Reply | Threaded
Open this post in threaded view
|

Re: Маленький, равный чему не попади, объект

George Herolyants-3
13 августа 2010 г. 1:01 пользователь Владимир Мусулайнен
<[hidden email]> написал:
> только убрать специальные классы свойств.

А без них не будет работать двойная диспетчеризация :(

--
http://groups.google.ru/group/sugr