Что делать, если пользователи жалуются на баги и тормоза, а ты хочешь написать быструю и безопасную программу, которая будет популярна долгие годы?
Плохой код почти невозможно читать, а еще в нем заводятся уязвимости и баги. Костыли помогают убедить компилятор, что всё в порядке, но в долгосрочной перспективе это ведет к краху. И опытный разработчик понимает, что дело не в банальном отсутствии комментариев или форматирования, а в неудачной архитектуре, от которой не спасется даже фундаментальное творение человеческой мысли.
В этой статье мы собрали несколько причин, почему вы пишете ужасные программы. Но перед прочтением советуем ознакомиться со статьей о концептуальных ошибках разработчиков.
Отсутствие пользовательских функций
Создавая функции (в некоторых языках — методы), вы обеспечиваете себе возможность несколько раз использовать один и тот же код — например, перебор значений массива, применение настроек, проверка данных перед отправкой на сервер и так далее.
Гораздо проще написать так:
//Узнаем, сколько процентов число a составляет от числа b
function getPercent(a,b) {
return (a / (b / 100));
}
var cost = [100,200]; //Стоимость товаров
var discount = 15; //Скидка в рублях
//Скидка в процентах
var discountPercent = [
getPercent(discount,cost[0]),
getPercent(discount,cost[1])
];
Чем так:
var cost = [100,200]; //Стоимость товаров
var discount = 15; //Скидка в рублях
//Скидка в процентах
var discountPercent = [
(discount / (cost[0] / 100)),
(discount / (cost[1] / 100))
];
Особенно если команд больше одной.
Хранение переменных
Для хранения переменных необходима оперативная память. И чем их больше, тем требовательнее программа, а мы же не хотим написать второй Chromium?
Вам также будет интересно:
• Языки программирования сейчас и в ближайшем будущем. Что и зачем учить?
• От Древнего Египта к расшифровке генома: что такое программирование на самом деле
• Оскорбление чувств пользователей: как быть политкорректным в IT
Чтобы освободить место, нужно удалять данные из памяти или записывать на их место что-то другое, иначе работа будет замедляться. А всё потому, что в оперативке уже несколько часов висит приветственная надпись, результат проходных вычислений, ширина элемента, который использовался один раз, и так далее.
Смешанный код
Это касается в основном веб-разработчиков, которые пишут весь код в одном файле:
<div id='result'>
<?
$a = $b / $c;
echo $a;
?>
</div>
<script type='text/javascript'>
var result = document.getElementById('result');
alert("Ваш ответ: " + result.innerHTML);
</script>
Тут перемешались HTML, PHP и JS. Сначала это выглядит безобидно, а потом растет как снежный ком, порождая уязвимости и баги.
Взамен лучше вынести всё в отдельные файлы, оставив в основном лишь незначительную часть вставок:
<?include('result.php');?>
<div id='result'>
<?echo $a;?>
</div>
<script type='text/javascript' src='result.js'></script>
В этом случае вывод модального окна и расчет значения переменной $a происходит в подключаемых файлах. Но не стоит забывать добавлять комментарии о том, какие связи вы построили.
Кривая архитектура
Представьте, что код — это шкаф, а разработка архитектуры — это способ расставить всё по полочкам. Об этом можно не думать, если внутри висит только старое пальто, но когда вы решите добавить еще одежды, то складывать ее в кучу — не лучший выбор.
Курс «C#-разработчик с нуля»
Практический 4-месячный курс для тех, кто хочет овладеть языком программирования с индивидуальным наставником и положить первое десктопное приложение к себе в портфолио.
Программа курса
Допустим, нам нужно, чтобы при нажатии на кнопку воспроизводился звук щелчка и на странице создавался новый объект. Мы можем сделать всё в одной функции:
function createObject() {
clickSound.play();
objectsContainer.innerHTML = objectsContainer.innerHTML + "<div class='obj'>Объект</div>";
}
button.onclick = createObject;
Или в нескольких:
function playClick() {
clickSound.play();
}
function createObject() {
objectsContainer.innerHTML = objectsContainer.innerHTML + "<div class='obj'>Объект</div>";
}
function clickButton() {
createObject();
playClick();
}
button.onclick = clickButton;
Второй способ кажется сложнее, но на самом деле он более эффективен в долгосрочной перспективе. Если вы вдруг захотите изменить какую-то отдельную часть, то не придется пересматривать все остальные.
Например, если у вас будет несколько функций, которые проигрывают один и тот же звук, то вам не придется переписывать все, когда вы захотите что-то добавить или убрать, — достаточно будет изменить одну функцию, которую вызывают все остальные.
Заключение
Эти советы кажутся незначительными, но чем сложнее программа, тем сильнее их влияние. Проблемы скапливаются, а их устранение затрудняется, если не следить за архитектурой, занимаемой памятью, функциями и другими составляющими кода.