ßàØÃÂâÕàë áÕÓÞÔÃÂï - Xakep Online
ßàØÃÂâÕàë áÕÓÞÔÃÂï - Xakep Online
ßàØÃÂâÕàë áÕÓÞÔÃÂï - Xakep Online
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
ХАКЕР 04 /171/ 2013 Задачи на собеседованиях111} catch (ProcessingException | RuntimeException e) {auditService.audit("documentProcessingFailed", e);throw e;}}}Как можно увидеть в получившемся фрагменте кода, мы выделили интерфейсобработки документов и добавили еще одну его реализацию, осуществляющуюзапись в журнал.Это было необходимо, поскольку у нас используется декларативнаяразметка транзакций (причем, скорее всего, на стеке технологийSpring, а не JEE, иначе была бы использована аннотация TransactionAttribute), соответственно, вероятны ошибки, возникающие за пределамиметода processDocument, например в фазе commit. В новой реализациимы корректно обработаем такие ошибки и сделаем запись в журнал«documentProcessingFailed».Этот код будет работать исходя из предположения, что ошибки записив журнал аудита являются фатальными для системы, — именно поэтому исключения,возникающие в методе audit, не обрабатываются.Кроме того, новый код использует перегруженную версию метода auditсо следующей сигнатурой:public void audit(String messageKey, Object… params);Такой интерфейс позволяет делегировать формирование сообщенияиз прикладного кода метода processDocument в сервис аудита, в которомсообщение может быть построено, например, с помощью классаMessageFormat из стандартной библиотеки по заданному ключу в файлересурсов приложения.После реализации журнала работы мы получаем три возможных сценарияработы кода, на которые, соответственно, должно быть написано триприемочных теста.Код будет работать исходя из предположения,что ошибки записи в журнал аудита фатальныдля системы, — именно поэтому исключения,возникающие в методе audit, не обрабатываются1. Тест на обработку корректного документа. Проверяет, что документ сохраняетсяв БД, отсылается подтверждение и появляется соответствующаязапись в журнале работы.2. Тест на обработку заведомо некорректного документа, например с переопределеннымметодом isValid. Проверяет, что результатом обработкитакого документа является отосланное подтверждение documentInvalidи запись в журнале.3. Тест на обработку ошибок, например с перегруженным методомdocumentService.store, генерирующим исключение ServiceException.Проверяет, что в такой ситуации единственным результатом работы являетсязапись в журнале.Поскольку журнал работы сохраняется в базе данных, метод audit долженвыполняться в отдельной транзакции — иначе результаты его работымогут не сохраниться из-за отката основной бизнес-транзакции, если методaudit вызывался внутри нее.ЗАДАЧА ОТ КОМПАНИИ SOFTLINE № 1Что выведет данный скрипт? Объясните почему.РЕШЕНИЕПеред тем как начать пересчитывать предполагаемый результат функциидля параметра 100, проверим корректность реализации и вызова.ЧИТАТЕЛЬ!ПРИСЫЛАЙНАМ СВОИРЕШЕНИЯ, И МЫИХ ОПУБЛИКУЕМ!РУКОПИСИВОЗВРАЩАЮТСЯВ ПОМЯТОМИ ИСПОРЧЕННОМВИДЕ, ПОЭТОМУЛУЧШЕ ПОЛЬЗУЙСЯЭЛЕКТРОННОЙПОЧТОЙ.Обращаем внимание, что аргумент функциипринимается по ссылке (&$var), соответственно,корректно в нее можно передать только переменную.В нашем же случае в функцию передаетсяконстанта, поэтому ожидаемый результатработы скрипта — сообщение об ошибке:PHP Fatal error: Only variables can bepassed by referenceЗАДАЧА ОТ КОМПАНИИ SOFTLINE № 2Как можно сделать анимированную иконку средствамитолько CSS с анимацией части изображения,без использования растрового фона?РЕШЕНИЕИспользуется базовый класс с описанием параметровосновного блока — каркаса кружки,два класса с модификаторами :after и :beforeдля создания уровня жидкости и ручки, а такжекласс :hover для отображения состояния при наведениикурсора. В базовом классе указаны параметрыанимации — анимируемое свойство,скорость анимации и тип анимации:.mug_animate {}-webkit-box-shadow: inset 0 -3em 0 0#2C2C2C;box-shadow: inset 0 -3em 0 0#2C2C2C;margin: 0 auto;margin-bottom: 1em;height: 2.5em;margin-top: 1.25em;position: relative;width: 1.5em;-webkit-transition: all 1000mslinear;-moz-transition: all 1000ms linear;-o-transition: all 1000ms linear;-ms-transition: all 1000ms linear;transition: all 1000ms linear;.mug_animate:after {border: .25em solid #2C2C2C;border-right: none;border-radius: .75em 0 0 .75em;content: '';height: 1.5em;left: -1em;position: absolute;top: .25em;width: .75em;}.mug_animate:before {border-radius: 0 0 0.2em 0.2em;top: -0.5em;left: -0.25em;position: absolute;border: 0.25em solid #2C2C2C;height: 2.5em;width: 1.5em;content: "";}.mug_animate:hover {-webkit-box-shadow: inset 0 0em 00 #2C2C2C;}box-shadow: inset 0 0em 0 0 #2C2C2C;