вторник, 18 июня 2024 г.

[prog] Один из признаков того, что с вашим кодом не все в порядке

Очень простой маркер трансформации в говнокод: закомментированные куски без пояснения причин почему эти куски были закомментированы и до какого времени они должны в таком виде оставаться.

Т.е. если вы видите в кодовой базе что-то вроде:

data_manager::data_manager(
  data_set_id id,
  raw_data_storage_shptr raw_data_storage,
  access_manager_shptr access_manager,
  modification_mode mode,
  logger log)
  : base_type{ id,
      std::move(raw_data_storage),
//     std::move(access_manager)
//     mode
    }
{
//  _id = id;
//  _storage = std::move(raw_data_storage);
//  _access_manager = std::move(access_manager);
  setup_access_manager(std::move(access_manager));
  setup_mode(mode);
  setup_logger(std::move(log));
}

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

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

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

Еще неплохо бы пометить в тех же комментариях кому нужно будет принять решение (скорее всего это вы сами, так что впишите туда свой никнейм).

Например:

data_manager::data_manager(
  data_set_id id,
  raw_data_storage_shptr raw_data_storage,
  access_manager_shptr access_manager,
  modification_mode mode,
  logger log)
  : base_type{ id,
      std::move(raw_data_storage),
//FIXME(eao197): access_manager и mode должны были бы передаваться
//в base_type, но там временно пришлось убрать такой конструктор.
//Нужно вернуться к передаче access_manager и mode в конструктор
//базового класса после того, как base_type будет отрефакторен.
//     std::move(access_manager)
//     mode
    }
{
  //FIXME(eao197): установка access_manager и mode должна
  //быть со временем перенесена в конструктор base_type.
  setup_access_manager(std::move(access_manager));
  setup_mode(mode);

  setup_logger(std::move(log));
}

PS. Был в моей карьере один случай двухдневного сеанса отладки кода, который до сих пор вспоминается с содроганием. Выглядел этот код как откровенное Г и состоял на 50% вот таких вот закомментированных кусков без всяких пояснений. Причем ладно бы в начале файлов были раскомментированные, актуальные строки, а в конце -- закомментированные, уже не нужные. Так нет, все это было вперемешку. Бррр. Как вспомню, так вздрогну.

воскресенье, 16 июня 2024 г.

[prog.java] Листая старенький айпад или как же похорошела Java за последние 14 лет ;)

Довелось тут давеча вспомнить когда в последний раз программировал на Java. Почему-то думал, что было это в 2012-ом, а оказалось, что в 2010-ом. Интересно сейчас, спустя 14 лет, перечитывать собственные старые впечатления. Особенно вот эти соображения о том, чего лично мне тогда не хватало в Java. И тем забавнее обнаружить, что часть из описанного мной тогда, в современной Java уже есть: это и автоматический вывод типов переменных, и лямбда функции, и try-with-resources.

Как же похорошела Java за эти годы! ;)

Только вот желания программировать на Java как не было, так и нет :)))

PS. Да и с кроссплатформенностью у .NET и C# стало куда как лучше.