Сформулируем требование следующим образом: найти такой оператор F, что для любого набора (u, v, ...) будет выполнено:
F(u, v, ...)= F(v, u, ...)=F(всевозможные перестановки) (условие коммутативности), причем не существует любого другого элемента z != u, такого что выполняется:
F(u, v, ...)=F(z, v, ...)=F(всевозможные перестановки) (условие уникальности)*.
Или более привычно: u, v, ... являются простыми ключами, а F(u, v, ...) составным ключом в единственном числе.
30 декабря 2010
Строим идентификатор для множества
22 декабря 2010
Используем Reflection в T4 (Text Template Transformation Toolkit)
17 ноября 2010
False sharing
int size = 10000;
int[,] matrix = new int[size, size];
// Вариант 1
// Очень медленный вариант
for (int col = 0; col < size; col++)
for (int row = 0; row < size; row++)
matrix[row, col] = 0;
// Вариант 2
// Быстрый вариант
for (int row = 0; row < size; row++)
for (int col = 0; col < size; col++)
matrix[row, col] = 0;
29 октября 2010
Настройка логов на примере NLog
06 октября 2010
Пишем обертку для Stopwatch
// Наш секундомер.
Stopwatch timer = new Stopwatch();
timer.Start(); // Запустим секундомер
try
{
Thread.Sleep(1234); // долгая операция
}
finally
{
timer.Stop(); // Остановим секундомер
// Показания секундомера:
TimeSpan elapsed = timer.Elapsed;
Console.WriteLine("Время выполнения {0}", elapsed);
}
В данном примере видны все неудобства использования Stopwatch, это необходимость явно создавать объект Stopwatch, это явный запуск и остановка секундомера, при этом, если возможны исключения, то нужно добавить и обработку исключений.
24 сентября 2010
Шаблон реализации Equals
- От простого к сложному: выполнять сравнение начиная с простых условий и заканчивая более сложными.
- Понять равенство/неравенство объектов как можно раньше: делайте незамедлительный "return true/false".
31 августа 2010
Enum поле в XML API
<request>
<auth>
<login>ilya</login>
<password>*****</password>
</auth>
</request>
и соответственно ответ на запрос со стороны сервера будет выглядеть следующим образом:
<response>
<result>42</result>
<!-- Остальные поля ответа... -->
</response>
05 августа 2010
Marker Interface против Custom attributes
class Message{}
class MessageA : Message { }
class MessageB : Message { }
class MessageC : Message { }
03 августа 2010
NQueueing - Система Массового Обслуживания
22 июля 2010
Раcширяем IDisposable
// Освобождение ресурсов
if (some != null)
{
some.Dispose();
}
17 июня 2010
Блок using и null object
using ((IDisposable)null)
{
}
// Исключения NullReferenceException не будет.
// Метод Dispose вызван не будет.
03 июня 2010
Enum как результат
// Результат аутентификации
enum LoginStatus
{
// Успех
Ok = 0,
// Провал
Fail = (2 << 1),
// Уточняем, в чем провал:
LoginIncorrect = (2 << 2),
PasswordIncorrect = (2 << 3)
}
27 мая 2010
XML elements или XML attributes
<?xml version="1.0" encoding="utf-8" ?>
<!-- Храним данные в атрибуте -->
<root>
<child data="some data"></child>
</root>
<?xml version="1.0" encoding="utf-8" ?>
<!-- Храним данные в узле -->
<root>
<child>
<data>
some data
</data>
</child>
</root>
14 мая 2010
Thread-safe events
class SomeClass
{
// Доступ к данному событию происходит
// в нескольких потоках.
public event EventHandler SomeEvent;
}
Стандартный, потоко-безопасный (thread safe) шаблон вызова события выглядит следующим образом:
// Потоко-безопасный вызов.
public void OnSomeEventThreadSafe(EventArgs args)
{
// Очень важно, сделать копию события:
EventHandler handler = SomeEvent;
// И далее работать только с ней:
if (handler != null)
{
handler(this, args);
}
}
11 мая 2010
Совместное использование Repository с Unit Of Work.
04 мая 2010
Domain-Driven Design: создание домена
29 апреля 2010
Hello, Unity 2.0
- Microsoft Unity
- Ninject
- Autofac
- StructureMap
- Castle
- Spring.Net
Создадим новый проект и добавим в него основные сущности.Смотри предыдущую статью.- Скачаем необходимые библиотеки.
- Добавим references на них в проекте.
- Настроим IoC-контейнер через конфигурационный XML-файл.
- С помощью IoC-контейнера получим экземпляр объекта нашего класса.
26 апреля 2010
Используем Fluent Builder
20 апреля 2010
Extension Methods как «Синтаксический сахар»
16 апреля 2010
Используем Fluent Filters
14 апреля 2010
Используем процессор шаблонов. NVelocity.
- System.Web.Mvc.WebFormViewEngine
- Brail
- NDjango
- NHaml
- NVelocity
- Spark View Engine
13 апреля 2010
Аутентификация по OpenID в ASP.NET MVC
- Получение OpenID аккаунта.
- Установка API DotNetOpenAuth.
- Создание тестового проекта на ASP.NET MVC.
- Запуск и тестирование.
09 апреля 2010
User Stories или чего хочет пользователь
08 апреля 2010
Arrange-Act-Assert
- Arrange - выставление начальных условий.
- Act - отработка тестируемого функционала.
- Assert - сверка ожидаемых значений с полученными.
05 апреля 2010
Аутентификация. WCF
04 апреля 2010
Смотрим логи. NLogViewer
31 марта 2010
Создаем сертификаты: OpenSSL
- Скачаем и установим OpenSSL.
- Настроим рабочее место.
- Выпустим CA сертификат и для него список отозванных сертификатов CRL.
- Сделаем запрос на сертификат нашему центру сертификации.
- Выпустим сертификат по запросу.
- Добавим наши сертификаты в хранилища сертификатов.
29 марта 2010
Obsolete код
26 марта 2010
Sandcastle - генерируем документацию
22 марта 2010
XML-документация
10 марта 2010
Hello, Mock
02 марта 2010
Hello, NUnit
25 февраля 2010
Hello, NLog
- Гибкая настройка лога.
- Широкие возможности.
- Наличие конфигурационных xml-файлов с xsd-схемами.
- Готовое стабильное решение (экономия времени на отладке).
- Наличие документации (форумов, блогов).