Posts Tagged “программирование”

25 марта 2011 года в Челябинске пройдет конференция .NET разработчиков.

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

Вход свободный. После регистрации.

Сайт: http://www.dotnetconf.ru/
Доклады: http://www.dotnetconf.ru/Discussion
Регистрация: http://www.dotnetconf.ru/Registration

Для тех, кто сомневается, стоит ли выступать на конференциях: http://blog.byndyu.ru/2011/02/blog-post.html

Tags: , ,

Comments View Comments

В мире программистов существует множество разных холиваров: «open source или закрытый код?», «гибкость (agile) или дисциплина?», «метрики или интуиция?», «процесс или продукт?», «творчество или формализм?», и т.д. Сторонники всех этих теорий всегда находят примеры того, что их сторона лучше, чем другая. Из этого следует, что все они правы, но по-своему, и в реальной жизни нужен компромисс и умение совмещать на первый взгляд противоположные подходы, в зависимости от ситуации — условий проекта, характера и опыта программистов, и т.д. Именно эта идея, высказанная в предисловии Томом ДеМарко и убедила меня купить эту книгу и дочитать ее до конца.

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

Кроме освящения и анализа различных холиваров, в этой книге упоминается еще одна правильная мысль: проблемы, стоящие перед программистами, по своей сути — не новы, и, как следствие, те или иные споры и решения можно найти и в других областях, решающих задачи. Эта же идея, кстати, есть и у М. и Т. Поппендик в их «Бережливом производстве ПО».

Креативное программирование 2.0 на озоне.

Tags: ,

Comments View Comments

Есть такой класс задач разработки ПО, главная цель которых — предоставить пользователю средство управления данными. Это различные корпоративные информационные системы (КИС, ERP) и прочие ИС (CRM, и т.п.). Именно о них я буду говорить далее. Назовем их, для краткости, ИС (информационные системы).

При разработке ИС все обязательно проходят через три этапа: разработка модели данных, разработка бизнес-логики, управляющей этими данными, и разработка интерфейса пользователя. Есть интересный процесс — Model-Driven Development (MDD), в котором утверждается, что определив модель данных все остальные этапы можно выполнить автоматически. Не все с этим соглашаются, так как это утверждение редко дополняется другим немаловажным моментом: это действительно так, но только в некоторых случаях, которые нужно еще уметь отличать от всех остальных случаев. Кроме того, фраза «выполнены автоматически» еще не означает, что больше не нужны программисты интерфейсов и бизнес логики — просто их задача немного видоизменяется, и цель этого изменения — скорость и цена разработки. И если к этому подойти с умом — можно это сделать даже не в ущерб качеству, как можно было бы предположить, зная истину «speed/quality/cost: choose two».

Обычно все примеры, связанные с MDD, содержат достаточно простые схемы, и может показаться, что это применимо только для простых админских страничек, как многие и воспринимают, например, ASP.NET Dynamic Data. Вот что, на мой взгляд, очень важно при разработке реальных приложений: возможность задавать схемы действий пользователя. Именно это позволит перейти от простых админских приложений, которые только и могут, что редактировать таблицы базы данных, к более серьезным проектам.

Comments View Comments

Если верить Скотту Гатри и его компании (1, 2), то одна из [используемых] философий дизайна ASP.NET MVC Framework — DRY (Don’t Repeat Yourself). Это хорошо, конечно, но одна вещь меня до сих пор не оставляла в покое, т.к., имхо, она еще недостаточно «осушена» (DRY-ed :) ). И эта вещь — проверка прав доступа в UI-представлениях (view).

Чему обычно «учат» люди, пишущие в своих блогах про MVC, когда  дело доходит до момента, что «вот этот кусок HTML нужно показывать не всем пользователям»? В лучшем случае (из того, что видел я, если видели лучше — делитесь :) ) предложат сделать helper для проверки типа «является ли текущий пользователь админом». На первый взгляд кажется логичным.

Но, ведь точно такие же проверки мы уже, наверняка, прописали в виде атрибутов к нашим action-методам в наших контроллерах. И любой активный элемент пользовательского интерфейса в нашем view, такой как кнопка, ссылка, и т.д., будет связан именно с action-ом какого-либо контроллера. По сути, у нас уже описаны условия, которые уже описывают когда есть смысл рендерить ту или иную часть пользовательского интерфейса. Ведь будет глупо показывать кнопку «Удалить», если контроллер вернет ошибку, сказав, что нам не хватаем прав? И, кроме того, если мы при написании своих view снова используем язык пользователей и ролей, как это делали при описании прав на action-методы, то мы снова повторяем себя. Ладно, если таких поверок минимум, или изменений в правах не будет еще лет 100, или вместо поддержки нашего кода все будет переписано заново. Не ракеты строим, все таки :) Хотя, последний пункт — это уже откровенное неуважение своего же труда.

И, мне кажется, было бы логично делать проверку UserCan(<ссылка на LawsController Decline>), это ведь и читается легче: «может ли пользователь отменять новые законы?», и код во view из «если пользователь — президент, то покажи кнопку Отменить» превращается в «если пользователь может отменять новые законы, то покажи ему эту кнопку».

Имхо, самая большая проблема тут — ссылка на action-методы. Эта проблема, в общем-то, уже решалась в MVC Futures для Html.ActionLink<>, и в дополнительных t4 шаблонах, выложенных на codeplex в релизах mvc. Еще важно разделять action-ы с одинаковыми именами. Но, т.к. все это работает в рамках .NET Framework, то все наши методы либо имеют разные параметры, либо разные имена [методов], чем можно пользоваться. Так же можно пользоваться атрибутами AcceptVerbs (например, трансформировать проверку в UserCan(Post, <ссылка на LawsController Decline>)), и в этом случае, возможно, не придется париться по поводу различий в аргументах, будет достаточно лишь имени action-а, что делается простейшим t4-шаблоном.

Единственное НО — производительность. Выбрав путь MVC Futures (передача лямбда-выражения, использующего нужную функцию) мы теряем в производительности, т.к. это означает, что мы в рантайме анализируем свой код. Выбрав путь ссылок на имена action-методов мы можем сделать преобразование вызовов проверки UserCan компилятором в проверки типа IsAdmin, сохранив производительность в рантайме, но скорее всего потеряем возможность автоматического изменения всех ссылок при переименовании action-методов (так ли это важно, если у нас это редкость, да и на момент компиляции нас предупредят об изменениях?).

Естественно, UserCan не решит нам все проблемы, особенно когда появляются проверки на уровне записей, и, например, нужно проверять права пользователя не на часть пользовательского интерфейса, а его права на конкретную запись, конкретный объект. Но это уже совсем другая история.

Tags: , ,

Comments View Comments

Noncommercial Attribution license