Преобразуйте псевдокод в нормальный код и отладьте его




Пройдите по задаче вручную как минимум с тремя наборами данных


Возьмите лист бумаги и пройдите по задаче вручную. Выберите не менее трёх наборов данных для проверки. Выберите предельно допустимые и крайние случаи.


Предельно допустимые случаи: проблема или ситуация, возникающая за пределами нормальных параметров функционирования. Например, когда одновременно несколько переменных или состояний среды имеют экстремальные значения, даже если каждый из параметров находится в своём специфическом диапазоне.

Крайние случаи: проблемы или ситуации, возникающие только при экстремальных (минимальных или максимальных) значениях параметров функционирования.


Вот, к примеру, несколько наборов данных для использования:

[1]
[1, 2]
[1, 2, 3, 4, 5, 6]
[-200.25]
[-800.1, 2000, 3.1, -1000.25, 42, 600]

Когда только начинаешь, то зачастую пренебрегаешь какими-то шагами. Поскольку наш мозг уже знаком с чётными числами, то можно просто посмотреть на набор чисел и сразу передать в массив 2, 4, 6 и так далее, не думая о том, как наш мозг выбирает конкретные числа. Если вы замечаете это за собой, то лучше взять большой набор данных, чтобы помешать мозгу решать задачу, просто глядя на числа. Это поможет придерживаться настоящего алгоритма.

 

3. Упрощайте и оптимизируйте свой алгоритм


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


1. Создадим функцию selectEvenNumbers.

2. Создадим новый пустой массив evenNumbers для хранения чётных чисел.

3. Проходим по каждому элементу массива [1, 2].

4. Находим первый элемент.

5. Делим его на 2 и определяем, чётный ли он. Если да, то прибавляем к evenNumbers.

6. Находим следующий элемент.

7. Повторяем шаг №4.

8. Повторяем шаги №5 и №4, пока не кончатся элементы в массиве.

9. Возвращаем массив evenNumbers вне зависимости от того, есть ли в нём что-то.


Этот подход напоминает математическую индукцию:


1. Доказываем истинность для n = 1, n = 2,...

2. Предполагаем, что будет истинно для n = k.

3. Доказываем истинность для n = k + 1.

 

 

Пишите псевдокод


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

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

Применительно к нашему случаю есть много разных вариантов. Например, можно использовать filter, но ради простоты примера воспользуемся простым циклом for (однако при последующем рефакторинге мы ещё столкнёмся с filter).

Вот пример псевдокода, в основном состоящего из слов:

function selectEvenNumbers

создаём массив evenNumbers и делаем его эквивалентным пустому массивудля каждого элемента в этом массиве смотрим, является ли элемент чётным если чётный (при делении на 2 результат получается нецелым) добавляем его к массиву evenNumbersreturn evenNumbers


А вот псевдокод, в котором слов гораздо меньше:

function selectEvenNumbers

evenNumbers = []for i = 0 to i = length of evenNumbers if (element % 2 === 0) добавляем его к массиву evenNumbersreturn evenNumbers


Главное, писать код построчно и понимать логику каждой строки.

Вернитесь к задаче, чтобы удостовериться, что вы на правильном пути.

 

Преобразуйте псевдокод в нормальный код и отладьте его


Когда ваш псевдокод будет готов, преобразуйте каждую строку в реальный код на вашем языке. Здесь мы воспользуемся JavaScript.

Если вы писали на бумаге, то перенесите всё в редактор в виде комментариев, а затем замените каждую строку.

Теперь вызовите функцию и дайте ей некоторые из ранее использованных наборов данных. Так можно проверить, возвращает ли код нужный результат. Также можете написать тесты для проверки соответствия выходных данных ожидаемому результату.


selectEvenNumbers([1])selectEvenNumbers([1, 2])selectEvenNumbers([1, 2, 3, 4, 5, 6])selectEvenNumbers([-200.25])selectEvenNumbers([-800.1, 2000, 3.1, -1000.25, 42, 600])


После каждой переменной или строки можно использовать console.log(). Это поможет проверить, ведут ли себя значения и код так, как ожидается, прежде чем двигаться дальше. Таким образом вы выловите любые проблемы, не зайдя слишком далеко. Вот пример того, какие значения можно проверить при начале работы.


