morthan2006: (Default)
 Я всегда придерживался мнения, что комментарии в программе важны и их должно быть побольше, потому как кашу маслом не испортишь. И ещё комментарии желательно писать на русском, поскольку их читать проще. А требование писать по-английски есть излишество и эстетство: ну кому за пределами СССР может потребоваться читать мой код?

Потом мне попался нужный код с комментариями на венгерском и я, пока разбирался в его хитросплетениях, начал сомневаться в правильности своей точки зрения.

Сейчас я смотрю на модуль, откомментированный китайскими разработчиками на китайском (благо, современные Delphi умеют в юникод) и с тоской вспоминаю такие милые и понятные венгерские комментарии.

Глобализация, понимаешь...
Music:: Royal Hunt - Clown In The Mirror
Mood:: пессимистическое
morthan2006: (Default)

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

Итак, есть у нас код на Delphi, который вызывает код на .NET. Чтобы этот вызов стал возможен, из .NET наружу торчит общедоступный интерфейс IDotNetWorker (на самом деле он называется по-другому, но для примера пусть будет так). В интерфейсе есть функция примерно такого плана:

  public int CoolFunction(string arg)
  {
    if (arg == "")
    {
      return 1;
    }

    return 0;
  }

Как показало тестирование, если в Delphi получить интерфейс и вызвать эту функцию с параметром, равным пустой строке, то она не вернёт 1, как можно было бы предположить. Вместо этого она упадёт со страшным грохотом и причину придётся искать довольно долго, особенно если происходит это в службе Windows (как в нашем случае).

Разгадка проста. Пустая строчка по какой-то неясной мне причине автоматически преобразуется в null. При попытке сравнить его с пустой строкой вылетает исключение.

Судя по всему, это не новость для тех, кто пишет на .NET. В C# имеется несколько вещей, потенциально пригодных для этого. Например, можно проверить, не является ли строчка пустой, либо null.

  if (string.IsNullOrEmpty(arg))
  {
    return 1;
  }

Или проверить, не является ли строчка null и, если является, задать ей значение по умолчанию.

  string myString = arg ?? "Значение по умолчанию";

Эта конструкция представляет собой аналог тернарного оператора, специально заточенный под проверку на null:

  string myString = (arg != null) ? arg : "Значение по умолчанию";

Вот такая интересная штука.

Mood:: подозрительное
Music:: Royal Hunt - Stranded
morthan2006: (Default)

Q: Is SQLite threadsafe?

A: Threads are evil. Avoid them.

SQLite is threadsafe. We make this concession since many users choose to ignore the advice given in the previous paragraph.

«Часто задаваемые вопросы по SQLite»

Жутко не люблю многопоточность. И полностью согласен с автором SQLite, чьё мнение по этому поводу приведено в эпиграфе. Потоки — зло.

Конечно, можно сказать, что я просто не умею их готовить. И я с этим даже соглашусь. Поскольку готовил их довольно часто, а в результате обычно получалась малосъедобная гадость, которая вроде и работает, но иногда как учудит что-нибудь этакое!

Повторюсь, потоки — зло. Но иногда — зло необходимое.

Читать далее )
Mood:: напряжённое
Music:: Кирилл Комаров - Крутотут

September

SunMonTueWedThuFriSat
          1
 
2
 
3
 
4
 
5
 
6
 
7
 
8
 
9
 
10
 
11
 
12
 
13
 
14
 
15
 
16
 
17
 
18
 
19
 
20
 
21 22
 
23
 
24
 
25
 
26
 
27
 
28
 
29
 
30