Monday, January 31, 2011

Цитата

40 музыкантов симфонического оркестра играют симфонию за 30 минут.
За какое время ту же симфонию сыграют 80 музыкантов?

Saturday, January 22, 2011

Еще раз про пользу правильного именования

В старой ветке RDSN форума обсуждалось как-то написание пословиц на C++. Вот так например:
if (flag == true)
  if (flag == true)
    if (flag == true)
      if (flag == true)
        if (flag == true)
          if (flag == true)
            if (flag == true)
              Cut();
Скороговорка:
greka.drive(river,moveType::Over);
if(greka.lookUpFirstItem(river) isinstanceof Cancer)
{
  river.insert(greka.hand);
  crayfish.grab(greka.hand);
}

И еще про рыбу:

bool IsFish(const Animal &animal)
{
    ...
    if(FishContainer.IsEmpty && IsCrawfish(animal))
        return true;
    ...
}
А вот довольно спорная по сути, но зато оформленная двумя классами:
class CBaba : public CHomoSapiens
{
public:
     bool   KonyaNaSkakuOstanovit();
     bool   VGoryazhuyIzbuVoidet();
}
class CKobila : public CAnimal
{
private:
     int    m_trudno;
public:
     bool   BabaSVozu( const CBaba&)
     {  
         m_trudno--; // Kobile legche
     }
}
Шутки-шутками, а если серьезно – подумайте, ведь правильное именование переменных и методов позволяет именно читать код, понимать его суть, т.е. бизнес-смысл! И в реальном коде должно быть тоже самое.

Про олимпиадные задачи

Нашел на форуме сообщение, что типа я говорил, что олимпиадные задачи это плохо. Не говорил я такого… Придется написать что я про это думаю, а то ж беда с помехами на каналах связи… Говоришь одно, понимают другое, а потом пишут вообще ерунду…
Олимпиадные задачи – это круто! Вот. Это сложно, это интересно. Научиться их решать  требует большой, каждодневной, постоянной работы. Но – это ДРУГОЙ навык, чем промышленное программирование. Не хуже, не лучше. Просто другой.
Для примера – есть обычный водитель, есть водитель такси, а есть Формула-1. Что у них общего? Общего у них машина, 4 колеса, руль и т.д. и водитель. Но у них разные цели, разные навыки. И одного водителя нельзя заменить другим. Попробуйте водителя формулы (для полноты картины назовем его так) посадить таксистом… Результат будет печальный. Как собственно и наоборот – таксист просто не проедет трассу. И цели у них разные. Таксисту зарабатывает на довольно монотонной работе – взял пассажира, отвез, ждем, взял, отвез… Конечно тут не все так просто – и дороги разные (то пробка, то труба где-то рванет, воды полно, то снегу по колено, а дороги не чищены…) и пассажиры разные… Но такая у него работа. А формула-1 - тут все по-другому. Тут водитель учится долго-долго, оттачивает мастерство и тот единственный заезд довольно редко, но зато как он едет и на какой скорости! И вся подготовка только ради этого одного, редкого “броска”. Это его заработок. Правда тут есть еще одна “засада” – реально зарабатывающих таких единицы. Остальные идут в таксисты J
Собственно я к чему  - олимпиадные задачи это здорово. Думаю что и заработать этим навыком можно – например, задачи оптимизации иногда возникают, обходы деревьев и т.д. Но это другой навык, чем писать коммерческий код и зарабатывать на жизнь таким способом. И тем кто привык и наработал навык мгновенного броска очень сложно потом монотонно “ездить”. Нужны конечно же и те и другие, но супер-задач обычно очень мало, а монотонной работы – очень много.

Friday, January 21, 2011

MVC и дизайн

Использование чистого MVC кажется очень не удобным в реальных проектах. Если у меня есть дизайнер/верстальщик, который делает прототип (включая jQuery и т.д.), то потом перепахать это вот в такой код:

<%
.RowAttributes(row =>
.Columns(column =>
{
column.AutonamedFor(m => m.Year).Visible(filter.Year ==
.Attributes(width =>
column.For(m => m.WeekNumber).Named(
.Attributes(style =>
column.AutonamedFor(m => m.Project)
.Attributes(width =>
column.AutonamedFor(m => m.Manager).Visible(Page.User.IsAdministrator())
.Attributes(@class =>
column.AutonamedFor(m => m.GeneralState);
column.AutonamedFor(m => m.ResourcePlans).HeaderAttributes(@class =>
.Attributes(cell =>
column.AutonamedFor(m => m.QuestionsToIT).HeaderAttributes(@class =>
.Attributes(cell =>
column.AutonamedFor(m => m.Risks).HeaderAttributes(@class =>
.Attributes(cell =>
}).RenderGrid(header)
%>
= Html.Grid(Model, header)new Hash(style => "height : 50px; background-color:" + row.Item.ProjectColor))null)"4%", style => "text-align: center").HeaderAttributes(width => "4%");"Week").Visible(filter.WeekNumber == null)"width: 5%; text-align: center").HeaderAttributes(width => "5%");"9%").HeaderAttributes(width => "9%");"width15").HeaderAttributes(@class => "width15");"width15")new Hash(@class => "width15"));"width15")new Hash(@class => "width15"));"width15")new Hash(@class => "width15"));
Весьма затруднительно. И наоборот - попробуйте дизайнера или верстальщика попросить пофиксить тут стили... В результитующем HTML он конечно пофиксит. А вот кто будет это обратно перетаскивать в код... В общем не нравится. Хочется чтобы код разметки был максимально близок коду HTML-прототипа. Может razor спасет...

Update: может это не MVC грид...

Monday, January 17, 2011

Цитата

Ходить по воде и разрабатывать программы согласно ТЗ очень просто при одном условии: если они заморожены.

Friday, January 14, 2011

Чтение файла с русскими словами

Если файл в windows кодировке с русскими буквами, то при его чтении ее (кодировку) и нужно указывать:

StreamReader input = new StreamReader(itextFile, Encoding.GetEncoding(1251));

Split по списку разделителей

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


string[] parts = str.Split(separators);char[] separators = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ', '`', '~', '!', '@', '"', '#', '№', '$', ';', '%', '^', ':', '&', '?', '*', '(', ')', '-', '_', '+', '=', '|', '[', '{', ']', '}', ';', ':', '"', ',', '<', '.', '>', '?', '/', };


Если уж перечислять разделители, то просто строкой:

string[] parts = str.Split(separators.ToCharArray());string separators = " `~!@$%^&*()_+-";


Хотя конечно регулярные выражения в таких случаях могут лучше помочь.