Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 51 52 53 54 55 56 57 58 [59] 60   вперед  Ctrl
 Re: Топик "как я лажанулся"  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 56168
нашел у себя в логах
"вставлено строк=1, из них с ошибками 8"

пришлось править :)
27 апр 21, 09:32    [22314897]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65951
Блог
После тривиального косметического изменения внезапно сломался стопроцентно работающий код.

Расследование показало, что я удалил переменную Input, но не удалил SizeOf(Input).
27 апр 21, 12:33    [22315008]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62816
А кто придумал так назвать переменную?

P.S. Нет привычки просматривать зависимости,
всегда полагаешься на компилятор?

Posted via ActualForum NNTP Server 1.5

27 апр 21, 14:35    [22315104]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65951
Блог
Гаджимурадов Рустам
А кто придумал так назвать переменную?

Тот, кто лажанулся. Ну так название вполне соответствовало ситуации на момент написания кода.

Гаджимурадов Рустам
P.S. Нет привычки просматривать зависимости

Локальная переменная, которая используется в одной функции. Зависимости далеко не уходят :)
27 апр 21, 18:20    [22315262]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 755
Есть софт, где крутятся задачи, привязанные к определенным локальным путям. Чтобы они не накладывались, есть механизм захвата, освобождения пути и проверки занятости. На днях заметил, что выполняется только малая доля задач от обычного числа. Расследование показало: они просто пропускаются, в итоге пришел к коду захвата-освобождения. Оказалось, что захват выполняется с путем со слешем на конце, а особождение - нет, то есть пути просто копятся. Самое загадочное - этот код непонятным образом работал годами, и вот только что проявил себя.
28 апр 21, 10:12    [22315458]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12901
Fr0sT-Brutal,

Поэтому у меня все идентификаторы, которые имеют отношение к путям имеют суффикс Path если в переменной есть завершающий бекслеш, или суффикс Dir если его там нет.
28 апр 21, 12:50    [22315572]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65951
Блог
Fr0sT-Brutal
Самое загадочное - этот код непонятным образом работал годами, и вот только что проявил себя.

Скорее всего, кто-то недавно удалил какую-нибудь мелкую и ненужную строчку :)

_Vasilisk_
Поэтому у меня все идентификаторы, которые имеют отношение к путям имеют суффикс Path если в переменной есть завершающий бекслеш, или суффикс Dir если его там нет.

Любопытно смотреть на подходы с психологической точки зрения. Я в таких ситуациях принудительно обеспечиваю приведение к единообразному виду (то есть в случае автора у меня было бы написано что-нибудь типа

procedure TPathLocker.Enter(const APath: string);
begin
  InternalLock(ExcludeTrailingPathDelimiter(APath.ToLower.Trim));
end;


при этом подход с различием по именам я использую в функциях, возвращающих объекты. Функция FindSomething возвращает nil-ы, а функция GetSomething, если объекта нет, выкидывает исключение.
28 апр 21, 13:02    [22315580]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12901
softwarer
Я в таких ситуациях принудительно обеспечиваю приведение к единообразному виду
Это смотря как далеко нужно передавать переменную. Если другому классу, то да, дополнительная защита не помешает. А если это приватное поле класса, то зачем? если я точно знаю что там должно быть
softwarer
procedure TPathLocker.Enter(const APath: string);
А если там не TPathLocker, а TStringLocker?
28 апр 21, 13:18    [22315601]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65951
Блог
_Vasilisk_
Это смотря как далеко нужно передавать переменную. Если другому классу, то да, дополнительная защита не помешает. А если это приватное поле класса, то зачем? если я точно знаю что там должно быть

Для устойчивости. С одной стороны позаботиться об этом просто, а с другой - мне не нужно помнить "что там должно быть", и я знаю, что если другой разработчик обратится сбоку со своими данными, то ничего не сломается.

_Vasilisk_
А если там не TPathLocker, а TStringLocker?

Если то будет примерно так:

protected
  Locker: {зачёркнуто TStringLocker} TPathLocker;
...

type
  TStringLocker = class
  protected
    function Unify(const S: string): string; virtual;
  public
    procedure Enter(const S: string);
    procedure Leave(const S: string);
  end;

function TStringLocker.Unify;
begin
  Result := S.ToLower.Trim;
end;

type
  TPathLocker = class(TStringLocker)
  protected
    function Unify(const S: string): string; override;
  end;

function TPathLocker.Unify;
begin
  Result := ExcludeTrailingPathDelimiter(inherited Unify);
end;


Сообщение было отредактировано: 28 апр 21, 13:21
28 апр 21, 13:29    [22315610]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 755
_Vasilisk_
Поэтому у меня все идентификаторы, которые имеют отношение к путям имеют суффикс Path если в переменной есть завершающий бекслеш, или суффикс Dir если его там нет.

Не уверен в своем отношении к данному подходу. Легче уж всегда добавлять слеши - как правило, большинство функций с этим справляются.
softwarer
Я в таких ситуациях принудительно обеспечиваю приведение к единообразному виду

Да, тоже думал об этом.
28 апр 21, 14:27    [22315662]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62816
softwarer
Тот, кто лажанулся. Ну так название вполне соответствовало ситуации на момент написания кода.
В смысле тоже ты? :) Не знаю, ИМХО это одно из ужасных названий, которых следует избегать

