И снова про equals и LSP
От: Курилка Россия http://kirya.narod.ru/
Дата: 18.04.07 18:13
Оценка: 1 (1) +1
Тут как-то пару месяцев обсуждали этот метод у Object из .Net в рамках наследования. Нашёл интересную статью по этому поводу (правда там Ява, но ничего это не меняет). Там высказывается вполне корректная на мой взгляд точка зрения: equals не должен быть методом объекта, иначе он будет не симметричным, что ведёт к логическим ошибкам.
Re: И снова про equals и LSP
От: ZevS  
Дата: 20.04.07 08:13
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Тут как-то пару месяцев обсуждали этот метод у Object из .Net в рамках наследования. Нашёл интересную статью по этому поводу (правда там Ява, но ничего это не меняет). Там высказывается вполне корректная на мой взгляд точка зрения: equals не должен быть методом объекта, иначе он будет не симметричным, что ведёт к логическим ошибкам.


Ну не зря же этот метод виртуальный?
Re[2]: И снова про equals и LSP
От: Курилка Россия http://kirya.narod.ru/
Дата: 20.04.07 08:18
Оценка:
Здравствуйте, ZevS, Вы писали:

ZS>Здравствуйте, Курилка, Вы писали:


К>>Тут как-то пару месяцев обсуждали этот метод у Object из .Net в рамках наследования. Нашёл интересную статью по этому поводу (правда там Ява, но ничего это не меняет). Там высказывается вполне корректная на мой взгляд точка зрения: equals не должен быть методом объекта, иначе он будет не симметричным, что ведёт к логическим ошибкам.


ZS>Ну не зря же этот метод виртуальный?


Если подходить с т.зр. логики — зря.
Практически в угоду ООП извратили суть отношения равенства, а ёжики "плевались, но лезли на кактус"
Правда с практической т.зр. проблема не такая уж страшная.
Re[3]: И снова про equals и LSP
От: ZevS  
Дата: 20.04.07 09:14
Оценка:
Здравствуйте, Курилка, Вы писали:

...

ZS>>Ну не зря же этот метод виртуальный?


К>Если подходить с т.зр. логики — зря.

К>Практически в угоду ООП извратили суть отношения равенства, а ёжики "плевались, но лезли на кактус"
К>Правда с практической т.зр. проблема не такая уж страшная.

Использование классовых методов, реализованных через экземплярные спасет мир.

class Object
...
public static bool Equals(object objA, object objB)
{
    if (objA == objB)
    {
        return true;
    }
    if ((objA != null) && (objB != null))
    {
        return objA.Equals(objB);
    }
    return false;
}
Re[4]: И снова про equals и LSP
От: Курилка Россия http://kirya.narod.ru/
Дата: 20.04.07 09:20
Оценка:
Здравствуйте, ZevS, Вы писали:

ZS>Здравствуйте, Курилка, Вы писали:


ZS>...


ZS>>>Ну не зря же этот метод виртуальный?


К>>Если подходить с т.зр. логики — зря.

К>>Практически в угоду ООП извратили суть отношения равенства, а ёжики "плевались, но лезли на кактус"
К>>Правда с практической т.зр. проблема не такая уж страшная.

ZS>Использование классовых методов, реализованных через экземплярные спасет мир.


Классовые — это статические типа чтоль?
Чем твоя схема отличается от objA.equals(objB), которая несимметрична?
Доп. проверки на равенство экземпляров и null роли тут не играют
Re[5]: И снова про equals и LSP
От: ZevS  
Дата: 20.04.07 09:39
Оценка:
Здравствуйте, Курилка, Вы писали:

..

ZS>>Использование классовых методов, реализованных через экземплярные спасет мир.


К>Классовые — это статические типа чтоль?

К>Чем твоя схема отличается от objA.equals(objB), которая несимметрична?
К>Доп. проверки на равенство экземпляров и null роли тут не играют

