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, Вы писали:
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>>
Здравствуйте, selfmade, Вы писали:
S>Кстати, я правильно понимаю, что этот форум имеет некую премодерацию? S>А то я запостил два сообщения, одно появилось на следующий день, а второе ещё не появилось вовсе.
Здравствуйте, AndrewVK, Вы писали:
ARK>>Хз насчет ожиданий, однако сейчас посмотрел — действительно какой-то распухший монстр.
AVK>Вопрос все тот же — что конкретно лишнее и почему?
Да много чего лишнее. Вместо трех классов — шесть, да еще и интерфейс к ним.
Структуры вообще не нужны. Оверхед? С# сам по себе оверхед, кому такие мелочи важны, на нем писать и так не будет.
Шорткаты не нужны, какая-то экономия на спичках.
// вместоif (option is Some) { }
// пишемif (option.IsSome) { } // аж один символ сэкономили
// а еще можно такif (option.HasValue) { } // то же самое, зато по другому написано, чтоб читающий не расслаблялся
Автоматические касты не нужны, понимание кода только запутывают.
ИМХО, это напоминает "архитектурную астронавтию" по Спольски.
Вот еще хороший код:
public override int GetHashCode() => HasValue ? 0 : EqualityComparer<T>.Default.GetHashCode(Value);
Здравствуйте, 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>
Здравствуйте, 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>Все что ты описал к архитектуре вообще отношения не имеет.
А архитектуры на уровне классов не бывает? Вот это новость.
Здравствуйте, 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>>
ARK>>ValueOption не нужен, и интерфейс тоже.
IT>В принципе, после этого заявления дискуссию можно не продолжать.
Абсолютно. Какую задачу ставил перед собой разработчик этого, с позволения сказать, Option? Мне казалось, что "шашечки" как в теории, но оказалось:
1. "ехать" и шоб "бохато".
2. а вдруг простой народ ниасилит разницу между None и Some
3. а в моём случае у меня тут Value Type, так давайте для него сделаем свой, специфичный ValueOption. Nullable?
Ну едьте, чё, вот и на C до сих пор ездят, а я более строгой (*) имплементации подожду.
(*) — хотя бы через подклассы, в отсутствие нормальных полиморфических типов.