softwarer
Локальная переменная, которая используется в одной функции. Зависимости далеко не уходят :)
Ну это в теории. До тех пор пока не столкнёшься первый раз c глобальной переменной i или s. :)
28 апр 21, 14:57    [22315677]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65951
Блог
Гаджимурадов Рустам
Не знаю, ИМХО это одно из ужасных названий, которых следует избегать

Хм. А список таких ужасных названий или критерии попадания в них? Как-то непонятно, чем оно плохо (ну кроме случившейся лажи, само собой )

softwarer
До тех пор пока не столкнёшься первый раз c глобальной переменной i или s. :)

С глобальной переменной i я столкнулся в 88-м году, и когда, наконец, справился с этой ошибкой - очень хорошо её запомнил :)

Но как-то непонятно, что ты в связи с этим предлагаешь - не использовать локальных переменных i?
28 апр 21, 17:41    [22315806]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12901
softwarer
Но как-то непонятно, что ты в связи с этим предлагаешь
Я предложу
1. Все поля класса начинаются с префикса F (и имеют видимость strict private)
2. Все глобальные переменные начинаются с префикса G
3. Все локальные переменные начинаются с префикса L

И никаких лаж
28 апр 21, 17:51    [22315813]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62816
softwarer> А список таких ужасных названий или критерии попадания в них?

Критерий простой - совпадение со стандартными ключевыми словами или
"системными" переменными, константами и пр. (из базовых модулей - System, Classes и пр.).

И плохо оно не только подобной лажей, но вообще моветон, ИМХО.
Переменных Input и Output я особо не припомню, а вот CmdLine и Max_Path - видел.

> не использовать локальных переменных i?

Если за каким-то лядом есть глобальная переменная i - да,
разумеется, не использовать. Есть куча других букв в алфавите.

Posted via ActualForum NNTP Server 1.5

28 апр 21, 18:03    [22315817]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62816
_Vasilisk_> 3. Все локальные переменные начинаются с префикса L

Это слишком строго, особенно если работаешь не один.
Но да - префиксы для локальных переменных (и параметров) -
один из основных видов асептики, если не получается иначе.

Posted via ActualForum NNTP Server 1.5

28 апр 21, 18:05    [22315818]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65951
Блог
_Vasilisk_
Я предложу

Знаю такое решение. По мне - слишком дорогое. В том плане, что раз в несколько лет потратить пять минут на разгребание странной ситуации - выгоднее, чем каждый день ломать глаза о хуже читаемый код. Хотя это, конечно, вопрос вкусов.
28 апр 21, 18:10    [22315822]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65951
Блог
Гаджимурадов Рустам
Критерий простой - совпадение со стандартными ключевыми словами или "системными" переменными, константами и пр.

