Первая реализация ASP.NET использовала WebForms – самая ужасная идея для Web программирования. На то, чтобы это понять, у Microsoft ушло некоторое время, но за это время народ успел уже создать сайты на этой технологии. Но вот Microsoft уже одумалась и уже давно предлагает программистам более интересный и качественный вариант – MVC (Model View Controller).
Но только проблема в том, что старый вариант C# и ASP.NET использовали URL в виде ИмяФайла.aspx, после чего идут параметры страницы. А вот в MVC предлагается немного более гибкий вариант controller/action. Controller определяет файл, который будет обрабатывать запрос, а Action – это имя метода. Это очень удобно, но что делать, если у вас уже есть сайт на WebForms и не хочется терять старые URL, чтобы не терять ссылки, которые уже набраны. Ведь если изменить URL страниц, то все, что ссылается может быть разрушено.
Игрался, игрался собственным движком для игр под iPhone и меня это постепенно так затянуло, что уже стала получаться небольшая игра. Немного усилий и она может стать похожей на завершенный продукт, который можно будет выложить на всеобщее скачивание.
Давно я не работал с графикой особенно OpenGL, поэтому первые шаги давались с трудом. Потом все шло со скрипом, потому что не хватало знаний в Objective-C. Но по мере набора этих знаний все зашевелилось на много быстрее. Сегодня закончил класс аниматора, который должен амнистировать спрайты и сразу же произошел скачок в моей работе.
Играюсь с Objective-C, изучаю его и заодно пишу пару небольших примеров. Один из них связан с интернет программкой, другой – графический движок для себя (вспоминаю OpenGL). В одном месте у мне понадобилось часто использовать однообразные объекты, причем очень много раз. Логично стало не загружать их каждый раз и не освобождать память, а написать кэш, который будет сохранять данные для меня.
В качестве кэша я сделал статичную переменную для менеджера кэша, а сами данные решил размещать в NSMutableDictionary. Это что-то типа хэша. Переменная для хэша была объявлена у класса, а метод получения данных из него выглядит следующим образом:
На работе у парня возникла проблема, он не мог никак получить нужное число при округлении вещественного числа. Он долго не мог понять, почему следующий пример не дает правильного ответа:
if ((int)(double.parse("19.99") * 100 )== 1999) { Счастье } else { Что за фигня }
Он никак не мог понять, почему он постоянно оказывается в блоке «что за фигня», вместо счастье. Я говорю ему, что числа double никогда не хранятся точно, они хранятся долбанутом приблизительном формате. После double.parse("19.99") вы никогда не получите double число 19.99. Вместо этого вы получите что-то типа 19.9899999991. Именно так хранится double число в памяти компьютера.
Сегодня увидел в комментариях на блоге предложение народу начинать изучение программирование с Паскаля. Паскаль и С примерно одинаковы в изучении. У них синтаксис разный, но идея схожая. Недостаток начинать с этих языков - придется изучать указатели, выделения памяти и освобождение ресурсов. Вот почему раньше начинали изучать программирование с бейсика, а я рекомендую сейчас начинать с С#. Просто это проще.
Программирование и изучение первого языка далеко не для всех дается легко, и сразу же нырять с головой в указатели далеко не просто. Это отпугивает народ, особенно книги, в которых они не могут понять объяснения. Некоторые авторы объясняют выделения заумными словами, может потому что это выглядит круть, а нужно просто понимать, что начинающему пофиг, как оно выглядит и ему не должно звучать круть, ему нужно, чтобы было понятно.
С другой стороны, если начать изучение с C# и просидеть на нем хотя бы год, человек привыкнет не освобождать ресурсы и на C++ может даже не захотеть переходить. Я сейчас играюсь с Objective-C и во всех своих проектах включаю автоматический подсчет ссылок. После четырех лет безвылазного программирования на C# (до этого программировал на нем, но меньше, просто последние 4 практически только на нем и писал), мне лень заморачиваться с операторами release. Хватит того, что мне приходится делать две операции alloc и init.
Сейчас ВОВА в комментариях показал, что не все понимают, как работает SQL сервер. Это нормально, если вы не работали с оптимизацией достаточно долгое время, чтобы знать, как работает оптимизатор SQL Server. А в боьшинстве случаев он работает отлично и иногда даже откровенно тупой запрос может выполнить быстро. Было предложение перенести одно из сравнений в on. Просто для прикола, возьмите и напишите вот такой запрос:
select * from Table1 a inner join Table2 at on a.ID = at.ID
Замерьте план его выполнения и замерьте статистику (set statistics io on). Для замера статистики выполните запрос пару раз.
Еще когда появился Linq, я назвал эту технологию прикольной, но не рекомендовал к использованию. И я сам не использовал его вплоть до ноября прошлого года. В ноябре на работе дали небольшой проект, в котором мы не могли использовать внутренние наработки, потому что весь исходный код мы должны были передать клиенту и сайт хостится на стороне клиента.
Перед началом работы над сайтом я спросил парня, с которым мы делали сайт, что он хочет использовать и он предложил Entity Framework в связке с Linq, потому что он уже имел опыт работы с этими технологиями. Ну и фиг с ним, я учусь мега быстро, поэтому согласился. Ну что я могу сказать. . . , Microsoft уже придумало дофига различных технологий и фреймворков доступа к данным и поверьте мне, Entity Framework – не последний, потому что ничего особенного там нет, только неудобства.
Я с громадным шоком узнал, что операция .OrderBy(string) возможна далеко не всегда. У нас есть правило, что если мы строим какую-то таблицу данных на странице, то таблица должна сортироваться по любой колонке, которую захочет пользователь. Во внутренне корпоративном фреймворке это решается банально:
Писал запрос для банковской базы с классическими транзакциями кредита – дебита. Прибыл кредит, его можно потратить. Дебитовая транзакция связывается с кредитовой, чтобы было видно, какая кредитовая транзакция была потрачена. Запрос выглядит примерно так:
select credit.TxnID, credit.Expiry, debit.Transacted, debit.Amount from credit inner join creditdebit on . . . inner join debit on . . . where debit.Transacred > '2012.01.01' and debit.Transacted < ''2012.01.02
Меня просто невероятно бесят предупреждения во время компиляции. Я на работе задолбался уже подчищать предупреждения и просить не оставлять их в коде. Один парень регулярно объявляет неиспользуемые переменные и оставляет их, особенно в блоках try:
try { . . . . . . } catch (Exception e) { }
Сегодня написал метод, который выглядел примерно так:
public methodName(int id) { int i = id + 1; ... ... }