Безысходный review php. Рецензия на фильм после прочтения сжечь. Абстрактная интерпретация(Abstract Interpretation)

Ответ

На основе https://toster.ru/q/276441 Понятное дело, многое зависит от проекта, поэтому данный пост стоит адаптировать под ваш случай.

* Безопасность:
- Каждый аргумент метода простого типа должен проверяться на тип в случае его проксирования и на граничные значения в случае обработки. Чуть что не так - бросается исключение. Если метод с несколькими аргументами на 80% состоит из поверки из аргументов - это вполне нормально))
- Никаких trigger_error, только исключения.
- Исключения ДОЛЖНЫ быть человеко-понятны, всякие "Something went wrong" можно отдавать пользователю, но в лог должно попасть исключение со стектрейсом и человеко-понятным описанием, что же там пошло не так.
- Каждый аргумент (объект) метода должен быть с тайпхинтингом на этот его класс, или интерфейс.
- За eval как правило жесткий выговор
- @ допускается только в безвыходных ситуациях, например проверка json_last_error.
- Перед работой с БД - обязательная проверка данных.
- Никаких == и!=. Со swtich - единственное исключение, по ситуации.
- Если метод возвращает не только bool, а еще что-то - жесткая проверка с ===, или!== обязательна.
- Никаких условий с присваиваниями внутри. while($row = ...) - тоже недопустимо.
- Магические геттеры/сеттеры разрешаются только в безвыходных ситуациях, в остальном - запрещены.
- Конкатенации в sql - только в безвыходных ситуациях.
- Параметры в sql - ТОЛЬКО через плейсхолдеры.
- Никаких глобальных переменных.
- Даты в виде строки разрешаются только в шаблонах и в БД, в пхп коде сразу преобразуется в \DateTimeImmutable (в безвыходных ситуациях разрешено \DateTime)
- Конечно зависит от проекта, но как правило должно быть всего две точки входа: index.php для web и console(или как-то по другому назваться) - для консоли.

* Кодстайл PSR-2 + PSR-5 как минимум, + еще куча более жестких требований (для начала все то что в PSR помечено как SHOULD - становится MUST)
- В PhpStorm ни одна строчка не должна подсвечиваться (исключением является typo ошибки, например словарик не знает какой-то из аббревиатур, принятых в вашем проекте). При этом разрешается использовать /** @noinspection *** */ для безвыходных ситуаций.
- Если кто-то говорит, что пишет в другом редакторе и у него не подсвечивается, все равно отправляется на доработку.

* Организация кода:
- Никаких глобальных функций.
- Классы без неймспейса разрешаются только в исключительно безвыходных ситуациях.

* Тестируемость (в смысле простота тестирования) кода должна быть высокая.
- Покрытие кода обязательно для всех возможных кейсов использования каждого публичного метода с моками зависимостей.

* Принципы MVC:
- Никаких обработок пользовательского ввода в моделях, от слова совсем.
- Никаких запросов в БД из шаблонов.
- Никаких верстки/js/css/sql-ин в контроллерах.
- В моделях НИКАКОЙ МАГИИ, только приватные свойства + геттеры с сеттерами.
- В моделях разрешено использовать метод save(при наличии такого разумеется) только в исключительных ситуациях. Во всех остальных - либо insert, либо update.

* Принципы SOLID:
- Никаких универсальных объектов, умеющих все.
- Если метод для внутреннего пользования - private, никаких public.
- Статические методы разрешаются только в случае безвыходности.

* Принцип DRY разрешено нарушать в случаях:
- Явного разделения обязанностей
- В тестах (каждый тест должен быть независимым, на сколько это возможно)

* Работа с БД:
- Запрос в цикле должен быть РЕАЛЬНО обоснован.
- За ORDER BY RAND() жесткий выговор
- Поиск не по ключам (конечно если таблица НЕ на 5 строк) запрещен.
- Поиск без LIMIT (опять же если таблица НЕ на 5 строк) запрещен.
- SELECT * - запрещен.
- Денормализация БД должна быть обоснована.
- MyISAM не используется (так уж)))
- Множественные операции обязательно в транзакции, с откатом если что-то пошло не так.
- БД не должна содержать бизнес логики, только данные в целостном виде.
- Не должно быть нецелесообразного дерганья БД там, где без этого можно обойтись.

* Кэш должен очищаться по двум условиям (не по одному из, а именно по двум):
- Время.
- Протухание по бизнес логике.
Разрешается по только времени в безвыходных ситуациях, но тогда время - короткий период.
- При расчете ключей кэша должна использоваться переменная из конфигурации приложения (на случай обновлений кэш сбрасывается кодом, а не флашем кэш-сервера). В случае использования множества серверов - это очень удобный и гибкий инструмент при диплое.