Знаешь, в этом конкретном случае я просто успел забыть, что Input - занятое слово. Как-то слишком много десятков лет не приходилось его употреблять. Ну то есть когда я сделал Ctrl-F7 SizeOf(Input) и увидел результат 738 - я хлопнул себя по лбу и сказал "Иван Иваныч!", но когда писал переменную - это просто уже не всплыло. А в общем случае... так, как ты говоришь, всё равно не получится. По той простой причине, что "системные" переменные и константы добавляются в каждой новой версии.
28 апр 21, 18:13    [22315828]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12901
softwarer
ломать глаза о хуже читаемый код
Ничуть не хуже
28 апр 21, 18:40    [22315861]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62816
softwarer> в этом конкретном случае я просто успел забыть ...
softwarer> ... переменные и константы добавляются в каждой новой версии.

Да, но во всех остальных случаях - всё равно лучше соблюдать гигиену.

Posted via ActualForum NNTP Server 1.5

28 апр 21, 21:06    [22315962]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2498
У нас в системе есть компонент, которые называется COM. Хорошее, короткое название, производное от Commmon. Размещается в папке COM. В какой-то момент заметили, что инсталлятор перестал обновлять систему. Оказалось, что при обновлении сначала создается временная папка с именем ИмяКомпонента1. Ну что может пойти не так?...
29 апр 21, 10:08    [22316151]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
Maxim Rusov
Member

Откуда: Москва-Питер
Сообщений: 2498
_Vasilisk_
softwarer
ломать глаза о хуже читаемый код
Ничуть не хуже

Наоборот, гораздо лучше читаемый. У меня все локальные переменные имеют префикс 'v', видишь где-нибудь в процедуре:
  vItem := aItem;
  aItem := fItem;

И сразу все понятно, даже глаза поднимать не нужно...
29 апр 21, 10:20    [22316155]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 56168
помню

беру проект, доставшийся в наследство
пишу новую процедуру, после какой-то там проверки пишу exit
а нифига не компилирует. Говорит, ошибка
оказалось, в проекте была кнопка с именем exit
29 апр 21, 11:49    [22316218]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2125
andreymx
помню

беру проект, доставшийся в наследство
пишу новую процедуру, после какой-то там проверки пишу exit
а нифига не компилирует. Говорит, ошибка
оказалось, в проекте была кнопка с именем exit

У меня в проекте (c++) несколько чужих библиотек, в которых определен тип byte. Где-то он определен как unsigned char, где-то - как char, кто-то - мило определил как std::byte.
Спасают префиксы-неймспейсы, но в одной библиотеке свой неймспейс не определен... хорошо, такая библиотека пока одна.
29 апр 21, 13:32    [22316319]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
alekcvp
Member

Откуда:
Сообщений: 2878
ъъъъъ
У меня в проекте (c++) несколько чужих библиотек, в которых определен тип byte. Где-то он определен как unsigned char, где-то - как char, кто-то - мило определил как std::byte.

Это уже из разряда
#define true false; // удачной отладки, уроды.
Зачем так делать?..

Сообщение было отредактировано: 29 апр 21, 15:04
29 апр 21, 15:12    [22316413]     Ответить | Цитировать Сообщить модератору
 Re: Топик "как я лажанулся"  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 65951
Блог
alekcvp
Это уже из разряда
#define true false; // удачной отладки, уроды.
Зачем так делать?..

Этот вопрос стоило бы задать КР-у. В те времена, когда они специфицировали язык, стремясь к минимальности, им не удалось предусмотреть развитие вычислительной техники и понять, что в хороший стиль программирования войдут подобные излишества. Собственно, им даже определить однобайтовый char не казалось неудачным решением.
29 апр 21, 15:34    [22316432]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 51 52 53 54 55 56 57 58 [59] 60   вперед  Ctrl
Все форумы / Delphi Ответить