.NET und C# ohne Web?
Правда? А если написать нормально?
Это ты называешь нормально? :) За такое "нормально" тоже надо отрывать руки :)
Т.е. мало того, что ты поменял типы данных у стороннего объекта с int на int?, так ты еще добавил дополнительный геттер туда, где он нахрен не нужен. И все этот огород из-за того, чтобы ты не любешь исключения :D
Есть еще по крайней мере пара способов сообщить об ошибке.
Ага, вернуть номер ошибки как всатые добрые 70-е :)
Ты пытаешься сказать что int?.HasValue
не дает тебе достаточно информации чтобы понять было значение получено и присвоено или это не получилось?
Самому не смешно?
Не смешно. Особенно, когда ты рассказываешь, что пишешь софт для производства. int.Parse кидает не только FormatException. Если у тебя входная строка null (а ты, я вижу любишь возвращать null'ы), то твой подход просто проглотит исключение и будешь ты долго и упорно искать причину проблемы, которая лежит за пределами int.Parse
Правда? А если написать нормально?
someObject.Val1 = int.Parse(strVal1);
someObject.Val2 = int.Parse(strVal2);
someObject.Val3 = int.Parse(strVal3);
someObject.Val4 = int.Parse(strVal4);
someObject.Val5 = int.Parse(strVal5);
if(!someObject.HasAllValues)
logger.Error ("Can't parse value");Имхо здесь 2 возможные проблемы. В примере независимые вызовы. Если же последующие вызовы зависят от результата предыдущих, то необходимо перед каждым вызовом ставить проверку и обработку возможных проблем. И кроме того, если одна функция не прошла, возможно нет смысл прогонять остальные. Ну и кроме того обработку исключительного состояния можно организовать на любом уровне стека. А так придется тащить HasAllValues еще куда-то,
поменял типы данных у стороннего объекта
------
Я просто скопипастил твой код - ленивый Я, лениво писать тип в каждой строке.
чтобы ты не любешь исключения
-----
Над мал-мал на рЮсская языка переводить...
Что до исключенй - когда надо - пользуюсь. Но - да - предпочитаю код где они не нужны. не не используются, а не нужны.
твой подход просто проглотит исключение
-----
Как можно проглотить то чего нету?
Ну посмотри на это сбоку.
Есть метод bool TryParse(string source, out int val)
Предлагается замена int? Parse(string source)
Все тоже самое только bool и int упакованы в int?
Никаких других преимуществ или проблем - нету. Просто нету. неоткуда им там появится.
а чем отличается out от ref
если имеем ин параметры и оут параметры, то реф совмещении обоих.
Вот типа псевдокода
void abc(int [in] a) { print(a);}
void abc(int [out] out a) { a= 3;}
void abc(int [ref] ref a) { print(a); a= 3;}
оут параметр выдается наружу и присваивается исключительно внутри функции.
реф может инициализироваться вне функции
Тебе сразу показывается проблемное место.
не нужно забывать что действие может быть ошибочным, а может быть "неверным".
Ну вот есть у меня файл с данными на 1000 строк, строки могут содержать ошибочные данные, но в любом случае мне нужно прочитать весь файл.
Что будет делать с сотней исключений? Радоваться что нас бросило в место исключения? Скорее скажем, что проигнорировать. Не зная, что в другом месте это уже будет ошибкой ![]()
Если же последующие вызовы зависят от результата предыдущих
-----
У Parse()? Нее, точно не зависят.
Может зависеть состояние сомеОбект, но его не рассматриваем.
Потому как если станем рассматривать, то код поменяется на присвоение строки проперти (через прокси-класс) и парсинг спрячется внутри.
возможно нет смысл прогонять остальные
-----
Азы - проход должен выявить максимум проблем в исходных данных.
Т.е. парсить надо каждое значение и сообщать надо об каждой ошибке в данных.
тащить HasAllValues еще куда-то
-----
ООП говорит что ничего никуда тащить не надо - надо получить из объекта точное описание проблемы и скинуть полученное в лог.
Не написал потому как ленивый... да и не эта проблема рассматривается.
не нужно забывать что действие может быть ошибочным, а может быть "неверным".
Нет. Надо рассматривать встзречу определенного состояния, как такого, когда можно и нужно продолжать работу и когда работу продолжать нельзя. Потому что ИСКЛЮЧИТЕЛьНАЯ ситуация. Если файл нужно дочитать до конца, то выбрасывать исключение нет смысла - "ошибочные" данные это на самом деле не ошибочные, а такие, которые мы обрабатываем иначе и идем дальше.
Я просто скопипастил твой код - ленивый Я, лениво писать тип в каждой строке.
А ты не поленись и напиши. И тогда ты поймешь, что ты поменял типы данных в стороннем объекте.
Над мал-мал на рЮсская языка переводить...
чья бы корова мычала :)
ленивый Я, лениво писать тип в каждой строке.
Как можно проглотить то чего нету?
Его нету из-за того, что оно проглочено. Или ты думаешь, что TryParse имплементированно не через Parse? ![]()
Ну посмотри на это сбоку.Есть метод bool TryParse(string source, out int val)Предлагается замена int? Parse(string source)Все тоже самое только bool и int упакованы в int?Никаких других преимуществ или проблем - нету. Просто нету. неоткуда им там появится.
Ну во-первых, подозреваю, что out появилось раньше, чем int?.
Во-вторых, разница в том, что в одном случае используются примитивы, а в другом контейнер.
Ну и в-третьих, разница в семантике. В одном случае проверка на "удалось ли распарсить", а в другом "удалось ли записать значение в переменную".
Что будет делать с сотней исключений?
-----
Разве это проблема? Это фигня, а не проблема.
Реальная проблема - либо надо тру-катчить каждый парсе, что даст ооочень приятный код, либо не будут отловлены все непарсимые данные и тогда будет реальная проблемa...
Мелкомягких надо было душить в колыбели, да.
Вы просто завидуете их успеху. ))))
Корявая оракловская джава лучше? Может Линукс, которому, чтобы им пользоваться, нужно посвятить жизнь? Или язык для старичков С++? Старички гордятся, что когда-то в 90-х, когда они были молодыми, оседлали тренд и теперь сидят на нём безвылазно, а никто из молодых нормально больше к ним войти не способен, и стараются сделать так, чтобы в будущем это только закрепилось - наваливают в него ещё сложностей. Ну или джаваскрипт - как из простого языка для двигания кнопочек по страничке и переключения переключателей попытаться сделать звездолёт на все случаи жизни. До сих пор пытаются - уже почти четверть века.
У Parse()? Нее, точно не зависят.
Ну мы жздесь не конкретно Parse обсуждаем. Мы говорим о обработке исключительного состояния и о том, что лучше - усключение или null
Азы - проход должен выявить максимум проблем в исходных данных.Т.е. парсить надо каждое значение и сообщать надо об каждой ошибке в данных.
Нет. Это условие зависит от задачи. Мы имеем сотню вложенных или вызываемых одна за другой функций, которые зависят друг от друга. Первая не смогла отработать и вернула неправильный результат. Можно подождать пару часов, пока отработают остальные. Результат будет одним и тем же - невозможно обработать данные.
Это не обязательно маска графической оболочки, где нужно отметить все незаполненные поля. Это может быть и импорт, где уже первая строка показывает, что формат файла неправильный.
ООП говорит что ничего никуда тащить не надо - надо получить из объекта точное описание проблемы и скинуть полученное в лог.
Лог к программе не относится, это средство для протоколирования, ООП такое не говорит и говорить не может. Обработка ошибок это не только сообщение о них юзеру, но и вyбор стратегии - а что проге делать дальше.
Мелкомягких надо было душить в колыбели, да.
Без мелокомягких мы бы имели сейчас пачку непохожих друг на друга линукс дистрибутивов, воевавших между собой за аудиторию, предлагающих каждый свой подход к написанию приложений, в которых "стандартный" С++ работал бы по-разному (следствие войны ОС - как сейчас в браузерах каждый гнёт веб-стандарты под себя и старается что-то нестандартное ввести), и убогие мобильные системы, пытающиеся выдать себя за десктопные со своими "мобилками с подключаемыми мониторами", где на твои 32-50 дюймов (у кого какие мониторы) тебе вываливают матрицу 4х5 кнопок размером с мой кулак и ни в чём себе не отказывай.
подозреваю
-----
Не подозревай - нуллабельные типы были раньше.
Не встроенные, но сторонние.
Сути это не меняет.
Или ты думаешь, что TryParse имплементированно не через Parse?
------
А для меня есть хоть какая-то разница как оно имплементировано?
В одном случае проверка на "удалось ли распарсить", а в другом "удалось ли записать значение в переменную".
-----
Гыыы?!!!
Никакой разницы.
Ну разве что результат попытки упакован со значением и проверку можно производить в удобное время.
Или ты хочешь сделать так
bool res1 = int.TryParse(myStr1, out int val1);bool res2 = int.TryParse(myStr2, out int val2);
bool res3 = int.TryParse(myStr3, out int val3);
и т.д.
и сказать что это правильно? ![]()
P.S. Кстати, вспомнил, в Шарпе есть и подобие union type - OneOf. Можно возвращать OneOf<int, string> или int или строку с ошибкой.
Это уже что-то типа кастомных вые...онов, монад и прочее сектантство-культизм.
Тогда что-то вроде OptionalInt возвращаем.
int?
Джентельмены, я не сишник, а чем отличается out от ref и что такое кортеж? Чем кортеж отличается от массива?
В шарпе кортеж это набор разнотипных данных. По сути просто класс с полями, но который не специально создаёшь, а чтобы по месту, обычно в контексте одной функции, что-то быстро вернуть-отправить. В шарпе есть ещё один костыль для этого - анонимные типы. И ещё более высокоуровневый костыль - DTO - Data Transfer Object - но то не только в шарпе. Хорошо было бы, если бы это всё заменили чем-то одним.