* О людях:
- "Я привык писать так и буду дальше" - не вопрос, ревью пройдешь только когда поменяешь свое мнение.
- "Я пишу в vim-е и мне так удобно" - здорово, код консолью я тоже в нем пишу)) но есть требования к коду, если в них не сможешь - не пройдешь ревью.
- "Я скопировал этот страшный метод и поменял 2 строчки" - это конечно замечательно, но по блейму автор всего этого метода ты, так что давай без ерунды, хорошо?
- "Оно же работает!" - вот эта фраза переводится примерно так: "да, я понимаю, что пишу полную ерунду, но не могу писать нормально потому, что не могу", я правильно тебя понял?))
- "У меня все работает!" - рад за тебя, а как на счет продакшна?
- "Там все просто" - не используй слово "просто", от слова "совсем". Вот тебе кусок кода (первого попавшегося со сложной бизнес логикой), где там ошибка (не важно есть она, или нет)? Ты смотришь его уже 2 минуты, в чем проблема, там же все "просто"))

* Всякое:
ActiveRecord (это я вам как в прошлом фанат Yii говорю) - полный отстой, примите за исходную. По факту у вас бесконтрольно по проекту гуляют модельки с подключением к БД. Не раз натыкался на то, что в тех же шаблонах вызывают save, или update (за такое надо сжигать).

Основное:
1. Наличие критических ошибок и устаревших функций.
2. Использование паттернов, элегантность решений.
3. Читабельность кода, наличие коментариев, наличие доков.
4. Соблюдение парадигм и соглашений (например, нарушение MVC).

Второстепенно\непринципиально:
1. Быстродействие кода (за исключением хайлоад)
2. Потребление памяти (за исключением бигдаты)
3. Эфективность SQL запросов (за исключением совсем уж несуразных)
4. Избегание в данных момент неважных, но потенциально узких мест (например замедление работы файловой системы при большом количестве картинок в папке аплоада)
5. Новизна примененых технологий.
6. Оправданое\Неоправднанное\Избыточное Велосипедирование.

  1. Код не содержит явных и потенциальных ошибок.
  2. Код работает так, как это описано в документации, техническом задании или сопроводительных комментариях.
  3. Стиль кодирования соответствует принятым правилам кодирования
  4. Код имеет сопроводительные комментарии в соответствии с phpDoc
  5. Вложенность блоков не превышает 4-го уровня.
  6. Код не генерирует сообщения уровня Strict, Warning, Notice, Deprecated. Если этого невозможно избежать, то непосредственно перед строкой, которая это генерирует необходимо принудительно отключить error_reporting, а непосредственно после строки включить error_reporting в исходное значение (которое было до этого). Такой код должен быть задокументирован специальным образом.
  7. Закомментированный кусок кода должен быть удален.
  8. В PHP коде (за исключением phpTemplate) запрещены вставки HTML, JavaScript. Все вставки должны производиться через специальные шаблоны.
  9. Классы, функции, переменные и константы должны логически именоваться человекопонятным способом на английском языке в соответствии со стандартами кодирования. Не допускается именование транслитом на русском, либо на иных языках
  10. Область видимости переменных и методов классов всегда должна быть определена (private, protected, public).
  11. Размер одного метода не должен превышать 40-50 строк.
  12. Переменная, используемая в цикле, либо в условном блоке должна быть инициализирована заранее.
  13. Переменная в любой момент времени должна содержать только один тип. Пустая переменная должна содержать null. (не допускается $var = false; $var = "test"; . Допускается $var = null; $var = "test";).
  14. При передаче объектов классов в методы должен использоваться контроль типов.

Легендарные провидцы древности – они были всего лишь очень наблюдательными людьми. По оттенкам закатного неба легко представить, каким было утро, и рассчитать погоду на завтра. В глазах взбалмошной девчонки можно увидеть, какой женщиной она станет, и какое у неё самое главное детское воспоминание. Опытный мечник заметен уже по тому, как он держит палочки для еды. Если человек не способен заплатить за обед, но всё равно заходит в чайную – чашкой воды дело не ограничится. И если это окинавец с мечом, а на дворе то ли XVII-й, то ли XIX-й век – значит, духи предков футуки (или, по-окинавски, фафудзи ) давно уже ждут этого парня.

