TDD расшифровывается как Test Driven Development. Он и все его варианты имеют один общий принцип: напишите тест, прежде чем писать какой-либо код. Если вы посмотрите на методы TDD, вы сразу же наткнетесь на стену сложных тестовых фреймворков. Все это совершенно излишне для кода, над которым вы будете работать, если читаете это. Это потому, что профессиональные программисты обычно могут решить проблемы, с которыми застревают новички. Вам нужен способ разобраться в ваших проблемах, а не способ убедиться, что их проблемы не сбивают вас с толку.

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

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

Проблема, которую мы постараемся решить

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

Вход

Первое, что нужно сделать, это выяснить, с чем мы на самом деле имеем дело. Я собираюсь использовать данные о ресторанах Mongo в качестве примера.

{
  "address": {
     "building": "1007",
     "coord": [ -73.856077, 40.848447 ],
     "street": "Morris Park Ave",
     "zipcode": "10462"
  },
  "borough": "Bronx",
  "cuisine": "Bakery",
  "grades": [
     { "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
     { "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
     { "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
     { "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
     { "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
  ],
  "name": "Morris Park Bake Shop",
  "restaurant_id": "30075445"
}

Это наш вклад.

Вывод

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

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

The Morris Park Bake Shop — пекарня в Бронксе. У него средний балл 8,2.

Давайте пока не обращать внимания на то, как странно звучит слово в Бронксе. У нас есть вход и выход, и мы отправляемся на гонки.

{
  "address": {
     "building": "1007",
     "coord": [ -73.856077, 40.848447 ],
     "street": "Morris Park Ave",
     "zipcode": "10462"
  },
  "borough": "Bronx",
  "cuisine": "Bakery",
  "grades": [
     { "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
     { "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
     { "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
     { "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
     { "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
  ],
  "name": "Morris Park Bake Shop",
  "restaurant_id": "30075445"
}

⇣ Какая-то магическая функция, выполняющая преобразование ⇣

"The Morris Park Bake Shop is a Bakery in Bronx. It's got an average score of 8.2"

Волшебная функция преобразования

Давайте прыгнем прямо и начнем работать над этим…

На самом деле, СТОП это совершенно неправильно! Сначала мы должны написать тест!

мой первый тест

Тест — это просто функция, которая проверяет, делает ли ваша функция преобразования то, что она должна делать. Вот пример

function add (a, b){
    return 4;
}

function testAdding (aNumber, anotherNumber, theResult){
    console.log(`if I add ${aNumber} and ${anotherNumber} I expect ${theResult}`)
    console.log( add(aNumber, anotherNumber) === theResult);
}

testAdding(2, 2, 4);
testAdding(1, 3, 4);
testAdding(4, 0, 4);
testAdding(4, 4, 8);

JS Bin на jsbin.com

Это все здорово! Наша функция добавления пинает задницу, пока мы не дойдем до последнего случая, а потом это отстой.

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

Упражнение для вас:

  • Как бы вы переписали функцию добавления, чтобы она проходила?
  • Добавьте еще несколько тестовых случаев, которые могли бы его поймать.

Если мы перепишем это для данных нашего ресторана, это может выглядеть так:

let inputData = {
  "address": {
     "building": "1007",
     "coord": [ -73.856077, 40.848447 ],
     "street": "Morris Park Ave",
     "zipcode": "10462"
  },
  "borough": "Bronx",
  "cuisine": "Bakery",
  "grades": [
     { "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
     { "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
     { "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
     { "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
     { "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
  ],
  "name": "Morris Park Bake Shop",
  "restaurant_id": "30075445"
};
let outputData = "The Morris Park Bake Shop is a Bakery in Bronx. It's got an average score of 8.2";


function makeSentence (input){
    return "The Morris Park Bake Shop is a Bakery in Bronx. It's got an average score of 8.2";
}

function testMakeSentence (input, theResult){
    console.log(`given ${JSON.stringify(input)} I expect ${theResult}`)
    console.log( makeSentence (input) === theResult);
}

testMakeSentence(inputData, outputData);

JS Bin на jsbin.com

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

Теперь наша магическая функция преобразования:

function makeSentence (input){
    return "The Morris Park Bake Shop is a Bakery in Bronx. It's got an average score of 8.2";
}

Что дает нам один и тот же ответ независимо от ввода. Лучше попробовать:

function makeSentence (input){
    let grades = 8.2;
    return `The ${input.name} is a ${input.cuisine} in ${input.borough}. It's got an average score of ${grades}`;
}

Это все еще не является полностью общим, потому что вы всегда будете получать оценку 8,2, но мы можем над этим поработать. Тест все еще проходит, и мы знаем, что все, что мы сделали, работает.

Вывод

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

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

Обучение программированию в основном связано со способами сопоставления входных данных с выходными. Также важно иметь достаточно ясную голову, чтобы сделать это. Очень мало программирования связано с набором текста; это почти все мысли.

  1. Это верно для британцев, австралийцев и американцев, в меньшей степени для континентальной Европы и России, поскольку их архитектурное образование требует гораздо больше математики. На моем курсе у нас было 2 лекции, где были какие-то расчеты, и это была математика уровня начальной школы. Я не думаю, что в австралийском архитектурном образовании есть какая-либо математика.
  2. С помощью зеленого вы заставили его работать, но не быть хорошим. Часть рефакторинга означает, что вы берете плохой, но работающий код (беспорядочный, медленный и т. д.) и делаете его хорошим. Тест предотвратит появление регрессионных ошибок.

через Notion Parallax http://bit.ly/1WIFBi0