Намедни в LinkedIn поиронизировал на счет "самодокументирующегося кода". В очередной раз 😎
В очередной раз с удивлением для себя обнаружил людей, скептически относящихся к необходимости комментировать код.
Подумал, что лучше одна иллюстрация лучше тысячи слов. Поэтому вот пример кода из реального проекта. Изменены только названия сущностей, все комментарии оставлены как есть. Плюс изъяты фрагменты, не относящиеся к самой иллюстрации.
Каждый сам может для себя решить, с каким кодом ему проще было бы разбираться. Сам-то я для себя уже давно выводы сделал. Поэтому и пишу комментарии, хотя тут мне еще есть куда расти, к сожалению. Не всегда получается сделать хорошо с первого раза 🙁
Под катом оригинальный фрагмент с комментариями. Такими, какими они и были написаны при разработке. Но сперва этот же фрагмент, но вообще без комментариев. Именно так "самодокументирующися" код и выглядит, по моему (не)скромному опыту.
|
class DefaultThreadPoolScheduler final : public Scheduler { ... private: struct WorkerData { std::mutex _lock; std::condition_variable _wakeupCondition; Scheduler::TaskUniquePtr _taskToRun; bool _shutdownInitiated{ false }; }; using WorkerDataContainer = std::vector<std::reference_wrapper<WorkerData>>; std::latch _allWorkersStartedLatch; std::mutex _lock; TasksContainer _tasksQueue; ThreadPool _threadPool; WorkerDataContainer _availableWorkers; bool _shutdown{ false }; }; void DefaultThreadPoolScheduler::doWork() noexcept { WorkerData thisWorkerData; { std::lock_guard schedulerLock{ _lock }; _availableWorkers.push_back(std::ref(thisWorkerData)); _allWorkersStartedLatch.count_down(); } bool shutdownIntitiated{ false }; while( !shutdownIntitiated ) { std::unique_lock workerLock{ thisWorkerData._lock }; if( TaskUniquePtr taskToRun = std::move(thisWorkerData._taskToRun); !taskToRun ) { shutdownIntitiated = thisWorkerData._shutdownInitiated; if( !shutdownIntitiated ) { thisWorkerData._wakeupCondition.wait(workerLock); shutdownIntitiated = thisWorkerData._shutdownInitiated; } } else { workerLock.unlock(); taskToRun->run(Scheduler::RunCondition::Normal); completeTaskThenTryGetNext(std::move(taskToRun), thisWorkerData); } } } |