В художественном произведении эпохи постмодернизма и эклектики с предсказаниями вообще легко: дороги забиты бродячими сюжетами, знакомыми мелодиями и традиционными характерами. Вот и «Самурай Чамплу» начинается абсолютно неоригинально: прохожий вступается за невинного, нарушает привычный ход вещей и, что логично, попадает в переделку. Банальный штамп – или безупречно отточенный шедевр, которому не затупиться от повторений, как не теряют своей вдохновляющей силы произведения живописи, размноженные в репродукциях. Тем более что повторения имеют место быть: ронин Дзин помогает, впрочем, небесплатно, разорившемуся чиновнику – и окинавец Мугэн отважно бросается в бой, на ходу подсчитывая премиальные порции мандзю . Жалким дубликатом смотрятся унылые физиономии папы-дайкана и его «мажорного» сынка, а бедная официантка Фуу дважды предпринимает попытку спасти своих драчливых героев – и тоже не за просто так.

Таких реприз в сериале предостаточно, что вполне соответствует хип-хоп саундтреку. Двойные поединки и повторяющиеся встречи, сцены и кадры-отражения, цитаты и прямые заимствования, прихотливые узоры местного колорита на устоявшейся основе детектива, боевика, мистики или комедии. Как было заявлено в названии, «чамплу» – это смесь, рагу, мозаика. Однако даже для окрошки нужен опытный повар, и ярлык «мешанина» ничего не объясняет. Любое произведение можно легко назвать «причудливым калейдоскопом, где сплавились мотивы, стили и сюжеты» и поставить на полку «Необъяснимое». Но при внимательном изучении «Самурай Чамплу» оказывается вполне логичным и уравновешенным произведением.

Жанр роуд-муви , характерные признаки которого скрупулезно воспроизведены в сериале, восходит к тем временам, когда не было ни кино, ни английского языка. Но уже тогда этот древнейший универсальный жанр был более чем просто россыпью историй, соединённых дорогой и целью. Одиссей, Дон-Кихот, рыцари короля Артура и Фродо – для них и для многих других странствие значило больше, чем просто перемещение из пункта А в пункт Б.

Ещё одна серия, ещё одна встреча, ещё одна история, кто-то изменяет тебя, кого-то ты изменяешь – или убиваешь. Каждый день и ночь бок о бок с попутчиками сближают вас настолько, что уже и не вспомнить, с чего всё началось, и стоит ли жертвовать жизнью ради, казалось бы, совершенно постороннего человека. Есть ли смысл в этой дороге – поймёт лишь тот, кто прошёл её до конца. Тяготы и беды, чудеса и трудные решения, новые друзья и тени из прошлого – каждый шаг, как прожитая минута, и путешествие становится метафорой жизни.

Так в луже может поместиться луна с парой звёзд. Так нарисованные персонажи способны воплотить характеры и судьбы живых людей. Так в небольшом островном государстве, затерянном на краю света в лучах восходящего солнца, отражается весь мир со всеми его войнами, торговлей и политикой, эпохами и революциями, государствами и судьбами отдельных людей.

И никакой национальный колорит, никакие исторические детали не помешают увидеть универсальные, но остающиеся правдивыми сюжеты. Любовь, надежда, предательство, верность, смерть и месть не требуют перевода. Дети жертвуют собой ради родителей, а родители – ради детей, мальчишки совершают опрометчивые поступки, мошенники обманывают, а там, где мошенники, ищи сыщиков, идущих по следу, и полицейских под прикрытием, хвастуны получат своё, а на самого крутого бойца всегда отыщется боец покруче…

И точно так же без дополнительных примечаний понятна красота. Восходящее солнце, встающее из-за гор над туманной раковиной залива, сочная зелень и пронзительная полуденная синева, золотые нити, пронзающие ветви деревьев и застывающие замысловатым узором на гобелене из палой листвы и цветов, горделивые астры во дворе старого додзё в кружевной тени алеющих кленов, изумрудный мех сосновых игл на фоне аметистового закатного неба – всё это, как признание в любви, как восхваление гармонии, как банальное, но всё равно ненадоедающее традиционно-японское постижение природы.

Впрочем, чего греха таить, без знания японской истории и вообще Японии «Самурай Чамплу» будет не настолько интересен. Весь этот трип-брейк-дэнс-ритм-энд-бит самурайский коктейль переполнен намёками, мелочами, подсказками и шутками. Сообразно концепции роуд-муви , сериал отличается серьёзным набором персонажей, второстепенных и эпизодических – почти для каждой серии свой комплект. И поскольку на каждую серию свой сюжет, кроме внешности и голоса, персонажи могут похвастаться причастностью к XVII-му, XIX-му или XX-му векам. Например, здесь действует художник Хисикава Моронобу и легендарный воин Мусаси Миямото, упомянут Франциск Ксавье и Симабарское восстание христиан, спародирован, но бесспорно узнаваем Энди Уорхол. Есть зомби, похожий на Брайана Джонса из Rolling Stones. Есть свежеизобретённый математический знак. И даже у имён есть своё значение – как дополнительные сюжетные линии, вплетённые в пёструю ткань основного повествования.

