Re[4]: Неправильная реализация Option
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.11.16 21:55
Оценка:
Здравствуйте, selfmade, Вы писали:

S>Люди, знакомые с понятием Option из теории типов, ожидают
Option a = None | Some a
. Остальным оно не нужно.

S>Текущая имплементация в CodeJam — это какой-то монстр, не имеющий ничего общего с ожиданиями.

Это все ни о чем. Давай поконкретнее.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[5]: Неправильная реализация Option
От: selfmade США about:blank
Дата: 08.11.16 18:50
Оценка: :)
S>>Люди, знакомые с понятием Option из теории типов, ожидают
Option a = None | Some a
. Остальным оно не нужно.

S>>Текущая имплементация в CodeJam — это какой-то монстр, не имеющий ничего общего с ожиданиями.

AVK>Это все ни о чем. Давай поконкретнее.


public abstract class Option<T>
{
    public sealed class None<T> : Option<T> {}

    public sealed class Some<T> : Option<T>
    {
        public readonly T Value;

        public Some(T value)
        {
            Value = value;
        }
    }

    #region Optional helper methods, not sure what names should be or/and if they are even necessary
    
    public static Option<T> GetNone() { return new None(); }

    public static Option<T> GetSome(T value) { return new Some(value); }

    #endregion
}


Всё остальное — от лукавого. Бремя доказательства необходимости лежит на том, кто предлагает, а не на том, кто критикует (Чайник Рассела).
С уважением. selfmade.
Re[5]: Неправильная реализация Option
От: selfmade США about:blank
Дата: 08.11.16 18:53
Оценка:
Кстати, я правильно понимаю, что этот форум имеет некую премодерацию?
А то я запостил два сообщения, одно появилось на следующий день, а второе ещё не появилось вовсе.
Какой-то прошлый век.
С уважением. selfmade.
Re[6]: Неправильная реализация Option
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.11.16 22:51
Оценка:
Здравствуйте, selfmade, Вы писали:

S>public abstract class Option<T>

S>{
S> public sealed class None<T> : Option<T> {}
S> public sealed class Some<T> : Option<T>

Почему именно так? Какую цель здесь преследует наследование? Это в качестве затравки для дискуссии.
Ну и по прежденму неясно, что тебя не устраивает. Практически точно такое оно сейчас и есть.

S>Всё остальное — от лукавого.


Почему? И что там остального? HasValue/IsSome/IsNone это просто шоткаты, None позволяет не плодить лишние инстансы, операторы сильно сокращают мусор в коде в некоторых случаях, реализация IEquatable позволяет помещать тип в стандартные контейнеры без лишних приседаний, а ToString упрощает отладку.

S> Бремя доказательства необходимости лежит на том, кто предлагает


Ну так ты ж предлагаешь все сделать не так как сейчас, не? Вот и хотелось бы услышать что то конкретное, а не голословные и безапелляционные утверждения. Ты же не считаешь себя непререкаемым авторитетом, верно?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Отредактировано 08.11.2016 23:02 AndrewVK . Предыдущая версия . Еще …
Отредактировано 08.11.2016 23:01 AndrewVK . Предыдущая версия .
Re[6]: Неправильная реализация Option
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.11.16 22:51
Оценка:
Здравствуйте, selfmade, Вы писали:

S>Кстати, я правильно понимаю, что этот форум имеет некую премодерацию?


Нет.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[6]: Неправильная реализация Option
От: Lexey Россия  
Дата: 09.11.16 13:05
Оценка:
Здравствуйте, selfmade, Вы писали:

S>Кстати, я правильно понимаю, что этот форум имеет некую премодерацию?

S>А то я запостил два сообщения, одно появилось на следующий день, а второе ещё не появилось вовсе.

Это кэширование дурит. Рефреш фрейма помогает.
"Будь достоин победы" (c) 8th Wizard's rule.
Re[7]: Неправильная реализация Option
От: selfmade США about:blank
Дата: 09.11.16 15:46
Оценка: :)
L>Это кэширование дурит. Рефреш фрейма помогает.

Мы в 21-м веке или где?
С уважением. selfmade.
Re[4]: Неправильная реализация Option
От: AlexRK  
Дата: 09.11.16 16:47
Оценка:
Здравствуйте, selfmade, Вы писали:

S>Текущая имплементация в CodeJam — это какой-то монстр, не имеющий ничего общего с ожиданиями.


Хз насчет ожиданий, однако сейчас посмотрел — действительно какой-то распухший монстр.
Re[5]: Неправильная реализация Option
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.11.16 17:32
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Хз насчет ожиданий, однако сейчас посмотрел — действительно какой-то распухший монстр.


