Предыдущая часть:
Есть куча песка, у вас в руках лопата, и вам дают задание: переместить кучу песка в другое место.
Как вы поступаете?
Вы набираете лопату песка. Идёте с ней в другое место. Там высыпаете. Возвращаетесь к куче. Снова набираете лопату песка. Идёте. Высыпаете. Возвращаетесь.
Когда вы возвращаетесь и видите, что песка не осталось, вы понимаете, что работа закончена и ходить больше никуда не нужно.
Получается, что вы, ни разу не обучавшись программированию, тем не менее прекрасно знакомы с понятием цикла:
Когда вам надоедает таскать песок лопатой, вам в голову приходит мысль возить его тачкой, потому что в тачку влезает в 10 раз больше больше и вы управитесь быстрее.
Таким образом, вы не просто знакомы с понятием цикла, но и всегда знали, как его оптимизировать:
Но вы ещё не только знаете, как убрать весь песок, но и как вернуть его обратно:
Всегда знали, правда?
Сможете ли вы теперь запрограммировать следующую задачу:
Есть ДВЕ кучи песка, и надо сделать так, чтобы они были одинаковые?
А может, просто сделать так?
Этот способ выглядит гораздо проще. В то время как предыдущий способ имитировал действия в реальной жизни, перенося песок из кучи в кучу по одной лопате, здесь мы просто взяли общее количество песка и поделили его пополам. Супер-эффективно.
Но откуда мы могли знать про это в реальной жизни? Там у нас нет волшебной палочки, которая просто разделила бы песок на равные кучи. И значит, мы не можем изначально знать такой способ. К нему нужно прийти.
Для этого нужно развивать абстракцию моделей. Закодировав количество песка числом 100, мы создали абстракцию высокого уровня. Но кроме свойств объектов абстрагировать нужно и процессы. Например, перекидывание песка можно полностью исключить из модели и перейти сразу к готовым результатам.
Однако это не значит, что так надо делать всегда.
Допустим, вы перекидывали песок из одной кучи в другую, а потом вас отвлекли и вы ушли. Обе кучи остались в каком-то промежуточном состоянии.
Если мы в программной модели хотим воспроизвести это состояние на любой момент времени, то мы должны воспроизводить и сам процесс.
В модели, где состояния куч меняются мгновенно, у нас не будет такой возможности.
Какую модель выбрать для курицы, переходящей дорогу?