«Самурай Чамплу» издевательски детален, и уже в этом своём свойстве может быть причислен к элитарному аниме. Неудивительно, что он провалился в Японии, где в мультиках не терпят сложности и зауми! Но для въедливых гайдзинов это какое-то «золотое дно» и праздник души. Разбираться в монах на кимоно Дзина – Такэда или не Такэда? Дотошно анализировать приёмы Мугэна. Вылавливать реальных исторических лиц и отделять их от героев телесериалов. Спорить над тем, реально ли было организовать подпольное производство ружей, и кто из европейцев сумел доплыть до Японских островов...

Подобная проработка и продуманность поражает и порой опьяняет, подчас мешая полностью погрузиться в происходящее. Знание истории может помочь, а может запутать, поскольку наравне с историческими фактами хватает фактов выдуманных и очевидных анахронизмов. Но, как сказал в интервью журналу Newtype и главный виновник этой фантасмагории: «Время действия – эпоха Эдо, примерно 60 лет после того, как закончились беспорядки после Сэнгоку, периода междоусобиц и конфликтов. Но забудьте об исторических деталях. Думайте об этом как о неком временном отрезке через 60 лет после окончания войны».

Итак, предположительно время действия сериала – 1675 год. Но вряд ли стоит всерьёз придерживаться этой даты. Скорее, это некий гипотетический год «через 60 лет после окончания войны». Все уже привыкли к миру и порядку, но ещё помнят тревожные времена. Однако вместе с войной уходит что-то важное, то, что называют «честью», «доблестью», «готовностью умереть за кого-то».

Знакомая, повторяющаяся ситуация, когда мир становится другим, а ты привык к тому, что было раньше. Знакомое, вечное чувство – желание родиться в другом веке. Судьбы неукротимых рубак и принципиально честных воителей, коим выпало жить в эпоху благополучия и компромиссов.

Мугэн, Дзин и Фуу – главные герои «Самурая Чамплу», лейтмотив, основа и повод. Эти трое вобрали в себя столько характерных классических черт, что могут показаться ожившими типажами среднестатистического аниме. (Есть в этом что-то издевательски-насмешливое, знакомый почерк Ватанабэ-сэнсэя: сделать на первый взгляд шаблонных героев более чем достоверными и живыми).

Загадочный и романтичный интроверт, дикий и задиристый мужлан, девчонка, которая хочет быть самой красивой, всё узнать и кушать много и почаще. У каждого из них, как и положено, есть прошлое, вполне конкретное и являющееся, по сути, нижней, невидимой частью айсберга. В день своей встречи они не были «чистыми листами», хотя и старались казаться такими. Но именно этот «груз тяжких дум», воспоминаний и долгов наполняет смыслом их путешествие и определяет его завершение.

Сдержанный, церемонный, ускользающе-молчаливый, словно рыба, ронин Дзин – ученик знаменитого мастера, которого однажды превзошёл; несправедливо оклеветанный, как и положено «плохому хорошему», он вынужден постоянно расплачиваться за свой поступок и с каменным лицом выслушивать обвинения в предательстве. Парадоксальная закономерность, но человеку, ставящему честь превыше всего, приходится жить с клеймом бесчестия. Будущего нет, о прошлом лучше не думать, если и можно на что-то надеяться, так это умереть в бою с достойным противником.

Взъерошенный, неугомонный, драчливый, как петух, Мугэн – пират с Рюкю, не расстающийся с мечом, несмотря на строжайший запрет окинавцам носить оружие. Семьи нет, друзей нет, доверять некому, возвращаться некуда. Единственная радость – подраться с кем-нибудь по-настоящему сильным. Понятно, что однажды встретится кто-нибудь слишком сильный, но стоит ли об этом переживать?

Фуу – это Фуу. Всё, что у неё есть – ручная белка, детские сны, аппетит и обида. В конце концов, обида становится целью, ведь если ты не способен помочь близкому человеку, ты, по крайней мере, можешь попытаться отомстить тому, что виноват в твоих бедах. А когда в перспективе – работа официантки в чайной (а могут и в бордель продать), то самая призрачная цель покажется достижимой. Например, найти самурая, пахнущего подсолнухами.

Терять им было нечего. Но сколь удивительным оказывается тот факт, что эту историю сплетает воедино упорство девчонки из чайной! Случайное стечение обстоятельств. Или сочетание тайных желаний. Для Мугэна и Дзина, таких разных и вместе с тем страшно похожих в своей упрямой обречённости, Фуу стала поводом жить дальше. Не стремиться к гибели, не искать и, в конце концов, найти об кого свернуть шею, не ждать мстителей – но двигаться куда-то, что-то делать, на что-то надеяться, пусть даже не для себя.