Вопрос все тот же — что конкретно лишнее и почему?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[6]: Неправильная реализация Option
От: AlexRK  
Дата: 09.11.16 17:56
Оценка: :)
Здравствуйте, AndrewVK, Вы писали:

ARK>>Хз насчет ожиданий, однако сейчас посмотрел — действительно какой-то распухший монстр.


AVK>Вопрос все тот же — что конкретно лишнее и почему?


Да много чего лишнее. Вместо трех классов — шесть, да еще и интерфейс к ним.

Структуры вообще не нужны. Оверхед? С# сам по себе оверхед, кому такие мелочи важны, на нем писать и так не будет.

Шорткаты не нужны, какая-то экономия на спичках.
// вместо
if (option is Some) { }

// пишем
if (option.IsSome) { }     // аж один символ сэкономили

// а еще можно так
if (option.HasValue) { }   // то же самое, зато по другому написано, чтоб читающий не расслаблялся


Автоматические касты не нужны, понимание кода только запутывают.

ИМХО, это напоминает "архитектурную астронавтию" по Спольски.

Вот еще хороший код:
public override int GetHashCode() => HasValue ? 0 : EqualityComparer<T>.Default.GetHashCode(Value);
Re[7]: Неправильная реализация Option
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.11.16 20:17
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Да много чего лишнее.


Это не ответ.

ARK> Вместо трех классов — шесть,


Где ты там 6 насчитал? 3 и есть.

ARK> да еще и интерфейс к ним.


Интерфейс нужен для написания дженериков, работающих и с Option и с ValueOption.

ARK>Структуры вообще не нужны.


Нужны.

ARK> Оверхед?


В определенных сценариях — огромный.

ARK> С# сам по себе оверхед


Не настолько.

ARK>кому такие мелочи важны


Это совсем не мелочи.

ARK>// вместо

ARK>if (option is Some) { }
ARK>// пишем
ARK>if (option.IsSome) { } // аж один символ сэкономили

Это мелочь, которая никому особо не мешает, зато не требует для понимания знания о существовании Some и None.
Но конкретно эти два свойства можно убрать. Вопрос только зачем?

ARK>// а еще можно так

ARK>if (option.HasValue) { } // то же самое, зато по другому написано, чтоб читающий не расслаблялся

Это реализация метода интерфейса IOption.

ARK>Автоматические касты не нужны,


В некоторых сценариях — нужны.

ARK> понимание кода только запутывают.


Обилие вызовов конструкторов или фабричных методов, вкупе с множеством .Value тоже вполне себе запутывает, да и голову никто не отменял.

ARK>ИМХО, это напоминает "архитектурную астронавтию" по Спольски.


Все что ты описал к архитектуре вообще отношения не имеет.

ARK>Вот еще хороший код:

ARK>
ARK>public override int GetHashCode() => HasValue ? 0 : EqualityComparer<T>.Default.GetHashCode(Value);
ARK>


Опечатка, бывает. Все равно в наследниках перегружено.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[8]: Неправильная реализация Option
От: AlexRK  
Дата: 09.11.16 20:36
Оценка:
Здравствуйте, AndrewVK, Вы писали:

ARK>> Вместо трех классов — шесть,

AVK>Где ты там 6 насчитал? 3 и есть.

В одном только Option — абстрактный класс и два внутренних, плюс еще структура и хелперы.

ARK>> да еще и интерфейс к ним.

AVK>Интерфейс нужен для написания дженериков, работающих и с Option и с ValueOption.

ValueOption не нужен, и интерфейс тоже.

ARK>>Структуры вообще не нужны.

AVK>Нужны.
ARK>>кому такие мелочи важны
AVK>Это совсем не мелочи.

Кому нужен производительный код, все равно будет использовать свои специфические структуры. А вы хотите угодить всем. Option используют для наглядности, а не для скорости.

AVK>зато не требует для понимания знания о существовании Some и None.


При написании кода — да, при чтении — нет. Зато при чтении имеем один способ выражения "option is Some" вместо трех. Чтение важнее написания.

AVK>Но конкретно эти два свойства можно убрать. Вопрос только зачем?


ИМХО, надо изначально задавать вопрос "зачем они нужны", а не сперва делать, а потом задавать вопрос "зачем их убирать".
Ответ на изначальный вопрос — да вроде низачем они не нужны.

AVK>Это реализация метода интерфейса IOption.


А так как интерфейс IOption не нужен, то и этот метод тоже.

AVK>В определенных сценариях — огромный.

AVK>В некоторых сценариях — нужны.

Ну вот из-за "некоторых" и "определенных" сценариев вместо простого понятного класса получился раздутый всемогутор.