Ну, я обычно сравниваю объекты на равенство статическим методом базового класса. И мне не важен тип объекта, часто я его и не знаю. По-моему, удобно. Пусть и извращение.
Re[6]: И снова про equals и LSP
От: Курилка Россия http://kirya.narod.ru/
Дата: 20.04.07 09:45
Оценка:
Здравствуйте, ZevS, Вы писали:

ZS>Здравствуйте, Курилка, Вы писали:


ZS>..


ZS>>>Использование классовых методов, реализованных через экземплярные спасет мир.


К>>Классовые — это статические типа чтоль?

К>>Чем твоя схема отличается от objA.equals(objB), которая несимметрична?
К>>Доп. проверки на равенство экземпляров и null роли тут не играют

ZS>Ну, я обычно сравниваю объекты на равенство статическим методом базового класса. И мне не важен тип объекта, часто я его и не знаю. По-моему, удобно. Пусть и извращение.


Ну почему извращение, это как раз по сути логически более правильный способ.
Просто проблема с перегрузкой оператора, которая-то и делает его несимметричным. Если же один метод в базовом классе, который ещё и final, то это почти идентично выносу его из класса.
Re[7]: И снова про equals и LSP
От: ZevS  
Дата: 20.04.07 15:04
Оценка:
Здравствуйте, Курилка, Вы писали:

..

ZS>>Ну, я обычно сравниваю объекты на равенство статическим методом базового класса. И мне не важен тип объекта, часто я его и не знаю. По-моему, удобно. Пусть и извращение.


К>Ну почему извращение, это как раз по сути логически более правильный способ.


Вот и получается, что виртуальный метод Equal необходим.

К>Просто проблема с перегрузкой оператора, которая-то и делает его несимметричным. Если же один метод в базовом классе, который ещё и final, то это почти идентично выносу его из класса.
Re[8]: И снова про equals и LSP
От: Курилка Россия http://kirya.narod.ru/
Дата: 20.04.07 16:18
Оценка:
Здравствуйте, ZevS, Вы писали:

ZS>Здравствуйте, Курилка, Вы писали:


ZS>..


ZS>>>Ну, я обычно сравниваю объекты на равенство статическим методом базового класса. И мне не важен тип объекта, часто я его и не знаю. По-моему, удобно. Пусть и извращение.


К>>Ну почему извращение, это как раз по сути логически более правильный способ.


ZS>Вот и получается, что виртуальный метод Equal необходим.


Откуда получается-то?
Проблема в том, что это в базовый класс запёхано, поэтому приходиться находить обходные пути.
Скажи, зачем тебе реально тут виртуальность нужна?
ObjectA.Equals(a,b) даже визуально гораздо "чище", чем a.equals(b)
Re[9]: И снова про equals и LSP
От: ZevS  
Дата: 20.04.07 18:07
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, ZevS, Вы писали:


ZS>>Здравствуйте, Курилка, Вы писали:


ZS>>..


ZS>>>>Ну, я обычно сравниваю объекты на равенство статическим методом базового класса. И мне не важен тип объекта, часто я его и не знаю. По-моему, удобно. Пусть и извращение.


К>>>Ну почему извращение, это как раз по сути логически более правильный способ.


ZS>>Вот и получается, что виртуальный метод Equal необходим.


К>Откуда получается-то?

К>Проблема в том, что это в базовый класс запёхано, поэтому приходиться находить обходные пути.
К>Скажи, зачем тебе реально тут виртуальность нужна?
К>ObjectA.Equals(a,b) даже визуально гораздо "чище", чем a.equals(b)

А если a и b на самом деле являются экземплярами наследника ObjectA?
Re[10]: И снова про equals и LSP
От: Курилка Россия http://kirya.narod.ru/
Дата: 20.04.07 18:10
Оценка:
Здравствуйте, ZevS, Вы писали:

ZS>Здравствуйте, Курилка, Вы писали:


К>>Проблема в том, что это в базовый класс запёхано, поэтому приходиться находить обходные пути.

К>>Скажи, зачем тебе реально тут виртуальность нужна?
К>>ObjectA.Equals(a,b) даже визуально гораздо "чище", чем a.equals(b)

ZS>А если a и b на самом деле являются экземплярами наследника ObjectA?


Если
Ну а даже и если, и если один ObjectA1, другой ObjectA2, плюс в обоих метод переопределён, получаем веселуху
Re[11]: И снова про equals и LSP
От: ZevS  
Дата: 20.04.07 19:32
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, ZevS, Вы писали:


ZS>>Здравствуйте, Курилка, Вы писали:


К>>>Проблема в том, что это в базовый класс запёхано, поэтому приходиться находить обходные пути.

К>>>Скажи, зачем тебе реально тут виртуальность нужна?
К>>>ObjectA.Equals(a,b) даже визуально гораздо "чище", чем a.equals(b)

ZS>>А если a и b на самом деле являются экземплярами наследника ObjectA?


К>Если

К>Ну а даже и если, и если один ObjectA1, другой ObjectA2, плюс в обоих метод переопределён, получаем веселуху

Ну это — по желанию. Можно и статический метод идиотски закодировать.
Re[12]: И снова про equals и LSP
От: Курилка Россия http://kirya.narod.ru/
Дата: 20.04.07 20:13
Оценка:
Здравствуйте, ZevS, Вы писали:

ZS>Здравствуйте, Курилка, Вы писали:


К>>Здравствуйте, ZevS, Вы писали:


ZS>>>Здравствуйте, Курилка, Вы писали:


К>>>>Проблема в том, что это в базовый класс запёхано, поэтому приходиться находить обходные пути.

К>>>>Скажи, зачем тебе реально тут виртуальность нужна?
К>>>>ObjectA.Equals(a,b) даже визуально гораздо "чище", чем a.equals(b)

ZS>>>А если a и b на самом деле являются экземплярами наследника ObjectA?


К>>Если

К>>Ну а даже и если, и если один ObjectA1, другой ObjectA2, плюс в обоих метод переопределён, получаем веселуху

ZS>Ну это — по желанию. Можно и статический метод идиотски закодировать.


Ну ты серьёзно чтоль не улавливаешь разницу? Или тебе надо рассказывать, что статический определён на этапе компиляции, а виртуальный нет?
Re[13]: И снова про equals и LSP
От: ZevS  
Дата: 21.04.07 05:27
Оценка:
Здравствуйте, Курилка, Вы писали:

...

ZS>>Ну это — по желанию. Можно и статический метод идиотски закодировать.


К>Ну ты серьёзно чтоль не улавливаешь разницу? Или тебе надо рассказывать, что статический определён на этапе компиляции, а виртуальный нет?


А собственно Equal то тут при чем?
То что виртульные мотоды определяются через vtm — фича.
Re: И снова про equals и LSP
От: lxa http://aliakseis.livejournal.com
Дата: 21.04.07 07:25
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Тут как-то пару месяцев обсуждали этот метод у Object из .Net в рамках наследования...

Кое-что по теме здесь и здесь.
Re[14]: И снова про equals и LSP
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.04.07 08:17
Оценка:
Здравствуйте, ZevS, Вы писали:

ZS>Здравствуйте, Курилка, Вы писали:


ZS>...


ZS>>>Ну это — по желанию. Можно и статический метод идиотски закодировать.


К>>Ну ты серьёзно чтоль не улавливаешь разницу? Или тебе надо рассказывать, что статический определён на этапе компиляции, а виртуальный нет?


ZS>А собственно Equal то тут при чем?

блин, я думал ты поймёшь, что он статический
ZS>То что виртульные мотоды определяются через vtm — фича.
попробуй понять статью, надоело уже повторять, если честно
Re[2]: И снова про equals и LSP
От: Курилка Россия http://kirya.narod.ru/
Дата: 21.04.07 08:23
Оценка:
Здравствуйте, lxa, Вы писали:

lxa>Здравствуйте, Курилка, Вы писали:


К>>Тут как-то пару месяцев обсуждали этот метод у Object из .Net в рамках наследования...

lxa>Кое-что по теме здесь и здесь.

Сильно не вчитывался, как говорят "много букав"
Только вот всё это похоже на шаманские танцы вокруг грабель.
Вынос в статический метод сделал бы ситуацию много понятней и проще.
Re[12]: И снова про equals и LSP
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.04.07 17:34
Оценка:
Ребяты, вы не офигели так оверквотить?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: И снова про equals и LSP
От: vdimas Россия  
Дата: 23.04.07 21:04
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Тут как-то пару месяцев обсуждали этот метод у Object из .Net в рамках наследования. Нашёл интересную статью по этому поводу (правда там Ява, но ничего это не меняет). Там высказывается вполне корректная на мой взгляд точка зрения: equals не должен быть методом объекта, иначе он будет не симметричным, что ведёт к логическим ошибкам.


Откуда логическая ошибка? Методы вызываются у целевого объекта, соотв. он служит образцом, запутаться невозможно. Понятное дело, что сравнение может быть нессиметричным, если аргумент является подтипом целевого, т.е. может содержать больше аттрибутов.

А во-вторых, у тебе есть требуемая возможность — определяй себе на здоровье static bool operator==(T a, T b) {...}

-----
А фатанатичное стремление соблюдать LSP вообще не понимаю. Согласен лишь с тем, что несоблюдение принципа может привести к популярным ошибкам проетиктирования (наиболее популярная — неоправданное увеличение связанности и последующая трудность независимого развития частей системы), однако его строгое соблюдение так же может спровоцировать лишние телодвижения на ровном месте. ИМХО, зачастую принадлежность некоей классификации удобней устанавливать напрямую через аттрибуты состояния (виртуальные), чем через сетку двойных диспечеризаций и прочих "посетителей".

Простой пример, предположим есть поток, у потока есть метод "Seek(args)", и парный аттрибут "bool CanSeek". Яркий пример нарушения LSP, тем не менее крайне удобный для использования, позволяющий одним if-ом выбрать наиболее подходящий способ работы с потоком.

Так что если нарушение LSP в конкретных случаях не добавляет связанности, но упрощает представление алгоритмов, то почему бы и нет? В обсуждаемом Equals(arg) мы обычно приводим к тому типу, коим являемся, т.е. связанность увеличиться никак не может, наоборот, может резко снизиться, за счёт использования методов уровня базового фреймворка.
Re[2]: И снова про equals и LSP
От: EvilChild Ниоткуда  
Дата: 24.04.07 19:02
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Простой пример, предположим есть поток, у потока есть метод "Seek(args)", и парный аттрибут "bool CanSeek". Яркий пример нарушения LSP, тем не менее крайне удобный для использования, позволяющий одним if-ом выбрать наиболее подходящий способ работы с потоком.


А где он тут нарушается?
now playing: DJ Krust — How To Mutate
Re[3]: И снова про equals и LSP
От: igna Россия  
Дата: 25.04.07 13:05
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Практически в угоду ООП извратили суть отношения равенства, а ёжики "плевались, но лезли на кактус"

К>Правда с практической т.зр. проблема не такая уж страшная.

IMHO в угоду ООП извратили большую часть решаемых программистами-ёжиками задач, а это с практической т.зр. проблема может и не страшная, но весьма противная.
Re[4]: И снова про equals и LSP
От: ZevS  
Дата: 25.04.07 13:09
Оценка:
Здравствуйте, igna, Вы писали:

I>IMHO в угоду ООП извратили большую часть решаемых программистами-ёжиками задач, а это с практической т.зр. проблема может и не страшная, но весьма противная.