Без неё им пришлось бы драться – насмерть, как понял каждый из них при первой же схватке. В глазах друг друга они увидели свою смерть. Поиски закончены… Но, видимо, в каждом из них что-то стремилось к жизни – так Дзин открывал для себя любовь, так Мугэн спорил с духами.

Самая уязвимая и слабая, беспомощная и нуждающаяся в постоянной защите, пусть на короткий срок, Фуу наполнила смыслом жизни двух бродяг. Более того, она позволила им искупить свои грехи и освободиться от прошлого. Потому что и Мугэн, и Дзин испытали это удивительное ощущение – быть кому-то нужным.

Со стороны всё выглядит довольно смешно. Любитель женщин с большими сиськами позволяет избивать себя из-за никчёмной и вдобавок плоскогрудой девчонки. Безжалостный Кария Кагэтоки, «Рука Бога», так и не понял, зачем Дзин идёт на верную смерть – но ведь там, на краю обрыва, застыла Фуу, которая за время странствий стала таким близким человеком, а ещё есть Мугэн, и как потом смотреть ему в глаза?..

Оказалось, что Фуу помогла им пройти через смерть и возрождение – неожиданно христианские мотивы в эпоху гонения на христиан. Грех Мугэна из тех времён, когда он был пиратом и убивал без жалости и сожаления. Грех Дзина из тех времён, когда его меч был «для него одного». Прошлое осталось на берегу Икицуки вместе с обломками мечей – и отныне свободные Мугэн и Дзин разошлись в разные стороны.

Так и должно было быть – и дело не в «простом» решении предполагаемого любовного треугольника, хотя эта примитивная, но понятная схема кажется всё объясняющей. Наверное, об этом думала Фуу в последнюю ночь у костра, когда она «делились тайнами». Есть нечто большее, чем просто влечение. Есть близость значимей страсти. И чтобы не разрушить обретённое родство, надо расстаться – проверить, насколько действенны эта связь и это возрождение.

Для самой Фуу возрождением стала встреча с «самураем, пахнущим подсолнухами» – чудом невозможным, говорили же ей, что подсолнухи не пахнут! Но чудо свершилось, она успела и получила свой ответ. И освобождённая от детских обид отправилась дальше – расти и становиться роковой красавицей. И, наверное, искать своего завершённого героя, ибо Дзин и Мугэн были лишь половинками: романтик и драчун, две крайности, из которых невозможно выбрать что-то одно.

Так внешне сумбурный и несвязный сериал превращается в удивительное сплетение боёв, философии, чувств и просто приключений. Дорога в мире и дорога внутри. Плюс сногсшибательный саундтрек. Плюс великолепный ансамбль сэйю. Плюс потрясающая прорисовка… Надо бы ещё раз пересмотреть.

Выражаю сердечную благодарность Tenar и Verbnic за помощь в правке рецензии

Лично мне она помогла несколько иначе взглянуть на процесс разработки и тестирования своих приложений. А оригинальный подход автора к тестированию, как минимум, заслуживает внимания.
Если вам тоже интересно, добро пожаловать под кат.

С тех пор как появился Trevis , вы можете в мгновение ока внедрить непрерывную интеграцию во все свои PHP-проекты. Это помогает не только улучшить качество кода, но и существенно упрощает поддержку библиотек, предоставляя информацию о сборке прямо в запрос на обновление(pull request) и, тем самым, уменьшает время получения обратной связи. Travis очень хорош, но, как и другие инструменты тестирования, страдает от наследственной болезни - что бы что-то сделать ему нужны тесты. Готовь биться об заклад, что у вас нет ни одного проекта честно покрытого тестами на 100% или, даже, близко к этому. Это я еще надеюсь, что тесты вы пишите.

Как вам возможно известно, я поддерживаю значительное число плагинов(bundles) для Symfony2 и самостоятельных PHP-библиотек. И благодаря сообществу(спасибо ребята, так держать) я постоянно получаю запросы на обновление в свои репозитории. Некоторые из запросов совершенно бесполезные, некоторые заслуживают внимания, некоторые можно добавлять в основную ветку. Но как бы тщательно не проверялся запрос, время от времени случается так, что добавляется то что не работает или работает, но не всегда.