AVK>Обилие вызовов конструкторов или фабричных методов, вкупе с множеством .Value тоже вполне себе запутывает, да и голову никто не отменял.


Ну, везде важна мера, конечно. Однако интересно было бы глянуть код, который действительно выигрывает от наличия автокастов.

ARK>>ИМХО, это напоминает "архитектурную астронавтию" по Спольски.

AVK>Все что ты описал к архитектуре вообще отношения не имеет.

А архитектуры на уровне классов не бывает? Вот это новость.
Re[9]: Неправильная реализация Option
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.11.16 20:49
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>>> Вместо трех классов — шесть,

AVK>>Где ты там 6 насчитал? 3 и есть.
ARK>В одном только Option — абстрактный класс и два внутренних,

Итого 3.

ARK> плюс еще структура и хелперы.


Структура это структура, совершенно отдельный функционал. А статические классы как раз наоборот призваны разгрузить интерфейсы основных типов.

AVK>>Это совсем не мелочи.

ARK>Кому нужен производительный код, все равно будет использовать свои специфические структуры.

Зачем? Что нового он там добавит по сравнению с готовой?

ARK> А вы хотите угодить всем.


Хотим.

AVK>>зато не требует для понимания знания о существовании Some и None.

ARK>При написании кода — да, при чтении — нет.

И при чтении тоже. Потому что конструкция is обычно применяется для проверки типа. А то что в конкретной реализации тип и наличие значения совпадает — это уже подробности, для чтения кода скорее всего лишние.

AVK>>В определенных сценариях — огромный.

AVK>>В некоторых сценариях — нужны.
ARK>Ну вот из-за "некоторых" и "определенных" сценариев вместо простого понятного класса получился раздутый всемогутор.

Некоторый сценарий называется массив или коллекция. Сценарий настолько распространенный, что игнорировать его довольно глупо.

AVK>>Обилие вызовов конструкторов или фабричных методов, вкупе с множеством .Value тоже вполне себе запутывает, да и голову никто не отменял.

ARK>Ну, везде важна мера, конечно. Однако интересно было бы глянуть код, который действительно выигрывает от наличия автокастов.

nullable типы когда нибудь использовал? Здесь абсолютно идентичная ситуация. А уж перегрузок операторов сравнения в фреймворке хоть попой кушай.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[9]: Неправильная реализация Option
От: IT Россия linq2db.com
Дата: 11.11.16 03:36
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>ValueOption не нужен, и интерфейс тоже.


В принципе, после этого заявления дискуссию можно не продолжать.
Если нам не помогут, то мы тоже никого не пощадим.
Re[10]: Неправильная реализация Option
От: selfmade США about:blank
Дата: 12.11.16 19:24
Оценка:
ARK>>ValueOption не нужен, и интерфейс тоже.

IT>В принципе, после этого заявления дискуссию можно не продолжать.


Абсолютно. Какую задачу ставил перед собой разработчик этого, с позволения сказать, Option? Мне казалось, что "шашечки" как в теории, но оказалось:
1. "ехать" и шоб "бохато".
2. а вдруг простой народ ниасилит разницу между None и Some
3. а в моём случае у меня тут Value Type, так давайте для него сделаем свой, специфичный ValueOption. Nullable?

Ну едьте, чё, вот и на C до сих пор ездят, а я более строгой (*) имплементации подожду.

(*) — хотя бы через подклассы, в отсутствие нормальных полиморфических типов.
С уважением. selfmade.
Re[6]: Неправильная реализация Option
От: selfmade США about:blank
Дата: 12.11.16 19:30
Оценка:
S>>Несерьёзно: Ну да. Я ж говорю, в нынешнем шарпе классический Option не сильно полезен.

AVK>Вобщем то да. Но без Match он совсем бесполезен.


Всяких самописных Match как крапивы за баней. Многие вполне поймут (x => x is None, x => whatever)
С уважением. selfmade.
Re[7]: Неправильная реализация Option
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 12.11.16 22:07
Оценка:
Здравствуйте, selfmade, Вы писали:

AVK>>Вобщем то да. Но без Match он совсем бесполезен.

S>Всяких самописных Match как крапивы за баней.

И?

S> Многие вполне поймут (x => x is None, x => whatever)


Это ты что пытался продемонстрировать?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[11]: Неправильная реализация Option
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 12.11.16 22:08
Оценка:
Здравствуйте, selfmade, Вы писали:

S>(*) — хотя бы через подклассы, в отсутствие нормальных полиморфических типов.


Ну так оно и реализовано через подклассы. Что тебя не устраивает то?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.