"извратили большую часть решаемых ... задач" — это как?
Re[3]: И снова про equals и LSP
От: vdimas Россия  
Дата: 25.04.07 13:20
Оценка:
Здравствуйте, EvilChild, Вы писали:


V>>Простой пример, предположим есть поток, у потока есть метод "Seek(args)", и парный аттрибут "bool CanSeek". Яркий пример нарушения LSP, тем не менее крайне удобный для использования, позволяющий одним if-ом выбрать наиболее подходящий способ работы с потоком.


EC>А где он тут нарушается?



Тут сразу несколько нарушений.

1. Интерфейс класса содержит метод, который заведомо может быть не реализован. По-хорошему таких методов быть не должно, их нужно перенести в некий наследник StreamEx.

2. Собсно запрос CanSeek по смыслу означает запрос is_a(StreamEx) , получи нарушение.

В публичных интерфейсах классов и интерфейсов дотнета полно таких "сладких парочек".
Re[5]: И снова про equals и LSP
От: igna Россия  
Дата: 25.04.07 13:24
Оценка:
Здравствуйте, ZevS, Вы писали:

ZS>"извратили большую часть решаемых ... задач" — это как?


Это так, что большая часть задач естественнее решается без использования ООП. Например вот естественный подход:

FileVersionInfo fvi = GetFileVersionInfo();


А вот кто-то написал так (видимо объектно-ориентированно):

CFileVersionInfo fvi;
fvi.Create();


.NET к счастью использует первый подход, но слегка через одно место:

FileVersionInfo fvi = FileVersionInfo.GetFileVersionInfo();
Re[6]: И снова про equals и LSP
От: ZevS  
Дата: 25.04.07 13:41
Оценка:
Здравствуйте, igna, Вы писали:

...

Какая-то теория заговора получается. Злостные оопэшники извращают задачи.

Во-первых, задачи никто не извращает. Есть различные подходы к их решению. ООП — один из них, и выбор или не выбор его диктуется (в идеале) задачей.
Re[7]: И снова про equals и LSP
От: igna Россия  
Дата: 25.04.07 13:48
Оценка:
Здравствуйте, ZevS, Вы писали:

ZS>Есть различные подходы к их решению. ООП — один из них, и выбор или не выбор его диктуется (в идеале) задачей.


Да, но зачем Java и C# заставляют использовать статические функции вместо обыкновенных в стиле С?
Re[8]: И снова про equals и LSP
От: ZevS  
Дата: 25.04.07 13:55
Оценка: +1
Здравствуйте, igna, Вы писали:

I>Здравствуйте, ZevS, Вы писали:


ZS>>Есть различные подходы к их решению. ООП — один из них, и выбор или не выбор его диктуется (в идеале) задачей.


I>Да, но зачем Java и C# заставляют использовать статические функции вместо обыкновенных в стиле С?


Наверное, потому что C — не ОО язык, а шарп и жаба — да.

ps: лично меня никто не заставляет использовать статические функции. + необходимость в статической функцией не связаной логически с классом возникает крайне редко.
Re[6]: И снова про equals и LSP
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 25.04.07 14:06
Оценка:
Здравствуйте, igna, Вы писали:

I>.NET к счастью использует первый подход, но слегка через одно место:


I>
I>FileVersionInfo fvi = FileVersionInfo.GetFileVersionInfo();
I>


В .NET есть два разных подхода:
DateTime dt1 = File.GetCreationTime("myfile.txt");
DateTime dt2 = new FileInfo("myfile.txt").CreationTime;
... << RSDN@Home 1.2.0 alpha rev. 675>>
AVK Blog
Re[9]: И снова про equals и LSP
От: igna Россия  
Дата: 25.04.07 14:06
Оценка:
Здравствуйте, ZevS, Вы писали:

ZS>ps: лично меня никто не заставляет использовать статические функции. + необходимость в статической функцией не связаной логически с классом возникает крайне редко.


