Процесс перехода от проблемы к коду. Как ты научился? - PullRequest
8 голосов
/ 26 сентября 2008

Я учу / помогаю студенту программировать.

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

  1. Прочтите проблему и поймите ее (конечно).
  2. Определение возможных «функций» и переменных.
  3. Напишите, как бы я делал это шаг за шагом (алгоритм)
  4. Переведите это в код, если есть что-то, что вы не можете сделать, создайте функцию, которая сделает это за вас, и продолжайте двигаться.

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

Так что для описания проекта вроде:

Система должна рассчитать цену Товара на основе следующих правил (описание правил ... клиент, скидки, наличие и т. Д. И т. Д. И т. Д.)

Первый шаг - понять, в чем проблема.

Затем укажите предмет, правила, переменные и т. Д.

псевдокод что-то вроде:

function getPrice( itemPrice, quantity , clientAge, hourOfDay ) : int 
   if( hourOfDay > 18 ) then
      discount = 5%

   if( quantity > 10 ) then
      discount = 5%

   if( clientAge > 60 or < 18 ) then
      discount = 5%


        return item_price - discounts...
end

А затем передать его на язык программирования ..

public class Problem1{
    public int getPrice( int itemPrice, int quantity,hourOdDay ) {
        int discount = 0;
        if( hourOfDay > 10 ) {
             // uh uh.. U don't know how to calculate percentage... 
             // create a function and move on.
            discount += percentOf( 5, itemPriece );
            .
            .
            .
            you get the idea..

        }
     }
    public int percentOf( int percent, int i ) {
             // .... 
    }


}

Вы пошли на подобный подход? .. Кто-то научил вас подобному подходу, или вы обнаружили себя (как я :()

Ответы [ 13 ]

11 голосов
/ 26 сентября 2008

Я использую тестовый подход.

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

- simple calculations (no discounts and concessions) with:
    - single item
    - two items
    - maximum number of items that doesn't have a discount
- calculate for discounts based on number of items
    - buying 10 items gives you a 5% discount
    - buying 15 items gives you a 7% discount
    - etc.
- calculate based on hourly rates
    - calculate morning rates
    - calculate afternoon rates
    - calculate evening rates
    - calculate midnight rates
- calculate based on buyer's age
    - children
    - adults
    - seniors
- calculate based on combinations
    - buying 10 items in the afternoon

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

Образец с использованием Nunit и C #.

[Test] public void SingleItems()
{
    Assert.AreEqual(5, GetPrice(5, 1));
}

Реализуйте это, используя:

public decimal GetPrice(decimal amount, int quantity)
{
    return amount * quantity; // easy!
}

Затем перейдите к двум пунктам.

[Test]
public void TwoItemsItems()
{
    Assert.AreEqual(10, GetPrice(5, 2));
}

Реализация все еще проходит тест, поэтому перейдите к следующему тесту.

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

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

5 голосов
/ 26 сентября 2008

по старой школе ОО:

  • запишите описание проблемы и ее решение
  • обведите существительные, это объекты-кандидаты
  • Нарисуйте прямоугольники вокруг глаголов, это сообщения-кандидаты
  • сгруппируйте глаголы с существительными, которые «совершат» действие; перечислите любые другие существительные, которые понадобятся, чтобы помочь
  • посмотрите, можете ли вы переформулировать решение, используя форму noun.verb (другие существительные)
  • код

[этот метод предшествует карточкам CRC, но он был настолько длинным (более 20 лет), что я не помню, где я его изучил]

4 голосов
/ 26 сентября 2008

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

Я бы сразу перешел от постановки задачи к коду. Хак это вокруг. Помогите студенту увидеть различные способы составления программных / структурирующих алгоритмов. Научите студента передумать и переделать код. Попробуй немного рассказать об эстетике кода.

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

Оттуда я бы начал вводить микро-шаблоны, ведущие в шаблоны дизайна

3 голосов
/ 27 ноября 2008

Я наслаждался TDD каждый раз, когда он был представлен мне. Помогает мне спланировать мой код, и это просто облегчает мне, когда все мои тесты возвращаются с «успехом» каждый раз, когда я изменяю свой код, давая мне знать, что я иду домой вовремя!

3 голосов
/ 26 сентября 2008

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

Скажем, у меня была эта проблема (по аналогии с проектом euler)

сумма квадратов первого десять натуральных чисел, 1 ^ 2 + 2 ^ 2 + ... + 10 ^ 2 = 385

Квадрат суммы первой десятки натуральные числа есть, (1 + 2 + ... + 10) ^ 2 = 55 ^ 2 = 3025

Отсюда и разница между суммой квадратов первой десятки натуральные числа и квадрат сумма 3025 385 = 2640.

Найти разницу между суммой квадраты первой сотни натуральные числа и квадрат сумма.

Итак, я начинаю так:

(display (- (sum-of-squares (list-to 10))
            (square-of-sums (list-to 10))))

Теперь в Схеме нет функций суммы квадратов, квадратов сумм или списков. Поэтому следующим шагом будет создание каждого из них. При построении каждой из этих функций мне может понадобиться абстрагироваться больше. Я стараюсь сделать вещи простыми, чтобы каждая функция действительно выполняла только одно. Когда я создаю какой-то функционал, который можно тестировать, я пишу для него модульный тест. Когда я начинаю замечать логическую группировку для некоторых данных и функций, которые на них воздействуют, я могу поместить их в объект.

3 голосов
/ 26 сентября 2008

Я сделал что-то подобное.

  • Разобраться в правилах / логике.
  • Понимаю математику.
  • Тогда попробуйте и закодируйте его.

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

2 голосов
/ 27 ноября 2008

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

Я помню класс Algorithms, охватывающий некоторые из этих способов, таких как:

  • Сведите это к известной или тривиальной проблеме
  • Разделяй и властвуй (классическим примером здесь является MergeSort)
  • Используйте структуры данных, которые имеют правильные функции (например, HeapSort)
  • Рекурсия (Знание тривиальных решений и умение их сводить)
  • Динамическое программирование

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

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

2 голосов
/ 26 сентября 2008

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

2 голосов
/ 26 сентября 2008

Хорошая книга для начинающих, ищущих процесс: Разработка через тестирование: по примеру

2 голосов
/ 26 сентября 2008

Желаемое мышление, пожалуй, самый важный инструмент для решения сложных проблем. Если вы сомневаетесь, предположите, что для решения вашей проблемы существует функция (сначала создайте заглушку). Вы вернетесь к нему позже, чтобы расширить его.

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