Posts Tagged “интуитивность ПО”

Если верить Скотту Гатри и его компании (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

Раньше я пользовался ноутбуком, там сейчас почти у всех есть bluetooth. А теперь у меня Acer Revo, у которого bluetooth нет. А я уже успел купить bluetooth мышку и даже привыкнуть к ней. Помня, как все просто со встроенными bluetooth адаптерами я пошел и не глядя купил первый попавшийся компактный bluetooth донгл, им оказался ASUS BT21 mini. Но, как оказалось, драйвер от АСУСа имеет кучу глюков, например, после «засыпания» мышки про нее можно забыть — обратно она не просыпается. Поискав немного яндексом выяснил, что у кого-то этот донгл со стандартными драйверами вообще не работает.

Однако, погуглив я нашел интересное упоминание о том, что BT21 сделан на основе чипа Broadcom 2045, и только лицензионная политика на драйвера USB-девайсов не позволяет АСУСу отдать такой идентификатор  устройства, чтобы автоматом установились драйвера broadcom, а broadcom ни за что не добавит идентификаторы АСУС в свой драйвер. Мне их лицензионные терки не интересны, мне нужно, чтобы донгл работал.

Решение проблемы с драйвером достаточно простое: попадаем в диспетчер устройств, кликаем USB-донгл правой кнопкой, выбираем «обновить драйвер», выбираем ручной выбор драйвера и в списке ищем broadcom 2045+EDR. После выбора драйвера для девайса рекомендуется выполнить обновление драйверов, это поможет работать бóльшему числу bluetooth-девайсов (например, bluetooth-гарнитура без этого вполне может не заработать).

Если вдруг в списке предустановленных драйверов нет 2045, то стоит попытаться обновить драйвера без ручного выбора, оно, конечно, не обновит ничего, но после этого обычно появляются предустановленные драйвера на 2045 :)

Tags:

Comments View Comments

Готовлюсь к установке Windows 7. Но, т.к. у меня нет дома ни одного работающего DVD-привода, то устанавливать придется с USB. В инете куча руководств по шаманству с diskpart, которые превращают usb-флешку в загрузочную флешку с установщиком windows 7, но даже при этом мне пришлось два дня плясать вокруг компьютера, чтобы заставить его загрузиться с такой флешки. Уверенности добавлял только успешный опыт загрузки с linux-загрузчика.

Вот только, как оказалось, дело было вовсе не в том, что там был linux, а тут windows, а в том, что там было 512Мб, а тут 16Гб. Большие флешки в BIOS-ах на двух моих компьютерах оказались в разделе Hard drive, а я пытался загрузиться с Removable device, совсем отключив загрузку с Hard drive, т.к. иначе грузилась установленная винда. Я даже переводил вручную USB-контроллер в режим принудительного USB-Floppy, т.к. иначе в списке Removable devices не было флешки, но после этого я получал ошибку «Invalid partition table». Никак не хватало интуиции заглянуть в список жестких дисков и именно там менять приоритет, ведь какой из флешки Hard drive, а? Флешка — самый настоящий Removable device.

Кстати, утилита Windows 7 USB/DVD Download Tool не захотела принимать ISO-образ моего Windows 7 Upgrade disk, высланный для моего Revo, в котором не предусмотрен DVD-привод, она убеждала меня, что это не ISO-образ. Либо Nero и DAEMON Tools создают кривой ISO, либо проверка на ISO-шность включает еще и проверку «тот ли диск копируют» и Upgrade disk окалася «не тот», либо что-то еще. Черт его знает, тем более есть способ с diskpart.

Tags: ,

Comments View Comments

Noncommercial Attribution license