Обобщение
Идея взять решенную проблему и приспособить ее решение (алгоритм) к другим подобным задачам называется обобщением. Предположим, что нужно найти свое имя в списке рассадки гостей. Этот список — представление имен, из которого мы узнаем, где сидим. Вместо того чтобы искать в случайном порядке, мы начинаем сверху и проверяем каждое имя по очереди, пока мы не дойдем до своего. Другой пример — надо найти на полке CD, и мы понимаем, что это похожая задача. Таким образом мы осуществляем сопоставление с образцом — сравниваем одну задачу с другой. Как только мы осознаем, что две задачи сводятся к одной, то используем для обеих одно и то же решение, и необходимость поиска нового алгоритм отпадает. Мы начинаем с одного конца и ведем пальцем по полке, проверяя каждый диск по очереди, пока не найдем нужный (или не доберемся до конца, что будет означать отсутствие диска). Мы обобщили и преобразили алгоритм (решение для первой задачи) и используем его для решения новой задачи.
Мы можем пойти еще дальше, если осознаем, что каждый раз, когда у нас есть каким-то образом выстроенная последовательность и необходимо что-то найти, можно использовать это решение. Итак, мы обобщили задачу поиска имен до задачи поиска чего угодно и обобщили список имен до любой выстроенной последовательности вещей. Мы преобразили наш алгоритм в общий алгоритм поиска. Теперь он подходит не только для конкретной задачи, но для любой задачи такого рода. Его можно использовать каждый раз, как только понадобится что-нибудь найти. Мы обобщили решение, которое было изобретено для решения всего одной задачи (найти наше имя), но оно подошло для целого класса проблем.
Обратите внимание: чтобы провести обобщение, необходимо скрыть часть деталей. Нам не нужно думать об особенностях имен или дисков, поэтому мы обобщили их до «элемента». Мы используем абстрагирование, чтобы провести обобщение.
Иногда мы проводим обобщение, чтобы создать очень общие алгоритмы, которые можно использовать во многих ситуациях, как показано выше. В других случаях мы понимаем, что новая задача в совершенно иной области похожа на уже решенную нами, и поэтому мы делаем однократное обобщение — переносим задачу (а значит, и решение). Например, в телефонах используется функция предиктивного набора текста. Когда вы начинаете вводить слово, телефон догадывается по набранным буквам, что за слово вы набираете. Парализованные люди, которые не могут говорить, общаются, выбирая буквы по системе моргания. Тот же самый алгоритм предиктивного набора текста можно использовать и в этой ситуации. Люди точно так же могут догадаться, что им хотят сказать, по первым буквам. Один алгоритм можно использовать для двух разных с виду проблем, как только становится очевидным их сходство при сопоставлении с образцом.
Сопоставление с образцом и обобщение используют на самых разных уровнях — от осознания, что задача аналогична уже решенной, и до понимания, что небольшие фрагменты задач одинаковы. Часто при написании программы видно, что отдельные ее части похожи на то, с чем мы уже имели дело. Предположим, нам нужно, чтобы программа каждый раз спрашивала, хотим ли мы сделать что-то еще раз (например, сыграть в игру снова после выигрыша). Если мы уже писали код для такого случая, то имеет смысл адаптировать его и интегрировать в новую программу, не продумывая необходимые команды с самого начала.
Обобщение помогает и при оценке. Предположим, что мы создали некий общий алгоритм. Его оценивают один раз, и все, что при этом узнают о нем, применимо к каждому новому случаю использования. Например, сведения об абсолютной скорости работы алгоритма и скорости его работы по сравнению с другими алгоритмами являются основанием для решения, подходит ли он для каких-либо новых задач.