Code.NotNull только для ссылочных типов
От: _NN_ www.nemerleweb.com
Дата: 18.02.19 20:33
Оценка: +1
Идея здравая, но как тогда писать обобщённый код для обобщений ?

void F<T>(T t) { Code.NotNull(t, nameof(t)); }
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Code.NotNull только для ссылочных типов
От: Sinix  
Дата: 20.02.19 06:13
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Идея здравая, но как тогда писать обобщённый код для обобщений ?

Сделать свой ассерт
Задача CJ — не покрыть все сценарии любой ценой. Гораздо выгоднее покрыть лучшие из возможных и оставить механизм реализации для остальных.
CodeExceptions — как раз такой механизм.
Re[2]: Code.NotNull только для ссылочных типов
От: _NN_ www.nemerleweb.com
Дата: 20.02.19 06:34
Оценка:
Здравствуйте, Sinix, Вы писали:

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


_NN>>Идея здравая, но как тогда писать обобщённый код для обобщений ?

S>Сделать свой ассерт
S>Задача CJ — не покрыть все сценарии любой ценой. Гораздо выгоднее покрыть лучшие из возможных и оставить механизм реализации для остальных.
S>CodeExceptions — как раз такой механизм.

А в самом CodeJam что делать ?
Писать if throw ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Code.NotNull только для ссылочных типов
От: rameel https://github.com/rsdn/CodeJam
Дата: 20.02.19 06:58
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Задача CJ — не покрыть все сценарии любой ценой. Гораздо выгоднее покрыть лучшие из возможных и оставить механизм реализации для остальных.


Я согласен с NN. И потом, лучше иметь единообразный подход, чем разношерстный, а сейчас у нас получается, что для одних случаев можем писать так, а в другом вынуждены городить огород. К тому же без ограничения where T : class код покрывает не лучшие из возможных, а все, и бесплатно
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Отредактировано 20.02.2019 7:12 rameel . Предыдущая версия . Еще …
Отредактировано 20.02.2019 7:10 rameel . Предыдущая версия .
Отредактировано 20.02.2019 7:02 rameel . Предыдущая версия .
Отредактировано 20.02.2019 7:01 rameel . Предыдущая версия .
Re[3]: Code.NotNull только для ссылочных типов
От: Sinix  
Дата: 21.02.19 12:08
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>А в самом CodeJam что делать ?

_NN>Писать if throw ?
писать код, который оптимизирует JIT
if (value == null)
  throw CodeExceptions.NotNull(...);

Для value-типов это условие будет полностью убрано JIT-ом. Вызов метолов не будет оптимизирован емнип для FW младше четвёртого.
Re[3]: Code.NotNull только для ссылочных типов
От: Sinix  
Дата: 21.02.19 12:11
Оценка:
Здравствуйте, rameel, Вы писали:

R>Я согласен с NN. И потом, лучше иметь единообразный подход, чем разношерстный, а сейчас у нас получается, что для одних случаев можем писать так, а в другом вынуждены городить огород. К тому же без ограничения where T : class код покрывает не лучшие из возможных, а все, и бесплатно


И получаем возможность писать badsmell вида
Code.NotNull(2, "Why not?");

Мы пишем инфраструктурный код для 99% пользователей, не для единиц спецов. Поэтому чем проще и однозначнее API, тем лучше.
Re[4]: Code.NotNull только для ссылочных типов
От: rameel https://github.com/rsdn/CodeJam
Дата: 22.02.19 18:05
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>И получаем возможность писать badsmell вида

S>
S>Code.NotNull(2, "Why not?");
S>


Badsmell писать и сейчас можно
Code.NotNull(new object(), "Why not?");


В плане абусурдности на одной полке. Зато когда надо писать код, упираешься в то, что generic обязан быть классом, либо писать по старинке

Например, расширение dictionary.TryAdd и ему подобные, ключ обязан быть не-null, но написать Code.NotNull мы не можем... Вот и получается, кто в лес, кто по дрова.

S>Мы пишем инфраструктурный код для 99% пользователей, не для единиц спецов. Поэтому чем проще и однозначнее API, тем лучше.


Думается, что человек воспринимающий TKey key == null не запутается и при виде Code.NotNull, скорее наоборот, удивится почему нельзя?

ЗЫ. С другой стороны, у нас в компании все "проаннотиравано", поэтому NotNull-ассертами пользуемся только если ошибка не проявит себя сразу при вызове метода, а вообще ждем C#8 с его nonnullable типами
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[5]: Code.NotNull только для ссылочных типов
От: Sinix  
Дата: 22.02.19 18:09
Оценка:
Здравствуйте, rameel, Вы писали:

R>Например, расширение dictionary.TryAdd и ему подобные, ключ обязан быть не-null, но написать Code.NotNull мы не можем... Вот и получается, кто в лес, кто по дрова.

Ну вот я для таких вещей предпочитаю старый if-throw стиль, т.к. jit его гарантированно оптимайзит даже для древних FW. А вне хелперов "универсальные" проверки и не нужны, как правило.

Если реально нужно — добавим, если нет — нет

R>ЗЫ. С другой стороны, у нас в компании все "проаннотиравано", поэтому NotNull-ассертами пользуемся только если ошибка не проявит себя сразу при вызове метода, а вообще ждем C#8 с его nonnullable типами

+1
Отредактировано 22.02.2019 18:09 Sinix . Предыдущая версия .
Re[6]: Code.NotNull только для ссылочных типов
От: rameel https://github.com/rsdn/CodeJam
Дата: 22.02.19 18:16
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Если реально нужно — добавим, если нет — нет


... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[5]: Code.NotNull только для ссылочных типов
От: _NN_ www.nemerleweb.com
Дата: 23.02.19 12:56
Оценка:
Здравствуйте, rameel, Вы писали:

R>ЗЫ. С другой стороны, у нас в компании все "проаннотиравано", поэтому NotNull-ассертами пользуемся только если ошибка не проявит себя сразу при вызове метода, а вообще ждем C#8 с его nonnullable типами


Не у всех ReSharper
К тому же даже с аннотациями может пройти null незамеченным.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: Code.NotNull только для ссылочных типов
От: rameel https://github.com/rsdn/CodeJam
Дата: 23.02.19 13:23
Оценка:
Здравствуйте, _NN_, Вы писали:

R>>ЗЫ. С другой стороны, у нас в компании все "проаннотиравано", поэтому NotNull-ассертами пользуемся только если ошибка не проявит себя сразу при вызове метода, а вообще ждем C#8 с его nonnullable типами


_NN>К тому же даже с аннотациями может пройти null незамеченным.


Поэтому NotNull-ассертами пользуемся только если ошибка не проявит себя сразу при вызове метода
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re: Code.NotNull только для ссылочных типов
От: IT Россия linq2db.com
Дата: 13.03.19 12:57
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Идея здравая, но как тогда писать обобщённый код для обобщений ?


А в чём проблема?

void NotNull<T>(T obj)
    where T : class
{
}

void NotNull<T>(T? obj)
    where T : struct
{
}
Если нам не помогут, то мы тоже никого не пощадим.
Отредактировано 13.03.2019 12:58 IT . Предыдущая версия .
Re[2]: Code.NotNull только для ссылочных типов
От: _NN_ www.nemerleweb.com
Дата: 13.03.19 13:27
Оценка:
Здравствуйте, IT, Вы писали:

IT>А в чём проблема?

Так нельзя

using System;

public class A
{
    
static void NotNull<T>(T obj)
    where T : class
{
}

static void NotNull<T>(T? obj)
    where T : struct
{
}
    
    static void F<T>(T t) { NotNull(t); }
    
    public static void Main()
    {
    }
}



Compilation error (line 16, col 26): The type 'T' must be a reference type in order to use it as parameter 'T' in the generic type or method 'A.NotNull<T>(T)


https://dotnetfiddle.net/wmeGXS
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Code.NotNull только для ссылочных типов
От: IT Россия linq2db.com
Дата: 15.03.19 19:11
Оценка:
Здравствуйте, _NN_, Вы писали:

IT>>А в чём проблема?

_NN>Так нельзя

Т.е. с F<T> таких проблем нет?
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Code.NotNull только для ссылочных типов
От: _NN_ www.nemerleweb.com
Дата: 16.04.19 17:11
Оценка:
Здравствуйте, IT, Вы писали:

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


IT>>>А в чём проблема?

_NN>>Так нельзя

IT>Т.е. с F<T> таких проблем нет?

Если не указывать ограничения на обобщённый тип то нет.

void F<T>(T t) { if(t==null) throw new ArgumentNullException("t"); }
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Code.NotNull только для ссылочных типов
От: _NN_ www.nemerleweb.com
Дата: 10.12.19 07:57
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Идея здравая, но как тогда писать обобщённый код для обобщений ?


_NN>
_NN>void F<T>(T t) { Code.NotNull(t, nameof(t)); }
_NN>


Кстати, в Synergy.FailIfNull решили не заморачиваться и работает для всех типов.

Пользуясь случаем, вопрос, не стоит ли добавить в CodeJam атрибут ?
[ContractAnnotation("value: null => halt; value: notnull => notnull")]
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Code.NotNull только для ссылочных типов
От: Ночной Смотрящий Россия  
Дата: 10.12.19 08:38
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Пользуясь случаем, вопрос, не стоит ли добавить в CodeJam атрибут ?

_NN>
_NN>[ContractAnnotation("value: null => halt; value: notnull => notnull")]
_NN>


"value: notnull => notnull" для void метода зачем?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[3]: Code.NotNull только для ссылочных типов
От: _NN_ www.nemerleweb.com
Дата: 10.12.19 09:31
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, _NN_, Вы писали:


_NN>>Пользуясь случаем, вопрос, не стоит ли добавить в CodeJam атрибут ?

_NN>>
_NN>>[ContractAnnotation("value: null => halt; value: notnull => notnull")]
_NN>>


НС>"value: notnull => notnull" для void метода зачем?

Согласен, эта часть лишняя в Code.NotNull.

В Synergy метод возвращает значение.
 public static T FailIfNull<T>(
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Code.NotNull только для ссылочных типов
От: Ночной Смотрящий Россия  
Дата: 10.12.19 10:04
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>В Synergy метод возвращает значение.

_NN>
 public static T FailIfNull<T>(


И зачем он это делает?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[5]: Code.NotNull только для ссылочных типов
От: _NN_ www.nemerleweb.com
Дата: 10.12.19 10:20
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, _NN_, Вы писали:


_NN>>В Synergy метод возвращает значение.

_NN>>
 public static T FailIfNull<T>(


НС>И зачем он это делает?


Чтобы писать цепочку вызовов, хотя сегодня с ?. это уже не очень актуально.


        [NotNull]
        public string GetCity()
        {
            return this.Address.FailIfNull(nameof(this.Address))
                       .City.FailIfNull(nameof(this.Address.City));
        }
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.