Зачем нужен рефакторинг?
Если у вас уже есть опыт применения рефакторинга, но вы всё равно не понимаете, зачем это нужно, и считаете рефакторинг пустой тратой времени, то есть несколько вариантов объяснения:
а) либо вы - босс и считаете, что так программисты "валяют дурака" - вроде что-то и делают, но нового функционала - 0! Цель рефакторинга - не увеличение производительности кода, не сокращение расходуемой памяти, не ускорение алгоритмов вычислений - это все могут быть положительные побочные эффекты. Цель рефакторинга - структуризация и упрощение кода, приведение его в порядок, чтобы другой программист, который будет работать с ним после, не получил психологическую травму :)
б) либо вы применяете рефакторинг не там, где надо - еще раз почитайте М.Фаулера, другие книги (например, Д. Кериевски, С.Макконнелла и др.), разберите внимательно примеры... Вспомните, как часто вы слышите фразу (или сами ее говорите) "Этот код готов. Он не совсем идеален, зато работает!". Эдакий "скорокод"! Он ведь просто кричит "Help me! I wanna be refactored!" Вот тут можете смело оттачивать свои навыки!
в) либо вы считаете, что пишете идеальный код! - спуститесь с небес на землю, такого не бывает! Это была плохая новость. А теперь хорошая: вам есть, куда расти. Я считаю, что программист развивается, растет, когда находит все новые и новые пути оптимизации кода. Это значит, что он научился чему-то, увидел проблему в другом свете, и ее решение, раньше казавшееся сложным, теперь для него - само собой разумеющееся, элементарное. И с этими новыми знаниями программист может существенно улучшить старый код. Оглядываясь назад, думаю , как изящно можно было б решить ту или иную проблему с накопленными знаниями!
Помните, что любой код можно улучшить, главное в этом деле - не переборщить. И не стоит гнаться за принципом "совершенству нет предела", тут немного другая математика :)
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
Задачка про песочные часы
Есть 2 песочных часов: первые отсчитывают 4 минуты, вторые - 7. Как, начиная с текущего момента, с помощью этих часов отмерить 9 минут?
MS Sql Server CE : какая dll для чего нужна?
После установки MS SQL Server CE мы получаем целый набор dll-файлов. Для чего нужна какая dll? Что нужно добавлять в проект, а что нет? Сейчас будем разбираться.
10 заповедей программиста
2. Не сотвори себе кумира из конкретной технологии. Ибо программирование требует постоянного развития, а технологии-кумиры останавливают развитие.
3. Не возноси хвальбу программированию в неподходящей компании. Ты сам себя накажешь, ибо будешь не понят, и люди отвернутся от тебя.
4. Работай много и хорошо, но не забывай и про отдых. Ибо нет ничего страшнее, чем код усталого, засыпающего программиста.
5. Уважай учителей и учеников своих. Постоянно учись и учи окружающих, чтобы было тебе всё легче и легче делать всё более и более сложные вещи.
6. Не убий в себе ребенка. Не забывай эмоции от первого запуска первой написанной тобой программы и воспринимай каждую следующую, как ту - первую.
7. Не изменяй программированию. Ибо программист может стать кем угодно, но этот кто угодно обратно программистом уже не станет.
8. Не кради код ближнего своего.
9. Не программируй то, что может принести вред другим. Ибо встав раз на путь дьявола - на нем и останешься.
10. Не завидуй ближнему твоему, если он умеет лучше программировать. Ибо программирование - это божественный дар, но его можно развить. Так что не завидуй, а развивай.
(скопипастено с инета)
Задачка для страшеклассников
Маленькая и совсем несложная задачка.
Есть две переменные a и b. Поменять местами их значения, не вводя третью переменную.Решение:
a = a+b
b = a - b
a = a - b
Еще одна интересная задачка
Нравятся мне эти задачки, несложные, но хитрые :) Вот еще одна.
Дано целое натуральное число. Без использования циклов и рекурсии поменять значение самого крайнего правого бита, равного 0, на 1.
Например, 0101 -> 0111; 1010 ->1011
Решение:value | (value+1)
Очень сложная задачка
Не так давно знакомый программист, проходивший собеседование в девелоперской конторе, поделился задачкой, которую получил на собеседовании:
Есть массив из N элементов, в котором находятся значения от 1 до N+1. Одно значение пропущено. Нужно его определить за линейное время. Массив не сортирован.
Вот такая хитрая задачка с ооочень тривиальным решением :)
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 (пример)
UML редактор
Наткнулась на SourceForge на милый UML-редактор NClass с элементами интерфейса, такими родными и привычными для меня как пользователя Visual Studio.
Простой и интуитивно понятный интерфейс. Поддерживает два типа диаграмм - java, c#, кодогенерацию, экспорт диаграммы в PDF, сохранение в разных графических форматах (png, jpg, etc...). Что еще сказать? Программа бесплатна, написана C#. Из минусов - нет Ctrl+Z, Ctrl+C, Ctrl+V :( Надеюсь, в следующих релизах появится поддержка этих поистине горячих сочетаний клавиш :)
TDD: начало
Что такое TDD?
Это способ управления страхом в процессе программирования.
Да, мне гораздо спокойней, когда работоспособность моего кода подтверждена и подтверждается постоянно тестами. В любой момент времени я могу запустить тесты и проверить, все ли работает. Особенно актуально это, когда изменения вносятся в код, написанный пару-тройку месяцев назад, а то и ранее. А если этот код еще и чужой, то шансы поломать что-то возрастают многократно. Имея хороший набор тестов можно безбоязненно и безболезненно вносить изменения в код. Говоря "хороший набор тестов" я намеренно не указываю число в процентах, потому что считаю test coverage весьма относительной метрикой. Стопроцентное покрытие - исключительно утопия. И та еще тема для холивара :) Тестов должно быть столько, сколько требуется для уверенности в вашем коде и спокойного сна, если представить, что каждый ваш проект - система обеспечения АЭС ;)
К чему стремится TDD?
К чистому коду, который работает.
Ключевое слово здесь - чистый. Код, который работает, может написать каждый. И зачастую такой код - выходец из семейства "говнокодовых". Думаю, такой код в начале тернистого пути совершенствования навыков программирования писали все. Но есть несколько вещей, которые заставляют двигаться от кода, который работает, в сторону "чистого кода, который работает" - начинаются сложности при поддержке кода, внесении изменений, расширении системы... признаки того, что все катится в сторону антипаттерна Big ball of mud :(
Каковы правила TDD?
Красный - зеленый - рефакторинг
Эти правила просты, как дважды два:
1) Красный - пишем тест. Не факт, что он заработает сразу (или даже скомпилируется). Напротив, это тревожный знак. Ведь тесты мы пишем всегда перед написанием кода. «Тест, написанный после кода, ничего не стоит и является только обузой.»
2) Зеленый - заставляем тест работать, создавая при этом минимум кода. О чистоте и порядке на этом этапе задумываться еще рано. Тест должен работать. И работать быстро. Вот что главное на данном этапе. Минимум усилий. Ничего лишнего. Тут мы создаем код, который работает.
3) Рефакторинг - наводим порядок. Убираем дублирование и остальные запашки. После каждого действия запускаем тесты, проверить, ничего ли не поломалось. Время создавать чистый код, который работает.
И кто это все придумал?
Тестирование имеет довольно длинную историю, уходя вглубь веков. Первые упоминания о тестировании можно найти в 1975 (в "Мифическом человеко-месяце" Брукса). А сама методология Test-Driven Development и ее основные принципы были сформулированы Кент Беком в книге "Extrime Programming Explained", увидевшей свет в 1999 году. С тех пор и понеслось :)
Что нужно, чтобы начать?
Нужно немного - желание, храбрость, терпение и фреймворк для тестирования под платформу, на которой вы программируете. Или можете сами его написать, как это делает Кент Бек. Заодно и попрактикуетесь:)
А еще?
А еще можно (нужно) искать тут:
Кент Бек. "Экстремальное программирование: разработка через тестирование"
Roy Osherove Understanding TDD (видео, en)
Джерард Мессарош «Шаблоны тестирования xUNIT»
Джошуа Кериевски. "Рефакторинг с использованием шаблонов"
М. Фаулер "Рефакторинг. Улучшение существующего кода."
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 для начинающих.
MS Sql CE 4 CTP1
В июле этого года вышел SQL Server CE 4 CTP1, что, конечно же, является хорошей новостью! Скачать sql ce 4 можно с сайта Microsoft, дистрибутив радует размером - всего 2.5 мб для х64 и 2.0 мб для х32.
Что же нового в четвертом компакте? Много было сделано для использования sql ce в ASP.NET приложениях - теперь компакт выдерживает нагрузку сайтов-стартеров с не большим количеством посещений. Внедрили поддержку SHA 2 - шифрования. Это означает, что для перехода с sql ce 3.5 на 4.0 база данных должна быть предварительно проапгрейдена предусмотренным в API методом SqlCeEngine.Upgrade(). Так же это означает, что slq ce 3.5 не может работать с файлами данных, созданными четвертым компактом.
Компакт теперь умеет беспроблемно работать с ADO.NET Entity Framework 4.0, что тоже радует :)
Важно отметить, что в четвертом компакте изменился Transact-SQL-синтаксис: добавлены ключевые слова OFFSET & FETCH:
SELECT * FROM Employees ORDER BY [Hire Date] OFFSET 10 ROWS;
SELECT * FROM Orders ORDER BY [Shipped Date] OFFSET 2 ROWS FETCH NEXT 1 ROW ONLY;
Так же изменился API:
System.Data.SqlServerCe.SqlCeConnection.GetSchema() - возвращает информацию о базе данных.
SqlCeConnection conn = new SqlCeConnection("DataSource=Northwind.sdf");
try
{
conn.Open();
DataTable dt = conn.GetSchema();
dt = conn.GetSchema("Tables");
dt = conn.GetSchema("Columns");
dt = conn.GetSchema("Indexes");
dt = conn.GetSchema("IndexColumns");
dt = conn.GetSchema("ForeignKeys");
}
catch (Exception e)
{
//Fail
}
System.Data.SqlServerCe.SqlCeConnectionStringBuilder - позволяет легко строит connection strings для компакта.
SqlCeConnectionStringBuilder builder = new SqlCeConnectionStringBuilder();
builder["Data Source"] = sqlCEdbPath;
builder["Mode"] = dbMode;
builder["Password"] = password;
Console.Write( builder.ConnectionString );
Более подробно об этих и других нововведениях можно почитать в блоге Rob Tiffany
А тут можно почитать о тулзе для конвертирования файлов sql ce 3.5 в slq ce 4.0
Подкасты для разработчика
Подкасты - это отличный способ получения информации при минимальных затратах времени. Подкасты можно слушать по дороге на работу, в университет, во время утренней пробежки...
Какие подкасты будет интересно слушать разработчику? За всех на этот вопрос не отвечу, но расскажу, какие подкасты я слушаю с удовольствием.
http://rpod.ru - кладезь подкастов. На любой вкус и цвет. Тут в следует выделить, во-первых, отличные подкасты Петербургской Группы Alt.Net http://spbaltnet.rpod.ru/ В каждом выпуске подкаста море полезной и интересной информации.
О подкасте:
Петербургская группа Alt.Net создана с целью проведения в Санкт-Петербурге семинаров и технических встреч, связанных с разработкой в среде .NET. Наша цель – помочь друг другу узнать больше о том, как работать в среде .Net, как эффективно использовать различные технологии, методологии и практики в нашей работе.
Дальше - Domain Driven Design Study Group. Тут можно послушать обсуждения книги Эрика Эванса "Domain-Driven Design: Tackling Complexity in the Heart of Software". Всем, кто хочет познакомиться с DDD, стоит обратить внимание на этот подкаст.
Следующий подкаст - Качественный код и методология Agile. Название подкаста говорит само за себя. Выпуски небольшие по длительности, один выпуск - одна конкретная тема.
The Art Of Programming - ориентирован на Java, Flash/Flex, но тоже интересно послушать.
Следующий кладезь подкастов для IT-шника http://www.dotnetrocks.com - The internet radio talk show for .Net developers. В студию приглашаются дотнет разработчики и рассматривается какая-то конкретная тема. Подкаст на английском языке.
http://www.hanselminutes.com - англоязычный еженедельный подкаст для ASP.NET или Windows разработчиков. В студию приглашаются известные разработчики и дают интервью. Например, интервью с Роем Ошро The Art of Unit Testing with Roy Osherove.
Elegant Code Cast и Software Engineering Radio - еще две англоязычные подкаст-ленты, которые я с удовольствием слушаю.
UPD: Spbaltnet переехали. Теперь их нужно искать на podfm.ru http://spbaltnet.podfm.ru
Лето...
На улице жара, делать ничего не хочется, мысли бессвязно и очень вяло ползают в голове... Работа не идет, вспоминается поговорка "Если хочешь поработать – ляг, поспи и все пройдет". Даже кофе не помогает!
Надо как-то себя мотивировать, а ни один способ мотивации не срабатывает...
Нет, один срабатывает, но эффективность все равно не та: через силу начинаю делать и по чуть-чуть увлекаюсь, и пошел процесс.... Последнее, что пришлось делать через принуждение - переписывать код за коллегой... Сначала задание было "чуток дописать", но, увидев "чудеса чудесные, прелести прелестные" пришлось переписать добротный кусок кода, а занятие это не из приятнейших... Само по себе редактирование, правка чужого кода - та еще задача. А если код написан из рук вон плохо, с огромным количеством "code smells" ;( ... Ничего, бывает, пережили...
Главное, что до пятницы осталось совсем немного - еще пятьдесят три минуты рабочего времени понедельника и три дня!
Пример рефакторинга кода на C#
Рефакторинг (англ. refactoring) — процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы. В основе рефакторинга лежит последовательность небольших эквивалентных (то есть сохраняющих поведение) преобразований.Давайте рассмотрим на примере.
10 поговорок, которые должен знать каждый программист
Перевод поста "10 Programming Proverbs Every Developer Should Know" Кевина Панга. Оригинал тут
Поговорки выражают общеизвестные истины или жизненные уроки в короткой и запоминающейся форме. Я считаю, что это отличный способ вести дела - и в личной жизни, и на работе. Поэтому я выделил 10 поговорок, которые каждый программист должен иметь в своем арсенале.
Топ 10 вещей, которые бесят программистов
Перевод поста "Top 10 Things That Annoy Programmers" Кевина Панга. Оригинал тут
Библиотека
Д. Нильссон. Применение DDD и шаблонов проектирования (скачать)
Книга о разработке корпоративных программных приложений в среде .NET с применением шаблонов проектирования. В ней описаны: как строится четкая и удобная, с точки зрения сохраняемости, модель предметной области (Domain Model), рассматриваются вопросы проектирования, ориентированного на предметную область (DDD, или Domain-Driven Design), разработки посредством тестирования (TDD, или Test-Driven Development), объектно-реляционное преобразование, т.е. методы, которые относятся к ключевым технологиям разработки программного обеспечения. По мере развития и усложнения технологии все большее значение приобретают вопросы правильного применения методов проектирования, которые налаживают взаимосвязь между пользователями и разработчиками, предметной областью и программным обеспечением, логикой и хранением информации, проектировщиками баз данных и программистами.
Большинство примеров кода, в книге, представлено на языке C#, но материал окажется полезным и пользователей платформы Java.
Книга адресована опытным разработчикам архитектуры и прикладного программного обеспечения уровня предприятий, в том числе и в среде .NET.
Р. Мартин, Д. Ньюкирк. Быстрая (гибкая) разработка программ: принципы, шаблоны, практика (скачать)
Книга рассказывает о различных методиках быстрого (и даже экстремального) программирования. Изложение начинается с обзора основных понятий экстремального программирования и завершается готовыми программами, применяемыми на практике. В каждой главе приведены примеры кода на языках программирования Java и C++. Книга будет полезной руководителям групп программистов, нацеленных на быструю разработку коммерческих программных проектов, характеризующихся высоким уровнем качества и минимальной себестоимостью.
Комментарии в коде
Все мы не раз слышали, что код нужно комментировать, чтобы в нём потом можно было разобраться. Неопытные программисты часто возражают : "Это мой код, и я знаю, что он делает, и не забуду даже через полгода, что значит переменная k в выражении empS += k*arr[i] + bon[i]!" И при этом совершенно не учитывается, что кроме них, этот код могут править другие программисты - те бедолаги, которым придется сопровождать этот код. Но, опять же, комментарии, написанные, лишь бы написать, чтоб не цеплялись, - это еще хуже, чем отсутствие комментариев.
При плохом выполнении комментирование является пустой тратой времени и иногда причиняет вред.
С.Макконнелл
Например, в следующем коде комментарии совершенно бесполезны, потому что совершенно ничего не говорят:
int k = getKoeff(m); /*инициализируем переменную k значением, возвращаемым методом getKoeff */
double empS = 0.0; //инициализируем переменную empS нулем
for(int i=0; i<getWNub(m); i++)
{
empS +=k*arr[i] + bon[i]; //вычисляем сумму в цикле
}
Раз уж зашел разговор о полезности комментариев, то давайте определим цели - для чего вообще нужны комментарии в коде? Комментарии должны давать представление о том, что делает данный код, должны помогать читать его, так? На мой взгляд, самый лучший комментарий к коду - сам код.
Хороший код сам является самой лучшей документацией. Если код настолько плох, что требует объемных комментариев, попытайтесь сначала улучшить его.Я не призываю отказаться от комментариев в коде, я призываю к написанию ясного кода, который легко понять и модифицировать даже по прошествии длительного периода времени.
С.Макконнелл
Что в моем понимании "ясный код"? Это, конечно же, самодокументирующийся код. Например, предыдущий кусок кода можно переписать так:
int koefficient = getSalaryKoefficient(monthNumber);
double employeeSalary = 0.0;
int workingDaysInCurrentMonth = getWorkingDaysNumber(monthNumber);
for(int dayNubmer=0; dayNumber<workingDaysInCurrentMonth; dayNubmer++)
{
employeeSalary +=koefficient*workingHours[dayNubmer] + dayBonus[dayNubmer];
}
Что изменилось в коде? Всего лишь имена переменных и методов, но этот код, в отличие от первого его варианта, понятен без комментариев. Имена переменных и методов говорят сами за себя, им не нужны никакие комментарии. Такими же должны делать имена классов, интерфейсов, констант, перечислений, элементов перечислений и т.д. О том, насколько важно правильно выбирать имена и как это делать, можно почитать в книге "Совершенный код" С. Макконнелла.
Почувствовав потребность написать комментарий, попробуйте сначала изменить структуру кода так, чтобы любые комментарии стали излишними...Как менять структуру кода и когда это нужно делать, можно почитать в книге Мартина Фаулера "Рефакторинг. Улучшение существующего кода". Но, конечно же, есть несколько случаев, когда следовать вышеприведенной цитате не нужно. Во-первых, когда код делает не очевидные вещи, например (пример взят из книги "Совершенный код" С.Макконелла):
М.Фаулер
for(element = 0; element<elementCount; element++)
{
/*Для деления на 2 используется операция сдвига вправо. Это сокращает время выполнения цикла на 75% */
elementList[element] = elementList[element] >>1;
}
Вряд ли программист, который будет сопровождать этот код (даже сам автор по прошествии времени), сможет с первого раза догадаться, зачем тут нужен побитовый сдвиг вправо на единицу без комментария.
Во-вторых, стоит комментировать неявные значения, например:
//Цвет фона по умолчанию - белый
itemBgColor = Color.FromAGB(255,255,255);
Этот код лучше будет даже переписать следующим образом:
const Color DEFAULT_BG_COLOR = Color.FromAGB(255,255,255);
...
itemBgColor = DEFAULT_BG_COLOR;
Кроме того, следует комментировать использование недокументированных возможностей или исправление обнаруженных ошибок - ведь в следующих версиях системы этих возможностей может и не быть, а ошибки могут быть исправлены :)
Полезным может оказаться документирование ограничений, если они не заданы константами с говорящими именами, а используются в коде как есть - в виде чисел. Но с таким настоятельно советую бороться :)
В своей практике кроме всего выше перечисленного я предпочитаю давать краткое описание методу перед началом его кодирования, при этом использую очень замечательную возможность документирования кода в Visual Studio. Это выглядит так:
/// <summary>
/// Возвращает следующий по номеру ваучер по отношению к номеру текущего ваучера
/// </summary>
/// <returns>VoucherItem</returns>
public VoucherItem GetNextVoucherItem()
{
return VoucherRepository.GetNextVoucher(this.VoucherNumber);
}
Клиентский код, использующий методы моего класса, получает возможность использовать IntelliSense, что очень удобно.
И напоследок приведу такую цитату:
Пишите код, исходя из того, что все программисты, которые будут сопровождать вашу программу, - склонные к насилию психопаты, знающие, где вы живёте.
С.Макконнелл
Регулярные выражения
Для облегчения работы с регулярными выражениями я использую бесплатную утилиту от Rad Software - Regular Expression Designer.
Среди фич можно выделить следующие:
Удобное отображение результата выполнения выражения - строится многоуровневое дерево для Matches, Groups и Captures. При клике на ветку дерева в исходном тексте выделяется фрагмент, соответствующий результату.
Очень удобно сделано окно "Language Element" - справочник по регулярным выражения всегда под рукой. Но для не владеющих английским (о_О) он может оказаться не очень полезным.
Найти более подробное описание программы и скачать ее можно на сайте разработчика - http://www.radsoftware.com.au/regexdesigner/
Mpress VS Avira
Недавно к своему сожалению обнаружила, что некоторые антивирусы, в особенности Avira, распознают exe-файлы, запакованные с помощью пакера Mpress, о котором упоминалось ранее в этом блоге, как вирус.
О колбасе :)
Жена посылает мужа-программиста в магазин:
- Дорогой, купи, пожалуйста, палку колбасы, и если будут яйца, то купи десяток.
Через полчаса программист возвращается с десятью палками колбасы.
Жена:
- Что это?! Зачем ты купил столько колбасы?
Программист:
- Ну так яйца-то были...
Вебкаст "Технический обзор LINQ"
Отличный вебкаст Романа Здебского "Технический обзор LINQ".
Доклад с конференции «Платформа – 2009». В докладе раскрывается принципиально новый подход к построению запросов и трансформации данных (объекты, реляционные структуры, XML) в .NET-языках программирования. Основной темой обсуждения служит использование преимуществ работы с проекциями данных в стиле реляционных движков в полностью типизированном окружении с контролем ошибок на этапе компиляции кода.
Ускоряем Linq2Sql: Compiled Query & ObjectTrackingEnabled
Когда код компилируется - это хорошо. Когда код работает так , как было задумано, - это еще лучше. Ну, а когда код, к тому же, работает быстро - это вобще здорово. Есть масса способов увеличения скорости работы кода, в этом посте я хочу рассказать о возможности увеличения скорости выполнения запросов Linq2Sql.
Если в приложении есть повторяющиеся запросы или запросы, похожие по структуре, но отличающиеся параметром, можно существенно увеличить производительность, если выделить общий запрос, скомпилировать его один раз в лямбда-выражение и затем выполнять уже скомпилированный запрос раз с различными параметрами.
Для этих целей .NET 3.5 и выше есть класс CompiledQuery. Работа с этим классом не представляет ничего сложного. Для примера возьму кусок кода из своего проекта. Смысл в том, что нужно выбирать из БД список форм, соответствующих проекту, заданному через ID. Для этого у меня создан такой скомпилированный запрос:
private static Func<MyDataContext
, int, IEnumerable<Forms>>fGetFormsByProjectID =
CompiledQuery.Compile<MyDataContext
, int, IEnumerable<
Forms
>>
((MyDataContext
context, int projectID) => context.Forms.
Where<Forms>(form => form.ProjectID == projectID));
А в вызывается он следующим образом:
IEnumerable<forms> forms = fGetFormsByProjectID(new MyDataContext
(ConnectionPool.Connection), projectID);
Кроме использования скомпилированных запросов для увеличения скорости выполнения запросов к БД можно использовать получение данных в режиме "Только чтение". Для этого перед выполнением запроса установите свойство ObjectTrackingEnabled вашего DataContext-экземпляра в false:
using(MyDataContext context = new MyDataContext(ConnectionPool.Connection))
{
context.ObjectTrackingEnabled = false;
var query = from form in context.Forms where form.StatusID == Status.Completed select form;
}
При использовании данного метода следует помнить, что вызов метода SubmitChanges() в режиме получения данных только для чтения вызовет исключение.
На тему производительности Linq2Sql Rico Mariotty провел серию тестов, результаты которых опубликовал в пяти статьях:
DLinq (Linq to SQL) Performance (Part 1)
DLinq (Linq to SQL) Performance (Part 2)
DLinq (Linq to SQL) Performance (Part 3)
DLinq (Linq to SQL) Performance (Part 4)
DLinq (Linq to SQL) Performance (Part 5)
Еще статьи по теме:
http://msdn.microsoft.com/ru-ru/magazine/ee336024.aspx
Полезные акселераторы Visual Studio
Shift-F12 - найти все ссылки
F2 - рефакторинг "Rename method"
Ctrl-R, Ctrl-M - рефакторинг : извлекает выделенный фрагмент кода в отдельный метод
Ctrl-K, Ctrl-C - комментирует выделенный фрагмент кода
Ctrl-K, Ctrl-U - раскомментировать выделенный закомментированный фрагмент кода
Ctrl-E, Ctrl-D - форматирование кода. Например, при вставке кода с синтаксическими ошибками студия не сможет нормально отформатировать вставленный кусок. После устранения ошибок Ctrl-E, Ctrl-D позволяет автоматически расставить все отступы, пробелы и переводы строк согласно текущим настройкам по форматированию кода (Tools->Options->Text Editor->C#->Formatting).
Ctrl+] - перемещение между скобками, комментариями и другими парными элементами ({}, (), /**/, #region/#endregion, ...). Например, если курсор находится на открывающейся скобке, то Ctrl+] переместит его на соответствующую ей закрывающуюся, и наоборот.
Ctrl+C - копирует выделенный текст :), при отсутствии выделения копирует в буфер обмена текущую строку.
Ctrl+L - удаление текущей строки
Ctrl-M, Ctrl-M - сворачивает/разворачивает регион кода, в котором находится курсор (это может быть метод, namespace, комментарий и т.п.)
Ctrl-M, Ctrl-O - Collapse to Definitions
Ctrl-Shift+Space - вызывает intellisense suggestions window на текущем элементе
Создаем ярлык (Shortcut) приложения на рабочем столе, в пуске на C#
Создать ярлык приложения очень просто. Для этого нам понадобится библиотека Interop.IWshRuntimeLibrary, которую нужно подключить в референсы проекта (в SolutionExplorer выбираем нужный проект, правой кнопкой по References->Add Reference, во вкладке COM находим "Windows Script Host Object Model" и клацаем ОК):
И так, подготовительный этап пройден.
Добавим в проект класс, который будет заниматься созданием ярлыков. У меня он именуется ShortcutManager. Состоять он будет из одного статического метода CreateShortcut:
public class ShortcutManager
{
public static void CreateShortcut(string linkName, string apppath, string iconpath, ShortcutLocation location, string hotkey)
{
object shortPath = null;
// Определяем место, где будет создан ярлык
switch (location)
{
case ShortcutLocation.DESKTOP:
{
shortPath = (object)"Desktop";
}; break;
case ShortcutLocation.START_MENU:
{
shortPath = (object)"StartMenu";
}; break;
case ShortcutLocation.COMMON_DESKTOP:
{
shortPath = (object)"AllUsersDesktop";
}; break;
default: shortPath = (object)"Desktop"; break;
}
WshShell shell = new WshShell();
// Получаем полный адрес ярлыка
string link = Path.Combine(((string)shell.SpecialFolders.Item(ref shortPath)), linkName + @".lnk");
// Создаем объект ярлыка
IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(link);
if (!hotkey.Equals(String.Empty))
{
// Назначаем горячую клавишу
shortcut.Hotkey = hotkey;
}
// Описание ярлыка
shortcut.Description = linkName;
shortcut.IconLocation = iconpath;
//Указываем рабочую папку
shortcut.WorkingDirectory = Path.GetDirectoryName(apppath);
// Указываем путь для программы
shortcut.TargetPath = apppath;
// Вызываем метод Save(), который и создаст ярлык
shortcut.Save();
}
}
ShortcutLocation - это Enum, содержащий возможные варианты размещения ярлыка:
public enum ShortcutLocation
{
DESKTOP,
COMMON_DESKTOP,
START_MENU
}
Для примера ярлык может быть создан на рабочем столе текущего пользователя, на общем рабочем столе и в пуск->программы.
В качестве входных аргументов CreateShortcut должен получить название ярлыка (linkName), полный путь к приложению, для которого создается ярлык (apppath), полный путь к иконке, которая будет установлена на ярлык (iconpath), размещение ярлыка (location), горячая клавиша (сочетание клавиш hotkey).
Пример использования CreateShortcut:
Shortcut.ShortcutManager.CreateShortcut("Sample Shortcut", Application.ExecutablePath, Application.ExecutablePath, ShortcutLocation.DESKTOP, String.Empty);
Полный код примера можно скачать тут.
Закрытие torrents.ru
Делегирование домена крупнейшего российского торрент-трекера было приостановлено по решению прокуратуры, сообщила пресс-служба регистратора доменных имен в зоне .ru "Ру-Центр".
Torrents.ru - крупнейший российкий Bit-Torrent-трекер, ищеющий более чем 4 миллионами активных пользователей и около миллиона торрентов, 18 февраля 2010 года закрыт по требованию прокуратуры.
Администрация трекера отмечает, что не получала никаких уведомлений о прекращении делегирования домена torrents.ru и не знает о причинах такого решения.
Работа домена будет приостановлена до тех пор, пока не закончится разбирательство трекера с правоохранительными органами. В "Ру-Центр" направлен соответствующий запрос, однако, весьма вероятно, что выяснение обстоятельств займет некоторое время, в течение которого адрес torrents.ru будет недоступен.
В настоящее время он перенаправляет на "зеркало" сайта по адресу rutracker.org, где размещено сообщение о сбое и инструкции для работы с новым адресом. На этом домене уже работает форум трекера.
18 февраля, то есть вчера, на стартовой страницы сайта torrents.ru весел совет как теперь всем быть дальше: «Мы вынуждены были в срочном порядке сменить доменное имя на rutracker.org. Технически, это означает что для продолжения обмена информацией вам необходимо сменить адреса трекеров в уже скачанных торрент-файлах с bt.torrents.ru на bt.rutracker.org, (вместо bt может быть bt2, bt3 и bt4) либо скачать эти торрент файлы заново (в них уже будет новый адрес трекера). Все остальные ссылки на форуме будут изменены автоматически, однако возможно вам потребуется заново ввести логин и пароль при входе на форум, чтобы броузер запомнил новый адрес». Сегодня же трекер вобще не доступен :(
Помним, скорбим.
SQLite Vs MS SQL CE
Небольшая сравнительная характеристика двух embedded-бд.
- + SQLite мальнкий размер БД (пустая база весит несколько килобайт против нескольких сот килобайт ms sql ce)
- + SQLite - кроссплатформенная бд.
- - MS SQL CE - лимит файла БД в 4 Гб против 1 Tb у SQLite
- - MS SQL CE - нет триггеров, представлений (на этом моменте хочется заплакать:( )
- - MS SQL CE - уступает по скорости SQLite
- - SQLite - нет типа boolean
- - SQLite - провайдеры linq to sqlite только платные, бесплатный недопиленный (не позволяет работать с представлениями)
- + SQLite - опенсорсный проект, MS SQL CE - закрытый исходный код
О безопасноти входных данных
Не забывайте о том, что входные данные - всегда небезопасны. Не доверяйте пользователям, особенно если это касается веб-приложений!
(картинка отсюда http://www.xkcd.ru/327 )
Лучше быть первым, чем правым?
Еще одна моя заметка о разработке ПО, опубликованная в блоге http://www.ht.ua/blog/making_soft/
С повсеместным распространением интернета перед нами открылось море новых возможностей, начиная от развлечений до новых возможностей для бизнеса. Для разработчиков открылось не только новое поле деятельности, но и новый способ распространения своих продуктов. Доставка продукта конечному пользователю через интернет - быстро, удобно, дешево. К тому же интернет позволяет программисту более легко исправить версию продукта с ошибкой на версию продукта без ошибки - всего лишь обновить файл на сервере и все! Не надо думать о том, что на складе лежат коробки с CD-дисками программы, на которых эта дурацкая ошибка! В случае распространения продукта через интернет пользователь всегда получит самую свежую версию.
В условиях экономической конкуренции целью компаний, выпускающих продукты в одной нише, является завоевание большего количества клиентов. Как это сделать? От чего это зависит? Правильный маркетинг? Не только. Представьте, что ваш конкурент месяц назад выпустил продукт, разрекламировал его, занял какую-то долю клиентов. Вы знаете, что его продукт не идеален, содержит ошибки, а ваша программа - без единой ошибки (конечно, это из ряда фантастики :) ). И вот вы готовите к выпуску свой продукт, а ваш конкурент - выпускает исправления своей программы. Вы организуете маркетинговую компанию, но... Но рынок-то уже занят конкурирующим продуктом. Как вы думаете, что пользователю будет легче - скачать и установить обновления или полностью перейти на новый продукт?
И вот тут замечается плохая тенденция.
... разработчики утверждают, что пользователи просто хотят скорее получить ПО, нежели обрести его безукоризненную версию. ... Лучше быть первым, чем правым.[1]А так ли это? Насколько лучше быть первым, чем правым? Ведь преспокойно можно заработать репутацию компании, выпускающей некачественный продукт. С другой стороны, есть возможность заполучить больше ни о чем не подозревающих пользователей. На мой взгляд, такая тактика выпуска "неидеального ПО" уместна только в том случает, если ошибка не значительна, если ее себестоимость не велика по сравнению с задержкой выпуска продукта. Под себестоимостью ошибки я понимаю сумму неудобств, которые предоставит эта ошибка пользователю, и время, которое будет потрачено на исправление этой ошибки. Самые легкие ошибки - это опечатки :) Порой на них можно закрыть глаза (только тссс!). Примером некритичной ошибки так же может служить возникновение сбоя в программе, если у пользователя установлено какое-то редко встречающееся приложение, которое чудным образом конфликтует с вашим. Вы потратите гораздо больше сил и времени на поиск и устранение проблемы, чем выиграете от этого. Сколько процентов ваших клиентов пользуются этим редко встречающимся приложением? 1%? или 2%? Только не подумайте, что я призываю оставить этого пользователя на произвол судьбы. Нет, нет и нет. Просто такую ошибку вы можете исправить позже, когда у вас не будет более приоритетных задач. Конечно, выпуск продукта, в котором возникает fatal error при нажатии на кнопку сохранить, если у клиента драйвер видеокарты не от компании ATI - это большой грех :). Такого нельзя допускать ни в коем случае. Эту ошибку следует исправить.
Таким образом, все решает цена вопроса - не всегда оказывается уместной поговорка "семь раз отмерь, один раз отрежь", иногда "лучше быть первым, чем правым".
[1] С.Макконнелл. "Профессиональная разработка программного обеспечения"
Библиотека
Джон Роббинс. Отладка приложений для Microsoft .NET и Microsoft Windows (скачать)
В книге описаны тонкости отладки всех видов приложений .NET и Win32: от Web-сервисов XML до служб Windows. Каждая глава снабжена примерами, которые позволят увеличить продуктивность отладки управляемого и неуправляемого кода.
Майкл Ховард, Дэвид Лебланк, Джон Виега. 19 смертных грехов, угрожающих безопасности программ. Как не допустить типичных ошибок (скачать)
Сделайте свои программы безопасными, исключив с самого начала причины возможных уязвимостей. Эта книга необходима всем разработчикам программного обеспечения, независимо от платформы, языка или вида приложений. В ней рассмотрены 19 грехов, угрожающих безопасности программ, и показано как от них избавиться. Рассмотрены уязвимости на языках C/C++, C#, Java, Visual Basic, Visual Basic .NET, Perl, Python в операционных системах Windows, Unix, Linux, Mac OS, Novell Netware. Авторы бестселлеров Майкл Ховард и Дэвид Лебланк, обучающие программистов в Microsoft, как писать безопасный код, объединили усилия с Джоном Виега, человеком, который сформулировал 19 смертных грехов программиста, и решили написать это руководство. На различных примерах продемонстрированы как сами ошибки, так и способы их исправления и защиты от них.
Пара строк о собаках и корме
У Джоэла Спольски есть замечательная статья «А какую работу делают собаки в вашей стране?», рассказывающая об идиоме «to eat one’s dog food» в компьютерной индустрии. Идея использовать собственное программное обеспечение не нова, но почему-то ей уделяется мало внимания. Гораздо более раздута тема «юзабилити» и «программ с человеческим лицом». А ведь корни этой проблемы именно в «to eat one’s dog food». И делать это надо не для того, чтобы находить ошибки в программном обеспечении – для этого есть отряд бравых тестеров – а для того, чтобы находить ошибки в этом модном «юзабилити». Ведь так часто встречаются программы с нужным функционалом, но ими совершенно невозможно пользоваться! Или красочные, расфуференные веб-сайты, на которых невозможно что-либо найти! И приходится искать альтернативы, пользователь тратит время, а компания (программист) теряет клиента. У Дж. Спольски есть замечательный пример (по моим словам все у него замечательное ) на эту тему – когда в компании Juno (где он работал некоторое время), разрабатывавшей кроме всего прочего почтовый клиент, 90% персонала использовала Microsoft Outlook, и
...многие из нас считали, что если бы нас вынудили использовать свой продукт, нам пришлось бы его усовершенствовать хотя бы для того, чтобы уменьшить свои мучения.Из своего личного опыта вспоминается случай, когда в качестве тестового задания мне дали написать маленькую программулинку, смысл которой – считать время, потраченное человеком на выполнение какого-то задания. И вот, когда результат был готов и предоставлен строгому жюри, у меня спросили «Как этим пользоваться?» Программа работала, выполняла нужные функции, но была жутко неудобная – была полностью неправильная с точки зрения юзабельности, и мне это стало отлично ясно после непродолжительного постоянно использования в своей работе. И эта была главная ошибка, гораздо страшнее той, если б программа ошибалась на пару секунд при подсчете общего времени, ведь
ВЫИГРЫВАЕТ ТОТ, КТО ПРЕДОСТАВЛЯЕТ ПОЛЬЗОВАТЕЛЮ БОЛЕЕ КОМФОРТНЫЕ УСЛОВИЯ РАБОТЫ
Конечно, тут можно найти много возражений типа «пользователи это осьминоги... восемь кривых шаловливых рук, которые растут из ж*пы» и им не угодишь – одним это хорошо, другим именно это плохо, и во многом это дело привычки… Но вы попробуйте ежедневно использовать свой продукт, и, надеюсь, вам это поможет сделать его качественнее.
В конце этой маленькой заметки хочу выразить восхищение своим начальником, который давно использует принцип «to eat one’s dog food» в своей практике и который так старательно приучает использовать его и нас. Все задачи, которые можно решить с помощью продуктов, выпущенных нашей фирмой, мой начальник решает с помощью наших программ.
Пы.Сы. После написания сей заметки мне стало даже немного стыдно, что до сих пор использую не все наши продукты, которые могла б…
Библиотека
Г. Шилдт. Полный справочник по C# (скачать)
В этом полном справочнике по C# - новому языку программирования, разработанному специально для среды .NET, - описаны все основные аспекты языка: типы данных, операторы, управляющие инструкции, классы, интерфейсы, делегаты, индексаторы, события, указатели и директивы препроцессора. Подробно описаны возможности основных библиотек классов C#.
Э. Троелсен. Язык программирования C# 2005 и платформа NET 2.0. (скачать)
В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования С# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL.
Э. Троелсен. C# и платформа. NET. Библиотека программиста. (скачать)
Основная цель этой книги дает читателю прочные знания синтаксиса и семантики C#, а также разобрать особенности архитектуры .NET. После ее прочтения вы познакомитесь со всеми основными областями, охваченными библиотекой базовых классов C#. Для приобретения практических навыков книга содержит множество примеров, иллюстрирующих излагаемый материал. Для работы с книгой не нужен какой-либо предварительный опыт работы с C# и платформой .NET, однако при ее написании авторы ориентировались на тех разработчиков, которые уже имеют опыт работы с одним из современных языков программирования (C++, Visual Basic, Java или каким-либо другим).
Дж. Рихтер. CLR via C#. Программирование на платформе Microsoft .NET Framework 2.0 на языке C#. (скачать)
Эта книга - подробное описание внутреннего устройства и функционирования общеязыковой исполняющей среды (CLR) Microsoft .NET Framework версии 2.0. В ней раскрыта система типов .NET Framework и разъяснены способы управления ими. Представлены концепции программирования с широким использованием библиотеки FCL, относящиеся ко всем языкам, ориентированным на работу с .NET Framework. Особое внимание уделено обобщениям, управлению асинхронными операциями и синхронизации потоков. Книга ориентирована на разработчиков любых видов приложений на платформе с .NET Framework: Windows Forms, Web Forms, Web-сервисов, консольных приложений и пр.
Трей Нэш. C# 2008: ускоренный курс для профессионалов. (скачать)
Книга "C# 2008: ускоренный курс для профессионалов" ведущего специалиста в области технологий .NET представляет собой интенсивный курс по новейшей версии языка C#, воплотившей в себе важные дополнения и предлагающей среду, в которой функциональное программирование может органично переплетаться с обычным стилем императивного программирования на C#. Подробно рассматриваются такие темы, как фундаментальные принципы объектно-ориентированного проектирования, основные структуры данных, обработка исключений, делегаты, анонимные функции, контракты и интерфейсы, события, обобщения и многопоточность, а также нововведения наподобие лямбда-выражений, расширяющих методов и языка LINQ.
Агуров. C#. Сборник рецептов. (+CD) (скачать)
При написании программ особенно важно не тратить время на поиск стандартных решений, а сосредоточиться на решении конкретной задачи, используя готовый эффективный код, разработанный и проверенный коллегой-программистом. В этой книге собраны лучшие рецепты и решения, которые пригодятся вам при разработке программ любой сложности и помогут создать действительно качественный и быстрый код.
Агуров. C#. Разработка компонентов в MS Visual Studio 2005/2008 (скачать)
Книга содержит всю необходимую информацию для создания полноценных компонентов Win Forms на языке C# в MS Visual Studio 2005/2008, начиная с разработки и отладки и заканчивая лицензированием и распространением. Рассмотрены дизайнеры, конвертеры типа, сервисы, редакторы типов и многое другое. Информация о каждом классе, описанном в книге, сопровождается примером его использования. Весь программмный код является авторской разработкой и проверен на практике. На компакт-диске приведены примеры из книги.
Библиотека
Дэвид Соломон, Марк Руссинович "Внутреннее устройство Windows 2000" (скачать)
Книга посвящена внутреннему устройству и алгоритмам работы основных компонентов MS Windows2000 (в т. ч. серверных версий) и файловой системы NTFS 5. Детально рассмотрены и системные механизмы: деспетчеризация ловушек и прерываний, DPC, APC, LPC, RPC, синхронизация, системные рабочие потоки, глобальные флаги и др. Также описываются все этапы загрузки операционной системы и завершения её работы. Книга предоставлена системным администраторам, разработчикам серьёзных приложений и всем, кто хочет понять, как устроена операционная система Windows2000.
Свен Шрайбер.Недокументированные возможности Windows 2000 (скачать)
Данная книга предназначена для системных программистов, желающих максимально эффективно использовать возможности операционной системы, для которой они разрабатывают программное обеспечение. В книге содержится огромный объем информации, к которой можно применить атрибут `не документировано`, кроме того, многие сведения ранее нигде не публиковались.
Библиотека
Джесси Торрес. Скрипты для администратора Windows. Специальный справочник. (скачать)
Книга содержит базовые сведения, описания и примеры скриптов, используемых для администрирования Windows. Рассматриваются основные команды и ключевые слова, используемые в интерпретаторах .bat файлов, KiXtart и Windows Script Host. В книге приведены рабочие примеры скриптов, выполняющих самые разнообразные задачи по автоматизации работы в среде Windows.
Командные файлы и сценарии Windows Script Host (скачать)
Приводятся сведения об основных командах Windows 9x/NT/2000, а также об утилитах пакета Windows NT Resource Kit, необходимых при написании командных файлов. Описывается сервер сценариев Windows Script Host (WSH), в котором для автоматизации задач администрирования операционной системы и управления работой приложений могут применяться объекты ActiveX. Даны примеры командных файлов и сценариев WSH, написанных на языке JScript и осуществляющих доступ к файловой системе компьютера, базам данных и службам каталогов.
Египта!
Неделя на Красном море оставила массу впечатлений - начиная от соприкосновения с чужой культурой и заканчивая историей. Конечно, перед поездкой я была наслышана о диких нравах арабов, но слушать чужие рассказы - это одно, а прочувствовать их на своей шкуре - это другое :)
Ярлыки
Копирайты
Блог о жизни вне кода
Архив блога
Постоянные читатели
Популярно
-
Понравился анекдот о колбасе и яйцах :) Жена посылает мужа-программиста в магазин: - Дорогой, купи, пожалуйста, палку колбасы, и если б...
-
Продолжаю серию постов о своём первом андроид-приложении. Сегодня мысли о публикации приложения в разных маркетах.
-
Бета-версия одиннадцатой cтудии вызвала много охов и ахов. Чтобы там ни говорили, работать в ней приятно, хоть по началу немного необычно. ...
-
Jquery.Inputmask - крутой (да-да, именно) плагин, добавляющий гибкости в работу с обычным текстовым полем для ввода. Плагин является ус...
-
Перевод поста "Top 10 Things That Annoy Programmers" Кевина Панга. Оригинал тут
-
Разделяй и влавствуй - подход на все времена. Концепция модульного программирования не нова, и хорошо себя зарекомендовала. В мире разрабо...
-
Фридман А.Л. - Основы объектно-ориентированной разработки программных систем. ( скачать ) Книга написана как учебное пособие для студентов ...
-
Steve Freeman, Nat Pryce. Growing Object-Oriented Software, Guided by Tests ( скачать ) Test-Driven Development (TDD) is now an established...
-
Для некоторых методов класса Microsoft Code Analysis даёт такой совет: CA1822 : Microsoft.Performance : The 'this' parameter (or ...