А здесь
Автор: igna
Дата: 25.04.07
какой вариант "твой"?
Re[7]: И снова про equals и LSP
От: igna Россия  
Дата: 25.04.07 14:10
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>В .NET есть два разных подхода:

AVK>DateTime dt1 = File.GetCreationTime("myfile.txt");
AVK>DateTime dt2 = new FileInfo("myfile.txt").CreationTime;


Я бы все же предпочел

DateTime dt = GetCreationTime("myfile.txt");
Re[10]: И снова про equals и LSP
От: ZevS  
Дата: 25.04.07 14:22
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, ZevS, Вы писали:


ZS>>ps: лично меня никто не заставляет использовать статические функции. + необходимость в статической функцией не связаной логически с классом возникает крайне редко.


I>А здесь
Автор: igna
Дата: 25.04.07
какой вариант "твой"?


Зависит от задачи. Возможно ни один из перечисленных: как пример, может потребоваться абстрактная фабрика. Если тебе не нравится ООП — используй указатели на функции. Как по мне, ОО вариант приятнее...
Re[8]: И снова про equals и LSP
От: WolfHound  
Дата: 25.04.07 14:54
Оценка: +1
Здравствуйте, igna, Вы писали:

I>Я бы все же предпочел


I>
I>DateTime dt = GetCreationTime("myfile.txt");
I>


GetCreationTime чего? Из использования совсем не ясно. А вот File.GetCreationTime сразу понятно.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: И снова про equals и LSP
От: igna Россия  
Дата: 25.04.07 15:07
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>GetCreationTime чего? Из использования совсем не ясно. А вот File.GetCreationTime сразу понятно.


Так напиши GetFileCreationTime, заодно и с грамматикой все будет в порядке. Кроме того имеешь выбор, в одних случаях подойдет имя подлинее, в других — покороче.
Re[10]: И снова про equals и LSP
От: igna Россия  
Дата: 25.04.07 15:11
Оценка:
I>Так напиши GetFileCreationTime, заодно и с грамматикой все будет в порядке. Кроме того имеешь выбор, в одних случаях подойдет имя подлинее, в других — покороче.

Даже FileGetCreationTime или File_GetCreationTime можешь написать, и против синтаксиса File.GetCreationTime я ничего против не имею. Но C# и Java не позволяют просто GetCreationTime.
Re[11]: И снова про equals и LSP
От: fmiracle  
Дата: 25.04.07 15:15
Оценка:
Здравствуйте, igna, Вы писали:

I>Даже FileGetCreationTime или File_GetCreationTime можешь написать, и против синтаксиса File.GetCreationTime я ничего против не имею. Но C# и Java не позволяют просто GetCreationTime.


Пространства имен. Не нужно объяснять какая у них польза?

Статические методы можно рассматривать как вариант метода в пространтве имен
Re[12]: И снова про equals и LSP
От: igna Россия  
Дата: 25.04.07 15:19
Оценка:
Здравствуйте, fmiracle, Вы писали:

F>Статические методы можно рассматривать как вариант метода в пространтве имен


Только вот без возможности написать using порой получается словоблудие.
Re[8]: И снова про equals и LSP
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.04.07 03:00
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, AndrewVK, Вы писали:


AVK>>В .NET есть два разных подхода:

I>
AVK>>DateTime dt1 = File.GetCreationTime("myfile.txt");
AVK>>DateTime dt2 = new FileInfo("myfile.txt").CreationTime;
I>


I>Я бы все же предпочел


I>
I>DateTime dt = GetCreationTime("myfile.txt");
I>

Всё зависит от того, что имеется в виду. У FileInfo может быть произвольное количество конструкторов, которые позволяют уточнить всякие дополнительные параметры. Удобнее иметь 5 конструкторов объекта, у которого можно потом позвать GetCreationTime, GetLastAccessTime и так далее, чем иметь по 5 перегрузок на каждый метод.
А между
File.GetCreationTime("myfile.txt");

