Are You Smart Enough To Debug Your Own Code?
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.
Приведенное выше предложение означает: отладка в два раза сложнее, чем написание кода. Поэтому, если вы пишете то, что считаете самым умным и изобретательным кодом, у вас не будет IQ для его отладки. По смыслу этого пассажа мы не должны писать «умный» код, иначе мы не сможем сами его поддерживать. Хороший код должен быть написан таким образом, чтобы его было легко понять и понять начинающим стажерам.
01 Определение цикломатической сложности
Как писать легкий для понимания код должен упомянуть важное понятие в методе измерения качества разработки программного обеспечения - цикломатическая сложность.
Цикломатическая сложность (сокращенно CC), также известная как условная сложность, является мерой сложности кода. Предложен Томасом Дж. Маккейбом-старшим в 1976 году для выражения сложности программы. Его можно использовать для измерения сложности структуры решений модуля, которая выражается как количество независимых текущих путей, а также может пониматься как количество тестовых случаев, покрывающих все возможные ситуации с наименьшим использованием.
Большая цикломатическая сложность указывает на то, что логика оценки программного кода сложна, качество может быть низким, и его трудно тестировать и поддерживать. Исследования показали сильную корреляцию между сложностью и количеством дефектов, указывая на то, что более сложный код с большей вероятностью даст сбой.
02 Расчет цикломатической сложности
Цикломатическая сложность измеряет количество линейно независимых путей в программе.
Например: если программа не содержит управляющих, оценочных и условных операторов, то сложность равна 1, потому что вся программа имеет только один путь выполнения;
Если программа содержит оператор IF, то будет два пути для выполнения всей программы, поэтому сложность в это время равна 2;
Два вложенных оператора ЕСЛИ или один оператор ЕСЛИ с двумя условиями имеют сложность 2 * 2 = 4.
См. рисунок ниже для более подробной информации:
как рассчитать цикломатическую сложность
Цикломатическую сложность можно рассчитать по графу потока управления программой по формуле: V(G) = e + 2 - n
e : количество ребер в графе потока управления
n : количество узлов в графе потока управления
Цикломатическая сложность соответствует количеству путей от начальной точки ко всем конечным точкам в графе потока управления программой, поэтому цикломатическая сложность также может быть получена путем подсчета путей.
03 Уменьшить сложность
Итак, вопрос в том, как мы можем уменьшить сложность кода? Если вы хотите писать удобочитаемый и тестируемый код, вы можете использовать функциональное программирование, которое может эффективно снизить сложность кода.
Мы видели, что цикломатическая сложность относится к количеству возможностей программы для выполнения ветвей. Функциональное программирование, с другой стороны, старается избегать всех операторов циклов, которые увеличивают ветвление выполнения кода. Функциональное программирование — это методология, которая определяет, как мы пишем программы.Основная идея состоит в том, чтобы писать операции как серию вложенных вызовов функций, насколько это возможно.
Относительно крайняя точка зрения состоит в том, что математика является основой физического мира, все проблемы являются математическими проблемами, и все в мире может быть представлено математическими функциями. Компьютерные операции также можно рассматривать как вычисления математических функций, поэтому наш код можно фактически свести к ряду математических выражений.
Функциональное программирование требует только «выражений» и без процедурных «утверждений». Разница между выражением и оператором является то, что выражение всегда имеет возвращаемое значение, в то время как оператор указывает, что некоторые действия были выполнены. Функции, которые используют только выражения, могут стать «чистыми функциями». Преимущество чистых функций заключается в том, что независимо от того, сколько раз выполняется функция, она не даст никаких побочных эффектов, потому что она не будет модифицировать промежуточное состояние.
Поскольку мы используем функциональное программирование, мы можем заменить различные операторы условного суждения выражениями, тем самым уменьшая взаимность кода, делая наш код легко читаемым и тестируемым. В языке программирования функций нет цикла For, потому что эта логика означает изменение состояния. Вместо этого эта логика цикла является рекурсивной в функциональном языке программирования, и функция реализуется функцией как параметром, то есть реализуется функция высокого порядка.
Хотя JavaScript не является функциональным языком на момент разработки, мы можем сделать наши программы более функциональными с помощью lodash, подчеркивания и других библиотек методов. Функциональное программирование — мой любимый метод программирования для эффективного уменьшения сложности кода. Однако конкретное содержание функционального программирования выходит за рамки этой статьи и не будет здесь подробно рассматриваться.
В дополнение к функциональному программированию мы можем использовать некоторые более традиционные способы уменьшения сложности кода. Общие методы:
Функция извлечения — отделите независимый бизнес-код или код модуля, инкапсулируйте и извлеките его в функции, а также интерпретируйте функцию кода через имя функции, чтобы улучшить читаемость кода. Когда функция слишком сложна, ее следует разделить на несколько подфункций, отвечающих за независимые функции.
Алгоритмы замещения. Сложные алгоритмы приводят к увеличению вероятности ошибок и понятности/ремонтопригодности.
合并条件式 - 把复杂的条件表达式,使用函数进行封装。 Например:
if(data.code === 200 && data.id && data.list.length > 2) {
db.insert(data);
}
Мы можем инкапсулировать условные выражения в виде функций:
if(isValidate(data)) {
db.insert(data);
}
С помощью вышеуказанных методов мы можем снизить сложность кода. Когда мы пишем код, мы помним, что наш код должен оставаться простым, оставаться глупым. Один из способов помочь вам запомнить этот принцип — «помнить при написании программ, что человек, который будет поддерживать программы, которые вы напишете в будущем, — психопат, который имеет серьезные наклонности к насилию и знает, где вы живете».
Обратите внимание на публичный аккаунт WeChat, чтобы увидеть больше оригинального контента.