Пару месяцев назад я попытался изменить эту ситуацию, идея была довольно простой: создать систему которая проверяет код запроса на обновление и дает обратную связь. Я довольно быстро сделал прототип и добавил в него пару простых проверок. Затем, захотел добавить более сложны, например, проверку может ли метод быть вызван. Что бы понять пользу такой проверки, посмотрите на следующий пример:
loadUser($user->getUsername())) { throw new RuntimeException(sprintf("User "%s" was not found.", $user->getUsername())); } return $user; } }
И так, метод refreshUser получает объект класса User при помощи метода loadUser и возвращает этот объект. А если объект не найден, то бросает исключение. Вроде бы все просто, но так ли это на самом деле? И если уж я об этом спрашиваю, то видимо нет и многие из вас уже заметили ошибку. Внутри блока if $user равен null и мы не можем вызвать у него метод getUserName . Что бы находить такого рода ошибки я испробовал несколько простых решений, но довольно быстро становилось очевидно что они работают только в очень специфичных случаях. Мне было нужно что-нибудь получше.

Type Inference of PHP Code
Я потратил довольно много времени вникая в концепции потока данных , потока управления и абстрактной интерпретации . Что само по себе выглядит довольно сложно и выходит за рамки этой статьи. Но позвольте мне привести всего несколько примеров и дать вам общее представление об этих концепциях.
Анализ потока управления(Control Flow Analysis)
Анализ этого потока позволяет определить в каком порядке будут выполняться различные блоки вашего кода.
0) { echo "foo"; } else { echo "bar"; } }
Для этого кода поток управления будет выглядеть так:

Мы начинаем в if, затем двигаемся к «foor» или «bar» и, наконец, выходим. Само по себе нам это вряд ли чем-то поможет, но это послужит основой для следующего шага.

Анализ потока данных(Data Flow Analysis)
Анализ потока данных позволяет определить как изменяется контекст выполнения пока мы движемся по схеме которую определили в анализе потока управления.
format(); // тут все хорошо, мы ведь знаем что $x это экземпляр DateTime } else { $x = 0; } $x->format(); // $x экземпляр DateTime или число "integer", в зависимости от этого // метод может быть вызван а может и нет
Не зная порядок выполнения кода, мы может заключить только то, что $x может быть null, число или DateTime. Но нам это не поможет выяснить может ли быть вызван метод format .
Абстрактная интерпретация(Abstract Interpretation)
Для нашего случая эта концепция сводится к вопросу «Какие предположения мы можем сделать, если знаем результат условного выражения?». Давайте взглянем на другой пример:
logger = $logger; } public function doSth() { if (null !== $this->logger) { $this->logger->log("doing sth"); } } }
В данном случае «условным выражением» будет null !== $this->logger. Если это условие истинно, то наш вопрос можно перефразировать так: «Если выражение null !== $this->logger истинно, то какое предположение можно сделать на счет $this->logger?» Как мы уже выяснили, $this->logger может быть null или Logger. Но благодаря абстрактной интерпретации мы можем быть уверены что внутри блока «if» $this->logger всегда будет экземпляром Logger, следовательно, метод может быть вызван.

Автоматическая система проверки

Какой от всего этого толк, спросите вы. В начале статьи я сказал, что моей целью было создание автоматической системы проверки кода. И я думаю что сейчас она готова для широкого использования и обсуждения. Я протестировал своей системой ведущие PHP библиотеки, такие как, Zend Framework 2, Symfony2, Doctrine, Propel и многие другие. Она содержит более 100 правил проверки, которые вы можете использовать и конфигурировать. Если у вас есть PHP-проект на Github вы можете легко попробовать. Просто залогинтесь http://jmsyst.com/automated-code-reviews и выберете нужный репозиторий. А если не понравиться, можете выключить в любое время.

Если теперь кто-то скажет, что PHP-программисты не слишком серьезно относятся к качеству кода, отправляйте их их ко мне.


Диск с мемуарами сотрудника ЦРУ случайно оказывается в руках двух беспринципных сотрудников тренажерного зала, которые решают продать находку.

«После просмотра забыть»

Титулованные братья Коэны, всласть насладившись триумфом шедеврального «Старикам тут не место», вновь окунулись в болото мейнстрима. Казалось бы, это весьма прискорбно для преданного Коэнам зрителя, однако их новый опус - произведение настолько неоднозначное, что рассуждать об актуальности действа можно не одну страницу печатного текста. С одной стороны, «После прочтения сжечь» - это удивительно стройная и циничная сатира на тему мирового идиотизма, в которой упоительные в своей придурковатости персонажи изъясняются на весьма узнаваемом языке. С другой - это неудобоваримый капустник, где в каждом эпизоде есть доля жанровой вымученности, а от чувства стиля и меры не осталось и следа.

