суббота, 19 февраля 2011 г.

Субботний вечер пропаганды маргинальных технологий: Анемичная модель

Ох, эта статья будет ещё более сумбурная, чем они бывают обычно у меня. Просто есть какие-то мысли и надо их немного устаканить.

Есть такой человечище, зовут Мартином. Когда я ещё только играл в HoMM 3, он уже написал статью про анти-паттерн AnemicDomainModel. И не смотря на то, что я запоем читал некоторые его книги и статьи, с этим я совершенно не согласен.

java.lang.Process баги

Хотел бы в очередной раз поругать Java'у. В этот раз по делу :)

Есть такой интерфейс java.lang.Process и класс Runtime, которые позволяют  запускать другие приложения, скажем так. У нас это достаточно частая штука. Скажем даже основная функция (:

Поэтому следующие два взаимодополняющих бага в JVM прочувствовали очень сильно на себе.

Process.waitFor() fails to return. Проблема заключается в том, что waitFor может упасть, если никто не вычитает stream'ы процесса. Я не зря употребил слово _может _, так как это например у нас первый раз появилось спустя несколько месяцев тестирования. Ладно, его типа закрыли, так как можно перед вызовом waitFor прочитать потоки процесса и всё будет хорошо. Ага, только в каком-либо другом, идеальном мире.

"IOException: Stream closed" if more data sent after Process.destroy. Тут мы приходим ко второму багу. Так как если применить выше указанный способ, т.е. запускать процесс, открывать потоки и читать их до завершения у работающего процесса, то в случае если его кто-нибудь kill'нёт, что для ряда процессов у нас нормальное явление, то мы получаем ещё один прекрасный exception при чтении. И этот баг не закрыт.

Да, варианты конечно всегда есть, даже несколько. Можно глотать exception, можно использовать цикл и exitValue, вместо waitFor. Но оба смотрятся по уродски.

Вот такая нелёгкая жизнь у Java программиста :) И я бы Sun Oracle всё бы простил, если бы это происходила на какой-нибудь Windows, так нет, тут всё хорошо, а происходят эти баги на той самой SunOS.