и
GetFileCreationTime("myfile.txt");

я принципиальной разницы не вижу.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: И снова про equals и LSP
От: Курилка Россия http://kirya.narod.ru/
Дата: 26.04.07 05:05
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>А между

S>
S>File.GetCreationTime("myfile.txt");
S>

S>и
S>
S>GetFileCreationTime("myfile.txt");
S>

S>я принципиальной разницы не вижу.

В данном примере соглашусь, а что, скажем по поводу Array.Sort?
Зачем мне неймспейс вот тут:

Array.Sort( apples, applesComparer );


+ зачем мне отдельный класс и инстанс компарера?
Re[10]: И снова про equals и LSP
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.04.07 05:25
Оценка:
Здравствуйте, Курилка, Вы писали:

К>+ зачем мне отдельный класс и инстанс компарера?

Как зачем? Для того, чтобы иметь возможность иметь разные компараторы. Разные инстансы могут иметь разное состояние, которое определяет их поведение.
Да, всё то же самое можно сэмулировать при помощи чистых функций, но ничего особенно интересного от этого не произойдет. Это будет всего лишь другой взгляд на те же самые вещи. В дотнете вызов делегата все еще дороже, чем вызов метода интерфейса, поэтому данный выбор оправдан технически.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[11]: И снова про equals и LSP
От: Курилка Россия http://kirya.narod.ru/
Дата: 26.04.07 06:05
Оценка:
Здравствуйте, Sinclair, Вы писали:

...

Вот и получаем, что "упираемся" по сути в .Net и ООП идеологию. На первый вопрос у тебя нет ответа?
Re[12]: И снова про equals и LSP
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.04.07 06:25
Оценка:
Здравствуйте, Курилка, Вы писали:
К>Вот и получаем, что "упираемся" по сути в .Net и ООП идеологию. На первый вопрос у тебя нет ответа?
Какой? Про неймспейс? Это недоработка языка. В следующем шарпе ея поправят. Будешь себе писать apples.Sort(appleComparer) и в ус не дуть. А то и вовсе apples.SortBy(apple => apple.Color);
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[13]: [OFFTOP]И снова про equals и LSP
От: Курилка Россия http://kirya.narod.ru/
Дата: 26.04.07 06:37
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Какой? Про неймспейс? Это недоработка языка. В следующем шарпе ея поправят. Будешь себе писать apples.Sort(appleComparer) и в ус не дуть. А то и вовсе apples.SortBy(apple => apple.Color);


Сенкс, правда на шарпе писать не уверен, что буду.
Плюс довольно странная с логической т.зр. сортировка (по меньшей мере для меня) — вот ты с ходу ответишь какой цвет больше пурпурный или оранжевый?
Т.е. не вижу как построить для цветов отношение порядка, чтоб оно было понятным человеку и непротиворечивым.
Re[14]: [OFFTOP]И снова про equals и LSP
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.04.07 06:48
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Сенкс, правда на шарпе писать не уверен, что буду.

Никто и не навязывает.
К>Плюс довольно странная с логической т.зр. сортировка (по меньшей мере для меня) — вот ты с ходу ответишь какой цвет больше пурпурный или оранжевый?
Это неважно. Не я придумал сортировать яблоки — не мне и критерий изобретать. Может, там червивость роль играет.
Главная идея OrderBy().ThenBy() — в том, что вместо функции, отображающей пару объектов на {-1, 0, 1}, используется функция, отображающая объект в ключ сортировки (предполагается, что для ключа компаратор уже существует). Иногда проще написать одно, иногда — другое.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[15]: [OFFTOP]И снова про equals и LSP
От: Курилка Россия http://kirya.narod.ru/
Дата: 26.04.07 06:56
Оценка:
Здравствуйте, Sinclair, Вы писали:

...

Ну эт всё ясно.
У меня вот к этому был вопрос/претензия:

К>+ зачем мне отдельный класс и инстанс компарера?
Как зачем? Для того, чтобы иметь возможность иметь разные компараторы. Разные инстансы могут иметь разное состояние, которое определяет их поведение.


Откуда в компараторе состояние? Если этим ты описываешь какие-то параметры сортировки, то ещё понятно.
Но это состоянием не будет, а правильней было бы только в конструкторе реализовывать, чтоб гарантировать иммутабельность компаратора.
Иначе работа сортировки будет зависеть от алгоритма сортировки, думаю, сам понимаешь, что такие эффекты "чреваты боком".
Re[14]: [OFFTOP]И снова про equals и LSP
От: fmiracle  
Дата: 26.04.07 07:10
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Плюс довольно странная с логической т.зр. сортировка (по меньшей мере для меня) — вот ты с ходу ответишь какой цвет больше пурпурный или оранжевый?

К>Т.е. не вижу как построить для цветов отношение порядка, чтоб оно было понятным человеку и непротиворечивым.

ОФФТОП: Например, есть понятие "цветовой температуры", т.е. до какой температуры надо разогреть тело, чтобы оно светилось данным цветом. Используется в некотрых областях и при определенном навыке становится понятным и непротиворечивым
Re[15]: [OFFTOP]И снова про equals и LSP
От: Курилка Россия http://kirya.narod.ru/
Дата: 26.04.07 07:15
Оценка:
Здравствуйте, fmiracle, Вы писали:

F>Здравствуйте, Курилка, Вы писали:


К>>Т.е. не вижу как построить для цветов отношение порядка, чтоб оно было понятным человеку и непротиворечивым.


F>ОФФТОП: Например, есть понятие "цветовой температуры", т.е. до какой температуры надо разогреть тело, чтобы оно светилось данным цветом. Используется в некотрых областях и при определенном навыке становится понятным и непротиворечивым


Ну для каких-нибудь физиков плазмы и чего-нибудь подобного это будет логично, но вот обычным людям это будет далеко не близко
Плюс что-то читал по поводу, что пурпурного цвета в спектре нет и он получается смешением цветов из разных участков. (Фактически наш мозг что-то такое делает, уже не помню чётко подробности)
Но, блин, хватит уже оффтопить
Re[16]: [OFFTOP]И снова про equals и LSP
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.04.07 07:22
Оценка:
Здравствуйте, Курилка, Вы писали:
К>Откуда в компараторе состояние? Если этим ты описываешь какие-то параметры сортировки, то ещё понятно.
Ага.
К>Но это состоянием не будет, а правильней было бы только в конструкторе реализовывать, чтоб гарантировать иммутабельность компаратора.
Ну, это конечно можно. Но я не уверен, что компаратор обязательно должен быть иммутабельным. В процессе сортировки его неизменность обеспечивается отсутствием меняющих состояние методов в его интерфейсе. Но совершенно необязательно требовать, чтобы компаратор в течение всего времени жизни был иммутабельным.

К>Иначе работа сортировки будет зависеть от алгоритма сортировки, думаю, сам понимаешь, что такие эффекты "чреваты боком".

Гм. Работа сортировки и так зависит от алгоритма сортировки.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[17]: [OFFTOP]И снова про equals и LSP
От: Курилка Россия http://kirya.narod.ru/
Дата: 26.04.07 07:36
Оценка:
Здравствуйте, Sinclair, Вы писали:

К>>Иначе работа сортировки будет зависеть от алгоритма сортировки, думаю, сам понимаешь, что такие эффекты "чреваты боком".

S>Гм. Работа сортировки и так зависит от алгоритма сортировки.
Ты имеешь в виду порядок элементов которые согласно компаратору равны? Ну это само собой.
Я же про другое — когда результат компаратора будет зависеть от меняющегося состояния (зависимого от предыдущих сравнений). Но это вообще будет какой-то полный абзац, конечно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.