В поисках хорошего кода
В январе 2019 года я поставил себе задачу добавить поддержку спутников из gr-satellites в свой проект r2cloud. На тот момент их было около 70. Это достаточно большое количество, добавление которых, по моим оценкам, может занять до конца года. Однако, как показал опыт, я справился где-то за месяц. Некоторые спутники уже сгорели в атмосфере, поэтому их нет смысла добавлять. Некоторые спутники не предоставляют формат своей телеметрии, поэтому полученные биты данных, так и остаются битами данных. Их я тоже не стал добавлять, так как лучше уж сделать поддержку спутников с открытым форматом данных. В итоге я добавил поддержку 23 спутников.
Здесь важно отметить, что разные спутники передают разную информацию. Некоторые передают небольшое количество данных, некоторые десятки и сотни полей.
Сделав задачу, я обнаружил, что названия полей зачастую не согласуются с правилами java. Большинство полей я просто взял из оригинальных спецификаций, которые ничего не знают про Java. Из-за этого sonarcloud начал показывать более 6000 code smells (sic!).
Я никогда не встречал проекты с таким большим количеством плохо пахнущего кода. По оценкам sonarcloud, на исправление этого мне бы потребовалось около 40 дней. Сам по себе такой код не является ошибочным. Просто его неудобно читать, поддерживать и он плохо согласуется с остальным кодом на Java. С другой стороны, 40 дней подряд сидеть и делать код ещё чуть-чуть более лучшим, мне тоже не хотелось. Всё-таки это хобби-проект, а не каторга. Поэтому, чтобы хоть как-то исправить ситуацию, я решил каждый день делать золотой commit. Золотой commit - это исправление плохо пахнущего кода в отдельно взятом файле.
С февраля по ноябрь я исправил почти все 6000. При этом моя гит история стала выглядеть следующим образом:
В итоге сейчас в проекте около 150 случаев дурно пахнущего кода. Большинство из них - это дублирование кода. В настройках по умолчанию sonarcloud создаёт новую проблему, если есть дублирующий код. Я не большой сторонник полностью переиспользуемого кода. В каких то случаях - это хорошо. Например, при описании бизнес-логики. В других случаях - это может сильно мешать читаемости и делает код сильно связанным. Например, при описании структур данных.
Ещё одна достаточно частая проблема, на которую sonarcloud ругается - это сложность кода. К сожалению, да. Мой проект действительно сложный, тут сложно что-либо поделать.
Выводы
Какие можно сделать выводы из всего этого? Терпенье и труд всё перетрут.