Добрый день. Некоторое время назад вышла статья с тестовым заданием на должность C# разработчика, которое было решено быстро и были допущены некоторые ошибки в коде, относительно нэйминга и оптимизации. В этой статье я проведу рефакторинг этого кода. Ознакомится со статьёй можно тут, а исходный код можно найти на GitHub.
Во-первых.
Самое первое, что я не учёл при выполнении задания - это проверка значения N (1 ≤ N ≤ 1000). Сделаем это в классе Wood.
Создадим две константы: MinCountNodes(=1) и MaxCountNodes(=1000).
Создадим приватный метод DataIsValidity, цель которого проверка условия (1 ≤ N ≤ 1000).
В данном проекте используется C# 9.0, поэтому данные проект будет корректно работать только ,если TargetPlatform выставлен в net5.0 или net6.0. (На самом деле такая конструкция у меня работала и в netcore3.1 и net framework, просто нужно при создании использовать Microsoft.NET.Sdk, подробнее об этом можно прочитать тут.)
И добавим эту проверку в начало блока try метода CreateWood.
Во-вторых.
В класс Program в методе Main находятся "захардкоженные" переменные (подчеркнуты красным). Меня часто ругали за это, поэтому либо это должно быть константными значениями, либо нужно их получать из какого-либо источника. Я выберу вариант с константой, потому что в задании ничего не сказано о предоставлении выбора файла.
В-третьих.
Логика каждого используемого метода включена в блок try - catch. Каждая ошибка возникающая ошибка выводится на экран консоли через вызываемое событие в классе Logger. Значит в методе Main от этого блока можно избавится.
В-четвертых.
Матрицу соединений можно создать сразу после проверки на валидность. И объявить параллельную задачу можно также после создания матрицы.
Также, где возможно, будет избавление от списков, так как чаще всего нам известен размер коллекции данных, а также от лишних присваиваний.
Итог.
По итогу всего рефакторинга код стал более читаемым. Удалены лишние фрагменты кода, введены новые константы для повышения понимания работы кода.
Ознакомится с кодом можно всё там же на GitHub, только нужно переключится в ветку refactoring.
Полезно возвращаться в свой код и редактировать его с целью оптимизации. Это позволяет в будущем писать сразу более правильный, понятный код для других разработчиков.