function selectEvenNumbers(arrayofNumbers) {let evenNumbers = [] console.log(evenNumbers) // Удаляем после проверки выходных данных console.log(arrayofNumbers) // Удаляем после проверки выходных данных }


Ниже приведён код, полученный после обработки каждой строки псевдокода. Символы // обозначают строки из псевдокода. Жирным выделен реальный код на JavaScript.


// function selectEvenNumbers <b>function selectEvenNumbers(arrayofNumbers) {</b>// evenNumbers = [] <b> let evenNumbers = []</b> // for i = 0 to i = length of evenNumbers <b> for (var i = 0; i < arrayofNumbers.length; i++) {</b>// if (element % 2 === 0) <b> if (arrayofNumbers[i] % 2 === 0) {</b>// добавляем его к массиву evenNumbers <b> evenNumbers.push(arrayofNumbers[i]) } }</b>// return evenNumbers <b> return evenNumbers}</b>


Уберём псевдокод, чтобы не путаться.


function selectEvenNumbers(arrayofNumbers) { let evenNumbers = []for (var i = 0; i < arrayofNumbers.length; i++) { if (arrayofNumbers[i] % 2 === 0) { evenNumbers.push(arrayofNumbers[i]) } }return evenNumbers}


Иногда разработчики-новички настолько увлекаются синтаксисом, что им трудно идти дальше. Помните, что со временем вам будет проще соблюдать синтаксис, и нет ничего стыдного в том, чтобы потом при написании кода обращаться к справочным материалам для корректного соблюдения синтаксиса.

 

6. Упрощайте и оптимизируйте код


Возможно, вы заметили, что упрощение и оптимизация — это повторяющиеся темы.


«Простота — предпосылка надёжности».


Эдсгер Дейкстра, нидерландский учёный и один из первопроходцев в ряде областей информатики

В нашем примере одним из путей оптимизации будет фильтрация элементов в массиве посредством возвращения нового массива с помощью filter. В этом случае нам не нужно определять переменную evenNumbers, потому что filter вернёт новый массив с копиями элементов, которые соответствуют фильтру. При этом исходный массив не изменится. Также нам не нужно использовать цикл for. filterпройдёт по каждому элементу, и если вернёт true, то элемент попадёт в массив, а если false, то будет пропущен.


function selectEvenNumbers(arrayofNumbers) {

let evenNumbers = arrayofNumbers.filter(n => n % 2 === 0)

return evenNumbers

}


Может потребоваться несколько итераций упрощения и оптимизации кода, по мере того как вы будете находить новые способы.

Задавайте себе такие вопросы:


· Каковы цели упрощения и оптимизации? Цели зависят от принятого в вашей команде стиля или ваших личных предпочтений. Вы пытаетесь максимально уплотнить код? Или вы хотите сделать его более читабельным? В таком случае вы можете добавить отдельные строки с определением переменной или вычислением чего-либо, а не пытаться всё сделать в одной строке.

· Как ещё можно сделать код более читабельным?

· Можно ли ещё уменьшить количество шагов?

· Есть ли переменные или функции, которые не нужны или не используются?

· Какие-то шаги повторяются? Посмотрите, можно ли определить в другой функции.

· Существуют ли более эффективные способы обработки крайних случаев?

 

«Программы должны быть написаны так, чтобы люди их читали, и лишь во вторую очередь — чтобы машины их исполняли».


Джеральд Сассман и Гарольд Абельсон, авторы “Structure and Interpretation of Computer Programs”

7. Отлаживайте


Этот шаг необходимо выполнять в ходе всего процесса. Сквозная отладка поможет раньше выловить любые ошибки синтаксиса или недостатки логики. Воспользуйтесь преимуществами своего IDE (Integrated Development Environment) и отладчика. При обнаружении бага рекомендуется просматривать код построчно, стараясь найти неожиданные вещи. Несколько советов:


· Читайте, что пишется в сообщения об ошибках в консоли. Иногда в них указываются номера строк для проверки. Это даст вам исходную точку для поисков, хотя иногда проблемы могут скрываться в других строках.

· Комментируйте блоки кода или строки, а также выходные данные, чтобы быстро подмечать поведение кода. При необходимости код можно всегда раскомментировать.

· Используйте другие образцы данных, если возникают непредусмотренные сценарии.

· Сохраняйте разные версии файла, если применяете другие подходы. Не стоит терять наработанное, если захочется откатиться к прежнему решению!

 

«Самый эффективный инструмент отладки — тщательное продумывание в сочетании с разумно размещёнными командами вывода на экран».


Брайан Керниган, профессор информатики в Принстонском университете

8. Пишите полезные комментарии


Через месяц вы можете и не вспомнить, что означает каждая строка кода. А тот, кто будет работать с вашим кодом, вообще этого не знает. Поэтому важно писать полезные комментарии, чтобы избежать проблем и сэкономить впоследствии время, когда придётся снова вернуться к этому коду.

Избегайте таких комментариев:

// Это массив. Итерируем его.
// Это переменная.

Старайтесь писать короткие, высокоуровневые комментарии, которые помогут понять, что тут происходит, если это не очевидно. Это пригодится при решении сложных задач, вы сможете быстро понять, что делает конкретная функция, и почему. Благодаря использованию понятных комментариев и имён переменных и функций вы (и другие люди) сможете понять:


· Для чего этот код?

· Что он делает?

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-09-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: