Я не был в сети около 6 месяцев, и у меня есть доступ к 2G только последние две недели или около того. В 2G мало что можно сделать, кроме просмотра социальных сетей, проверки электронной почты и, возможно, ведения блога (если этот пост будет загружен).

Я прочитал (и перечитал) много всего за 6 месяцев, фанфики по Гарри Поттеру, художественную литературу и несколько книг по программированию. Читая Природу кода Дэниела Шиффмана, я наткнулся на отличный пример для начинающих, демонстрирующий, как хорошая логика программирования может улучшить код. Он пытался продемонстрировать, что означает простое перемещение чего-либо по экрану, а также (возможно, случайно) продемонстрировал эффективное программирование.

С тех пор, как я прочитал этот пример, я планировал поделиться им со своими друзьями, и, поскольку я ничего не могу сделать, вы, читатель, тоже мой друг.

Я бы порекомендовал всем новичкам прочитать его книгу и посмотреть его уроки на ютубе. (Я буду ссылаться на многие из его ресурсов в конце).

Что такое хороший/чистый код?

Мне нравится, когда мой код элегантен и эффективен. Логика должна быть простой и затруднять сокрытие ошибок, минимальные зависимости для облегчения обслуживания, полная обработка ошибок в соответствии с четко сформулированной стратегией и производительность, близкая к оптимальной, чтобы не соблазнять людей запутывать код беспринципными оптимизациями. Чистый код хорошо справляется с одной задачей.

Бьерн Страуструп, изобретатель C++

Для начала мы сначала создадим Random Walker, объект, который перемещается на шаг в случайном направлении через каждый интервал времени.

Он будет иметь две части данных, координаты X и Y, функцию-конструктор и функцию step() для выполнения следующего шага. (Вам также понадобится функция для его отображения, но я не буду этого писать)

Я не буду писать весь код, только часть, которую мне нужно продемонстрировать.

class Walker {
    int x;
    int y;
    Walker() {
        // Constructor function to initailize data
        // width & height have the width & height of the output.
        x = width/2;
        y = height/2;
    }
}

Я начну с Ходока, который может двигаться только в 4-х направлениях (вверх, вниз, влево, вправо). Чтобы сделать случайный выбор из упомянутых 4 вариантов, я буду использовать функцию random(n), которая возвращает случайное число с плавающей запятой между 0 и 4 (от 0 до 3,9999999….), и использовать функцию int(n) для удаления десятичной части, что дает нам числа 0 до 3. Затем с помощью простого if-else я выберу направление.

void step(){
    int choice = int(random(4));
    if(choice == 0){
        x++; // Move right
    }
    else if(choice == 1){
        x--; // Move left
    }
    else if(choice == 2){
        y++; // Move up
    }
    else {
        y--; // Move down
    }
}

Это, вероятно, самый распространенный способ сделать это, самое большее, что вы можете сделать, это удалить фигурные скобки из дерева if-else, чтобы сократить код.

Теперь давайте расширим логику до 9 возможных вариантов, 8 направлений (вверх, вверх-влево, влево, вниз-влево, вниз, вниз-вправо, вправо, вверх-вправо) и никуда не уйдем/останемся на одном месте.

Если у вас нет большого опыта программирования, вы, вероятно, расширили бы код, который мы только что написали, чтобы он соответствовал девяти вариантам.

void step(){
    int choice = int(random(9));
    if(choice == 0){
        x++; // Move right
    }
    else if(choice == 1){
        x--; // Move left
    }
    else if(choice == 2){
        y++; // Move up
    }
    else if(choice == 3){
        y--; // Move down
    }
    else if(choice == 4){
        // Move up-right
        x++;
        y++;
    }
    else if(choice == 5){
        // Move up-left
        x--;
        y++;
    }
    else if(choice == 6){
        // Move down-left
        x--;
        y--;
    }
    else if(choice == 7){
        // Move down-right
        x++;
        y--;
    }
    // We don’t need to write code for staying
}

Как видите, это сделает код намного длиннее.

Один из способов сократить его с 8 блоков if-else до 4 блоков — разделить 9 возможностей на две группы по 3 возможности. Ходок имеет 3 варианта по оси X (влево, вправо или остаться) и 3 варианта по оси Y (вверх, вниз или остаться). При использовании двух отдельных случайных функций код будет выглядеть так:

void step(){
    int xchoice = int(random(3));
    int ychoice = int(random(3));
    if(xchoice == 0){
        x++; // Move right
    }
    else if(xchoice == 1){
        x--; // Move left
    }
    if(ychoice == 0){
        y++; // Move up
    }
    else if(ychoice == 1){
        y--; // Move down
    }
}

Последний способ, который я покажу, является самым коротким, требующим 0 блоков if-else, и этот метод будет использоваться большинством людей. Если вы хорошо замечаете вещи и шаблоны (которые вы развиваете, практикуясь и написав код), вы увидите, что и X, и Y прибавляются к 1, вычитаются из 1 или остаются неизменными при вызове step(). Другими словами, во время шага () X и Y добавляются 1, 0 или -1. Мы можем использовать эту логику, чтобы упростить код до двух строк.

void step(){
    x += int(random(3)) - 1; // int(random(3)) — 1; returns -1, 0 or 1        
    y += int(random(3)) - 1;
}

Как видно из этого примера, есть способы упростить код, если можно распознавать шаблоны. Я уверен, что опытные программисты знают много других подобных примеров (которыми они могли бы поделиться в комментариях, а позже я отредактирую их в посте). Тем, кто только начал учиться программировать, я рекомендую читать книги (особенно «Природа кода») и смотреть, как другие люди кодируют или просматривают их код, чтобы изучить другую подобную логику.

Ресурсы Дэниела Шиффмана:

Веб-сайт
Twitter
Youtube
Github
Веб-сайт Nature of Code

Прочитать это в моем блоге
Прочитать это на dev.to