TDDigest e03
love via soap II: php + c#
Микромир ORM на примере Massive
2) Massive, разработанный Rob Conery, пример использования - HanselMinutes
3) PetaPOCO
Massive - это лучше, чем шоколад
Через конструктор или через свойство?
Obsolete
Загрузка файлов на сервер: php+C#
<form action="http://localhost/uplad.php" enctype="multipart/form-data" method="POST">
<input type="text" name="title" value="" />
<input type="text" name="description" />
<input type="FILE" name="uploadfile" />
<input type="submit" name="send" value="Upload" />
</form>
И тут начинаются проблемы. Теоретически, это можно сделать, используя QueryString у WebClient:If the QueryString property is not an empty string, it is appended to address. [MSDN]Но практически тут нужен бубен:
Unfortunately, most file upload scenarios are HTML form based and may contain form fields in addition to the file data. This is whereWebClientfalls flat. After review of the source code forWebClient, it is obvious that there is no possibility of reusing it to perform a file upload including additional form fields. [CodeProject]
Загадки старого кода
if (level <= 5 && level > 4){ ... }Давайте не будем обращать внимание на количество if-else операторов, на "магические числа" и сфокусируем взгляд на проверяемых значениях в условных операторах. Этот феномен можно было бы попытаться объяснить, если код был бы написан на языке с нестрогой типизацией, например, на том же php или javascript: в диапазон (4.0; 5.0] могло попасть множество значений (даже строка "4.098" т.к. в момент сравнения она будет автоматически преобразована в число с плавающей точкой - для php [1]). Но нет же!
else
{
if (level <= 6 && level > 5) { ... }
else
if (level > 6) { ... }
};
C# является строго типизированным языком. Каждая переменная и константа имеет тип, как и каждое выражение, результатом вычисления которого является значение. Каждая сигнатура метода задает тип для каждого входного параметра и для возвращаемого значения. [MSDN]Остаётся мучиться в догадках, что за мистическая цифра могла бы находиться в целочисленном диапазоне (4; 5] кроме цифры 5. :)
[1] http://it2.php.net/manual/en/language.types.string.php см. раздел "String conversion to numbers":
When a string is evaluated in a numeric context, the resulting value and type are determined as follows.
Extensions, Static methods & null
Методы расширения позволяют "добавлять" методы в существующие типы без создания нового производного типа, перекомпиляции или иного изменения исходного типа. Методы расширения являются особым видом статического метода, но они вызываются, как если бы они были методами экземпляра в расширенном типе. (из MSDN)Т.е. если в классе String нам не хватает какого-нибудь метода, то не нужно создавать еще один класс, наследуясь от String или, чего хуже, делая декоратор, а можно создать метод расширения:
public static class MyExtensions { public static int WordCount(this String str) { return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length; } }(пример тоже из MSDN)
Иногда бывает ситуация, когда нужно вызвать метод расширения в статическом методе класса. Но этого нельзя сделать, несмотря на то, что
Методы расширения являются особым видом статического метода, но они вызываются, как если бы они были методами экземпляра в расширенном типе. (из MSDN)
Но, если всё же очень надо, то есть пара приёмчиков :)
Ещё чуть-чуть о тестах
Начинающие тэдэдэшники часто переусердствуют, стараясь тестировать всё и вся, забывая, что тест в TDD - это небольшой метод, проверяющий конкретное бизнес-правило. Акцент тут следует сделать на бизнес-правилах, они специфицируют поведение приложения, именно их нужно тестировать. С помощью TDD мы разрабатываем бизнес-логику. Не следует тестировать работу с БД, с файловой системой, сетевое взаимодействие - это уже совсем другой вид тестирования. Это интеграционные тесты. TDD позволяет нам быстро разрабатывать бизнес-логику, подтверждая работоспособность (или наоборот) кода мгновенным фидбеком. Если приходится специально что-то настраивать, чтобы запустить тест, и настройка занимает больше времени, чем написание самого теста, следует насторожиться. Метод для теста должен быть черным ящиком: известно только, что на входе, нужно удостовериться в правильности того, что на выходе.
В реальной жизни часто бывает так, что нужно взять выборку из БД и подсунуть данные методу для выполнения сложных расчетов. Для тестирования таких методов придумали Mocks, Fackes, Dummies & Stubs. Все эти технологии позволяют абстрагироваться от уровня физического взаимодействия, генерируя методы-заглушки. А методы заглушки возвращают тот набор данных, который им подсовываем. Чтобы было понятнее, вот простенький пример с Mock-библиотекой Moq.
to ORM or not to ORM?
Почему стоит отказаться от ORM рассказывает Rob Conery в своём докладе "Kill Your ORM" на NDC 2011 , где, кстати, было очень много интересных докладов.
Linq DataContext и Dispose
using (CDataContext db = new CDataContext(ConnectionPool.Connection))
{...}метод Dispose() вызывается автоматически, и все занимаемые ресурсы освобождаются.
Насколько критично вызывать метод Dispose() вручную для такого кода?
CDataContext db = new CDataContext(ConnectionPool.Connection);
return (from tbl in db._addresses
where tbl.IsCustomer.Equals(true)
select tbl).ToList();Перефразируя вопрос: что плохого случится, если не вызвать Dispose()? Ведь GC всё равно вызовет этот метод, разве что не сразу. DataContext не держит соединение c БД открытым (только, если не открывать его явным способом вроде DataContext.Connection.Open() ) т.е. никаких тяжеловесных ресурсов не занимает, и ничего плохого не происходит. Т.е. совсем не обязательно вручную вызывать Dispose().
Но. Если вы напишите такой код
using(CDataContext db = new CDataContext(ConnectionPool.Connection)){
return (from tbl in db._addresses
where tbl.IsCustomer.Equals(true)
select tbl);} произойдёт исключение "Cannot access a disposed object. Object name: 'DataContext accessed after Dispose.", потому что дерево запроса (возвращаемый тип IQueryable<_address>) попытается выполнится после того, как DataContext будет уничтожен. Произойдёт это потому, что запрос выполнится тогда, когда будет впервые вызвано перечисление элементов (метод ToList<T>(), например). Если же написать такой код
CDataContext db = new CDataContext(ConnectionPool.Connection)
return (from tbl in db._addresses
where tbl.IsCustomer.Equals(true)
select tbl);то нужно понимать, что DataContext откроет соединение к базе, извлечет элементы и будет уничтожен только в том месте кода, где произойдет IQueryable<_address>.ToIEnumerable<_address>()
Moq: ошибка номер раз
var mock = new Mock<IEventsStorage>(); //этот подход является рекомендуемым
либо мокаемый метод нужно объявлять виртуальным:
var mock = new Mock<EventsStorage>();
mock.Setup(storage => storage.LoadEvents(Monthes.Januar)).Returns(new List<Event>());
...
public class EventsStorage
{
public virtual List<Event> LoadEvents(Monthes monthNumber) {...}
}
Статические методы и методы экземпляра: кто быстрее
CA1822 : Microsoft.Performance : The 'this' parameter (or 'Me' in Visual Basic) is never used. Mark the member as static (or Shared in Visual Basic) or use 'this'/'Me' in the method body or at least one property accessor, if appropriate.В MSDN по этому поводу написано:
«Members that do not access instance data or call instance methods can be marked as static (Shared in Visual Basic). After you mark the methods as static, the compiler will emit non-virtual call sites to these members. Emitting non-virtual call sites will prevent a check at runtime for each call that ensures that the current object pointer is non-null. This can result in a measurable performance gain for performance-sensitive code. In some cases, the failure to access the current object instance represents a correctness issue.»Какие преимущества у static метода перед методом экземпляра? При каждом вызове метода экземпляра происходит проверка указателя на null. Для статических методов такого не делается, что даёт небольшой прирост производительности. Кроме того, согласно MSDN, для всех объектов класса будет существовать только один экземпляр метода, что так же увеличит производительность.
C# Finalize/Dispose pattern
Два интересных обсуждения о Finalize/Dispose в C# на StackOverflow (http://stackoverflow.com/questions/898828/c-finalize-dispose-pattern/898867#898867) и Хабре (http://habrahabr.ru/blogs/net/122639/)
VS 2010 Shortcuts Posters for C#, F#, VB, C++
Появились новые постеры с горячими сочетаниями клавиш для разработки в Visual Studio 2010 под разные языки. Постеры выполнены в двух разных форматах - 8.5”x11”(Letter) и 210x297mm (А4)
Скачать с сайта Microsoft
Зеркало на C# for VS 2010 постеры
C# for VS 2008
IoC, DI, WTF?
IoC (Inversion of Control) - инверсия управления, один из принципов S.O.L.I.D., известна так же как Принцип обращения зависимостей (Dependency Inversion Principle, DIP). IoC - очень полезная техника, которая уменьшает связанность и придает гибкость разрабатываемому ПО. Принцип инверсии управления звучит так [wikipedia]:
Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.В своей статье Inversion of Control Containers and the Dependency Injection pattern Мартин Фаулер вводит понятие Dependency Injection (Dependency Injection) - внедрение зависимости - как разновидность IoC. Всего он выделяет три типа DI в зависимости от того, через что осуществляется DI:
1) Interface injection
2) Setter injection (пример)
3) Constructor injection (пример)
SqlCE 3.5 to 4.0 Converter
Недавно (в июле этого года) вышла новая версия MS Sql CE, в которой был изменен алгоритм шифрования (стал использоваться SHA-2). Это означает, что для работы sql ce 4 с бд, созданной сервером версии 3.5, ее нужно предварительно переконвертировать. Для это в API предусмотрен специальный метод, поэтому особого труда конвертирование не вызовет.
Давайте напишем конвертер для файлов баз данных в формате slq ce 3.5 в формат slq ce 4.0.
Писать будем на C# в TDD-стиле, использовать VS 2008, тестировать в xUnit (последнюю версию можно скачать с codeplex). Когда вы используете TDD, не нарушая основных принципов ( а их всего три - RGR (красный-зеленый-синий): пишем тест, пишем код, рефакторим) и порядка их следования, то получаете автоматически приятные бонусы в коде.
Warning! Этот пост нужно рассматривать как пример по разработке в стиле TDD для начинающих.
Ярлыки
Копирайты
Блог о жизни вне кода
Постоянные читатели
Популярно
-
Продолжаю серию постов о своём первом андроид-приложении. Сегодня мысли о публикации приложения в разных маркетах.
-
Продолжаю серию заметок о разработке первого android-приложения. На этот раз речь о выборе стратегии монетизации приложения.
-
Два месяца прошло с момента публикации моего первого Android приложения на Play market, я перебралась на Самуи , а гугл по-тихоньку начал...
-
Продолжаю тему полевых заметок, начатую в предыдущем посте . В этот раз немного об инструментах и чуть-чуть о социальщине.
-
Подключить jQuery UI Autocomplete к сайту на Bootstrap довольно просто, единственное - нужно немного допилить стили. Всем страждущим в пом...
-
Разделяй и влавствуй - подход на все времена. Концепция модульного программирования не нова, и хорошо себя зарекомендовала. В мире разрабо...
-
Нарезка самых сочных моментов из выступления Александра Соловьёва на JavaScript Frameworks Day 2013. Доклад был про ClojureScript, полная ...
-
Небольшая сравнительная характеристика двух embedded-бд. + SQLite мальнкий размер БД (пустая база весит несколько килобайт против нескольких...
-
Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. Приемы объектно-ориентированного проектирования. ( скачать ) В предлагаемой книге описываютс...
-
Microsoft Enterprise Library – это набор блоков приложений многоразового использования, созданных как решения проблем, с...


