22 апреля 2012 г.

Посоветуйте программерский ноутбук

Сегодня ноут порадовал не только синим экраном смерти Windows 7, но и тем, что во время загрузки сообщил, что операционная система вообще не найдена. :( Вечером пришел, ноут загрузился - фуф, слава Богу. Сейчас лихорадочно бэкаплю всю информацию на внешний винт...

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

 Отсюда вопрос: может кто посоветует ноутбук, заточенный под программирование. Т.е. хороший процессор + память + место под SSD (не пропадать же добру :)). Поделитесь опытом, на чем вы программируете?

18 апреля 2012 г.

30 июля 2011 г.

Загрузка связей по требованию в StructureMap: продолжение

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

Если у вас доменная модель основана на интерфейсах, то у вас неминуемо возникнет проблема истанцирования реальных объектов в методах сервисов. Давайте я поясню это на примере. Представим, что у нас есть класс User, который имплементирует интерфейс IUser. Везде в коде мы используем IUser и это нас вполне устраивает. Но определенно в каком-нибудь месте системы эти объекты User должны создаваться. Код может быть примерно такой:

public IUser CreateUser(string userName, string userPassword)
{
  IUser user = StructureMap.ObjectFactory.GetInstance< IUser >();
  user.Name = userName;
  user.Password = userPassword;

  return user;
}

Проблема этого кода в том, что такой код неудобно тестировать. Вам придется мокировать Factory, чтобы создать нужного юзера.

Альтернативным подходом будет передавать в конструктор Func, который бы резолвился автоматически StructureMap. Когда код можно было бы переписать так:

public IUser CreateUser(string userName, string userPassword)
{
  IUser user = this.getUser(); // поле класса типа Func< IUser >
  user.Name = userName;
  user.Password = userPassword;

  return user;
}

На мой взгляд, такой код обладает одним неоспоримым плюсом: его легче протестировать, потому что достаточно передать в конструктор сервиса что-то типа delegate() { return new User(); } и никаких сложных настроек мок-объектов не понадобится. Очевидным минусом такого подхода является то, что конструктор сервиса захламляется не нужным делегатом.

А что вы думаете на этот счет?

26 июля 2011 г.

Загрузка связей по требованию в StructureMap

В одной из последних версий StructureMap появилась фича dependency lazy load. Суть простая - вместо того чтобы создавать все связанные объекты и передавать их в конструктор, StructureMap позволяет передавать Func в качестве аргумента конструктора. Тем самым клиентский код сам решает когда создать необходимый инстанс.

26 февраля 2011 г.

Переехали...

А из нашего окна
Площадь Юности видна...

Собственно говоря, сабж. Теперь меня трудно найти в 12-м микрорайоне, потому что я обитаю во 2-ом.

7 февраля 2011 г.

Сервис для распечатывания карточек с иностранными словами

Давным давно хотел написать простенькую программу, которая бы принимала на вход Excel-файл со списком слов и переводов, а на выходе давала бы файл для печати двухсторонних карточек.

Я так и не собрался, чтобы его написать, но нашлись добрые люди, которые сделали все за меня. Итак, знакомьтесь: easy-cards. Суть проста: подаем файл, получаем pdf-шаблон для печати. Остается только распечатать и нарезать карточки.

Disclaimer: Лично мне так и не удалось толком воспользоваться сервисом, потому что я не смог  подобрать нужную кодировку. Но думаю, я эту проблему решу :)

P.S. Описание сервиса доступно здесь.

15 декабря 2010 г.

Старые, новые UI решения

Как удивительно иногда бывает. Сначала тебе друг расскажет какую-то вещь, а потом ты начинаешь замечать её повсюду.

Когда-то давно в проекте для Microsoft наша команда реализовала красивый способ вывода межстраничных сообщений для пользователей. Основная фишка способа была в том, что сообщение не отвлекало пользователя от выполнения его задач. Сообщение скрывалось через пару секунд, если на него не кликали.

А сегодня я узнал, что известный гуру в создании пользовательских интерфейсах Джеф Раскин уже давным давно предлагал нечто подобное. Он назвал это "прозрачные сообщения". Подробнее почитать о них можно на хабре, но интереснее посмотреть на эту демку.

Пора воспользоваться старыми идеями в новом проекте? ;)