Отчего-то, по просмотру отчетливо вспоминаются провокационные и антибуржуазные выходки датских догматиков. Будь-то «Торжество» Томаса Виттенберга или скандально известные «Идиоты» Ларса фон Триера. В последнем, к примеру, небольшая группа людей в буквальном смысле корчила из себя умалишенных. По сюжету, они наивно полагали, что таким образом можно освободиться от всяческих социальных рамок и впоследствии обрести банальное человеческое счастье. Героям из «После прочтения сжечь» повезло чуть больше: многого для счастья им просто-напросто не надо, да и играть в дурака совсем не приходится, поскольку сами таковыми являются.

Идиотизм в картине возведен в абсолютно обыденное состояние любого человеческого индивида. Сказать, что хоть один из персонажей новой картины братьев Коэнов обладает здравым рассудком, язык не поворачивается. Некоторым это мешает жить, другим - помогает. Впрочем, в любом из рассматриваемых случаев подобная норма ни от чего не застраховывает. Собственно, лишь отсутствие морали в сей басне, возможно, и побудит зрителя задаться логичным вопросом: к чему все это? Конкретный ответ Коэны, разумеется, не дадут. Придется усердно домысливать, и вскоре придти к выводу, что произошедшее на экране стоит рассматривать как вынесенный в незамысловатой форме анекдота недобрый вердикт всему живому.

Между тем, безусловно, замечаешь, что новая картина братьев как ни странно очень тесно в зрительских ассоциациях перекликается с «Изображая жертву» Кирилла Серебренникова. Герой Джона Малковича к финалу произносит недовольства своему окружению ровно с такими же интонациями, как и персонаж Виталия Хаева: нервно, безысходно и бесконечно правдиво. Все остальное в ленте, практически в духе саркастических анимационных зарисовок из «Южного парка»: говорят красиво с положенной дерзостью, и отчаянно смеешься даже над очевидно несмешным.

Вдобавок, фильм еще и богат на великолепные образы, изумительно разыгранные плеядой голливудских звезд. Актеры не перетягивают одеяло друг на друга, благодаря мастерски прописанным характерам каждого персонажа. Видимо поэтому, органично сосуществующие в одном фильме герои при всей утрированности образов выглядят самым настоящими и живыми людьми. Круче всех даже не феерично матерящийся Малкович, а неувядаемая Фрэнсис МакДорманд, которая в своей бараньей упертости отвратительна и очаровательна одновременно. Трогательно состарившийся Брэд Питт, потрясающе переигрывает роль инфантильного спортсмена-имбецила. Однако переигрывает так, что любо-дорого посмотреть. Тильда Суинтон крайне уверенно держится в образе холодной и эгоистичной стервы, которая ко всему прочему является педиатром. Ну, а Джоржу Клуни после фразы «От тебя исходит один негатив» и вовсе хочется вручить Оскара.

Собственно, упиваясь актерским ансамблем, блестящей операторской работой и выверенной, как время на дорогих часах, режиссурой, опять-таки возвращаешься к поставленному вопросу. К чему? Ответ неожиданно приходит, когда видишь самую последнюю улыбку Брэда Питта. Наверняка, у циничных братьев Коэнов, которые свято веруют, что окружающий идиотизм вечен и неизбывен, она была такая же. В этот самый момент, понимаешь, что только в страшном сне могут присниться такие вот комедии, и придуманную американскими критиками шутку, которая «после просмотра - забыть» оцениваешь уже в совершенно другом ключе. Конечно же, самое простое, что можно было бы сделать в такой ситуации, процитировать предыдущий фильм Коэнов. В том самом месте, где «…и тут я проснулся». Впрочем, после того, когда тебя с легкостью спровоцировали посмеяться над самим собой - говорить это, по крайней мере, нелепо.

Купить "Антихрист " можно за руб.

Антихрист» стал одним из самых крупных и обсуждаемых скандалов за всю историю Каннского кинофестиваля
Сначала было название... Его Триер выдумал, когда в течение двух месяцев валялся на больничной койке в почти депрессивном состоянии. После - он отправился на съёмочную площадку и быстро, но профессионально сделал фильм, который даже не был особо запланирован. В итоге «Антихрист» стал одним из самых крупных и обсуждаемых скандалов за всю историю Каннского кинофестиваля. Критики порвали картину, как Тузик регулярно рвёт грелку, люди толпами уходили из зала. Члены экуменистического жюри, традиционно отмечающие самые гуманные и человечные работы, вручили «Антихристу» «антипремию», как открыто женоненавистническому и сверх всякой меры жестокому. А Большое жюри наградило актрису Шарлотту Генсбур «Золотой пальмовой ветвью» за «Лучшую женскую роль».
Конечно, тот факт, что у Триера с головой давно и сильно не всё в порядке, известен всем, даже не смотревшим хоть что-нибудь «из него». Чудак и мистификатор, страдающий многочисленными фобиями, старательно окружает себя атмосферой таинственности и абсурдного безумства. Вот на съёмках своего фильма «Идиоты» он появляется абсолютно голый, таким образом, решив раскрепостить актёров и подвигнуть их на рискованные сцены группового секса. Вот он по-настоящему вешает Бьорк в кадре «Танцующей в темноте», чтобы добиться ещё более реалистичного эффекта. А вот он во всеуслышание заявляет, что у него воспаление мошонки и просит найти ему доктора…
При этом Триер - талантливый и удачный бизнесмен. Его проект «Догма-95», провозгласивший отказ от всего профессионального, что есть в кинопроизводстве, оказался коммерчески суперуспешным, собственная студия Zentropa процветает и продаёт фильмы по всему миру, а на окраине Копенгагена, в районе бывших казарм, давно отстроен собственный «датский Голливуд».
«Безумный датчанин», как его часто называют, привык снимать настолько же «безумное» кино, привык в кадре и не в кадре упиваться грехом и пороком, и не стыдиться этого. Он показывает зрителю то, что видит сам в своих абстрактных видениях. И, не следуя никаким стандартам общепринятого кино, создает свою собственную КиноВселенную. В почти всех его фильмах (фильмах ли?) нет идеологии - лишь спонтанная фантасмагория чувств, кошмаров, жизни. Но «Антихрист» - это нечто другое, хотя в каком-то смысле и тоже самое. И если предыдущие проекты знаменитого режиссёра воспринимались более-менее внятно, хотя, конечно, регулярно со скандалами, то «Антихрист» оставляет чувство сильнейшего недоумения. Во-первых, Ларс впервые отказался от своего аналитического подхода. Так сказать, поплыл по течению. А во-вторых, создается впечатление, что он изо всех сил пытается подражать американскому коллеге - кинопсиху Дэвиду Линчу, создавая огромное количество иллюзорных трюков и аллюзий с чем-то, что вообще, может, и не существует (здесь главное - сделать эту гиперссылку, никуда не ведущую).
В «Антихристе» Триер извращённым (почти порно) способом докапывается до сути женщины, которая дарует жизнь и одновременно уничтожает то, что любит. Режиссёр фактически ставит знак равенства между женщиной и природой, непредсказуемой и необузданной. Обе неукротимы в гневе и разрушают всё, в том числе и самих себя. Пресловутый Антихрист будет виден везде, где зритель захочет. В мужчине, в женщине, в ребенке... Говорящий лис, Эдемский сад, барабан стиральной машины - как постмодернистская метафора женской утробы. Каждый кадр не случаен, каждое переживание выверено, а каждый символ осознан. Все наполнено мощной энергией в сплетённой режиссёром паутине психологии, философии, религии и прочих умных учений. «Я не очень религиозен, - объясняет Триер, - и для меня очевидно, что религия изобретена мужчинами. Женщина, которая не согласна с картиной мира, управляемого мужчинами, может восстать против этой религии - и стать Антихристом». Всё сразу становится ясно. Достаточно выбрать, что считать добром, злом же будет то, что напротив. Женщина автоматически становится последним, если равнодушие мужчины - обыденность. В какой-то момент любовь входит в привычку или просто заменяется профессиональным интересом. Всё это глубокое проникновение в психологию отношений между мужчиной и женщиной, в самые сокровенные и извращённые её уголки. И дело даже не в шокирующих натуралистичных сценах (вроде уже ставшего притчей во языцех эпизода с отрезанием гениталий), а скорее в гнетущем безысходном тоне рассказа и убийственном посыле - мужчинам и женщинам не понять друг друга никогда, их противостояние вечно, как разума и тела, как науки и природы. Умно говоря, банальный дуализм. Хотя, конечно, всё эти выводы отнюдь не лежат на поверхности - наоборот, Триер снял фильм-головоломку, который способен выдержать множество интерпретаций, каждая из которых будет верна и не верна одновременно.
«Не думаю, что мне нужны какие-то оправдания относительно «Антихриста». - Говорит Ларс в интервью журналистам. - Я снял этот фильм не для вас и не для зрителей. Я снял его для себя. И потому не считаю, что обязан давать вам какие-то объяснения». Одни предполагают, что он лукавит, говоря такие нарочито броские фразы. Другие верят, что он реально никогда не думает о зрителе и всегда снимает только для себя. И первые, и вторые не пропускают ни одного его фильма. А третьи просто отмахиваются от «Антихриста», как и от любого сложного и неоднозначного произведения искусства, обзывают Триера эпатажником и провокатором, и продолжают жить дальше. Ничего не случилось. Всё в норме.

Владимир Рутман.