singalen: (Default)
[personal profile] singalen
Мысля об исключениях, в дополнение к этому.
Хотя исключения и создают "неявный goto из каждого места кода" (если быть точным - то return), но в том и идея, чтобы сделать их неявными. В корректном коде в этом самом каждом месте были бы if-ы для проверки кодов возврата, return-ы, и, возможно, ещё энное количество строчек - лог и пр.
То есть - исключения являются меньшим злом, и без них код был бы не лучше.
Проблема - научить(ся) писать так, чтобы код функции корректно завершался при выходе из любого места. Для этого нужны стражи ресурсов (см. RAII pattern)... и что ещё? Неужели это решает "проблему исключений"?

P.S. Вот это у Джоэля, кажется, надо перечитать со всеми упоминаемыми статьями.
P.P.S. Ещё сравнение RAII в C++, C# и Java. Java тут, увы, сильно подкачала :)

(no subject)

3/9/05 12:04 (UTC)
Posted by [identity profile] alf-kadett.livejournal.com
Ну, тут явное передёргивание:
String ReadFirstLineFromFile( String path ) {
  StreamReader r = null;
  String s = null;
  try {
    r = new StreamReader(path);
    s = r.ReadLine();
  } finally {
    if ( r != null ) r.Dispose();
  }
  return s;
}

запросто запсывается как
String ReadFirstLineFromFile( String path ) {
  StreamReader r = null;
  try {
    r = new StreamReader(path);
    return r.ReadLine();
  } finally {
    if ( r != null ) r.Dispose();
  }
}

Что всё ещё ужас, но не "ужас! ужас!". Я уж не говорю о том, что r.ReadLine(), равно как и r.Dispose() выдаёт в авторе профана в Java. Увы, таких методов просто нет.

Насколько я могу судить, примеры притянуты за уши. Достаточно нескольких методов cleanup(whatever) - и всё становится аккуратным и читаемым.

(no subject)

3/9/05 12:12 (UTC)
Posted by [identity profile] alf-kadett.livejournal.com
А последние примеры - это пример неиспользования принципа DRY. Их можно сходу постить в Daily WTF.

(no subject)

3/9/05 15:58 (UTC)
Posted by [identity profile] alf-kadett.livejournal.com
Глубинный смысл есть: конструкция using действительно красива, не спорю.

Концепция локальной переменной в C++ тоже хороша, но очень уж страшно писать на плюсах: это как раз та красота, за которую надо платить. И если на Java я могу подчищать код за тремя-пятью девелоперами, то на плюсах я и за одним не рискну.

Проблемы исключений на самом деле нет (а то мы сейчас ещё придумаем проблемы break и contunue). Есть проблема освобождения ресурсов :) Насколько я могу судить, эти проблемы если и связаны, то уж точно не идентичны :)

(no subject)

3/9/05 16:01 (UTC)
Posted by [identity profile] alf-kadett.livejournal.com
Вот все ссылки из Джоэля, собраны в один пост: http://www.codinghorror.com/blog/archives/000346.html

(no subject)

4/9/05 05:57 (UTC)
Posted by [identity profile] sanyok-ua.livejournal.com
> Я уж не говорю о том, что r.ReadLine(), равно как и r.Dispose() выдаёт в авторе профана в Java.
> Увы, таких методов просто нет.

Это - код на C#. Абсолютно валидный.

(no subject)

4/9/05 06:07 (UTC)
Posted by [identity profile] alf-kadett.livejournal.com
Ну да. Только толку-то? Автор пишет о языке, который не видел - и на котором не писал. Зачем-то вводит локальную переменную, которая не нужна.

Дело же не в том, что Java хороша или плоха - мне очень нравится конструкция using. Дело в том, что обсуждение попахивает :)