Сообщение Re[10]: Haters gonna hate but with proofs от 14.01.2019 10:18
Изменено 14.01.2019 11:00 rg45
Re[10]: Haters gonna hate but with proofs
Здравствуйте, netch80, Вы писали:
N>Ну мне решение с defer нравится. Тем более что оно есть и в C++ — BOOST_SCOPE_EXIT. Это реально удобнее в таких последовательных действиях типа "открыли A, открыли B, аллоцировали C, открыли D, временно подменили E и F...", для которых нужен обратный откат (а если закоммитили то можно просто поставить флажок об этом).
Все таже проблема — этот самый defer должен написать полльзователь функции, а не разработчик.
Другая проблема, другая проблема — не работает для подобъектов. Какждый раз требуется ручное управление, соответственно, плодит ошибки времени выполнения.
Третья проблема, использую сишарпный аналог defere-а — using. Много ли найдется разработчиков C#, которые скажут сходу, какой из следующих вариантов является правильным (пример, опять же, абстрактый, просьба не придираться к прикладным аспектам):
или
Или может, вообще можно без всяких using, как правильно?
И даже на этом веселуха еще не заканчивается — обязательно ведь найдется грамотей, который позовет Dispose (прямо либо через using) для входного стрима. Так что, элегантность она такая себе элегантность.
N>Ну мне решение с defer нравится. Тем более что оно есть и в C++ — BOOST_SCOPE_EXIT. Это реально удобнее в таких последовательных действиях типа "открыли A, открыли B, аллоцировали C, открыли D, временно подменили E и F...", для которых нужен обратный откат (а если закоммитили то можно просто поставить флажок об этом).
Все таже проблема — этот самый defer должен написать полльзователь функции, а не разработчик.
Другая проблема, другая проблема — не работает для подобъектов. Какждый раз требуется ручное управление, соответственно, плодит ошибки времени выполнения.
Третья проблема, использую сишарпный аналог defere-а — using. Много ли найдется разработчиков C#, которые скажут сходу, какой из следующих вариантов является правильным (пример, опять же, абстрактый, просьба не придираться к прикладным аспектам):
public static T Deserialize<T>(Stream input)
{
var textReader = new StreamReader(input);
// че-то читаем из textReader
using (var xmlReader = XmlReader.Create(textReader))
{
return Deserialize<T>(xmlReader);
}
}
или
public static T Deserialize<T>(Stream input)
{
using (var textReader = new StreamReader(input))
{
// че-то читаем из textReader
using (var xmlReader = XmlReader.Create(textReader))
{
return Deserialize<T>(xmlReader);
}
}
}
Или может, вообще можно без всяких using, как правильно?
И даже на этом веселуха еще не заканчивается — обязательно ведь найдется грамотей, который позовет Dispose (прямо либо через using) для входного стрима. Так что, элегантность она такая себе элегантность.
Re[10]: Haters gonna hate but with proofs
Здравствуйте, netch80, Вы писали:
N>Ну мне решение с defer нравится. Тем более что оно есть и в C++ — BOOST_SCOPE_EXIT. Это реально удобнее в таких последовательных действиях типа "открыли A, открыли B, аллоцировали C, открыли D, временно подменили E и F...", для которых нужен обратный откат (а если закоммитили то можно просто поставить флажок об этом).
Все таже проблема — этот самый defer должен написать полльзователь функции, а не разработчик.
Другая проблема — не работает для подобъектов. Какждый раз требуется ручное управление, соответственно, плодит ошибки времени выполнения.
Третья проблема, использую сишарпный аналог defere-а — using. Много ли найдется разработчиков C#, которые скажут сходу, какой из следующих вариантов является правильным (пример, опять же, абстрактый, просьба не придираться к прикладным аспектам):
или
Или может, вообще можно без всяких using, как правильно?
И даже на этом веселуха еще не заканчивается — обязательно ведь найдется грамотей, который позовет Dispose (прямо либо через using) для входного стрима. Так что, элегантность она такая себе элегантность.
N>Ну мне решение с defer нравится. Тем более что оно есть и в C++ — BOOST_SCOPE_EXIT. Это реально удобнее в таких последовательных действиях типа "открыли A, открыли B, аллоцировали C, открыли D, временно подменили E и F...", для которых нужен обратный откат (а если закоммитили то можно просто поставить флажок об этом).
Все таже проблема — этот самый defer должен написать полльзователь функции, а не разработчик.
Другая проблема — не работает для подобъектов. Какждый раз требуется ручное управление, соответственно, плодит ошибки времени выполнения.
Третья проблема, использую сишарпный аналог defere-а — using. Много ли найдется разработчиков C#, которые скажут сходу, какой из следующих вариантов является правильным (пример, опять же, абстрактый, просьба не придираться к прикладным аспектам):
public static T Deserialize<T>(Stream input)
{
var textReader = new StreamReader(input);
// че-то читаем из textReader
using (var xmlReader = XmlReader.Create(textReader))
{
return Deserialize<T>(xmlReader);
}
}
или
public static T Deserialize<T>(Stream input)
{
using (var textReader = new StreamReader(input))
{
// че-то читаем из textReader
using (var xmlReader = XmlReader.Create(textReader))
{
return Deserialize<T>(xmlReader);
}
}
}
Или может, вообще можно без всяких using, как правильно?
И даже на этом веселуха еще не заканчивается — обязательно ведь найдется грамотей, который позовет Dispose (прямо либо через using) для входного стрима. Так что, элегантность она такая себе элегантность.