Абстрагирование потока управления / Хабр
Любой программист, даже если не смотрит на свою работу в таком ключе, постоянно занимается построением абстракций. Чаще всего мы абстрагируем вычисления (пишем функции) или поведение (процедуры и классы), но кроме этих двух случаев в нашей работе возникает множество повторяющихся шаблонов особенно при обработке ошибок, управлении ресурсами, написании стандартных обработчиков и оптимизаций.
Что значит абстрагирование потока управления или «control flow», как выражаются наши заморские друзья? В случае, когда никто не выпендривается, потоком занимаются управляющие конструкции. Иногда этих управляющих конструкций недостаточно и мы дописываем свои, абстрагирующие нужное нам поведение программы. Это просто в языках вроде lisp, ruby или perl, но и в других языках это возможно, например, с помощью функций высшего порядка.
Абстракции
Начнём с начала. Что нужно сделать, чтобы построить новую абстракцию?
- Выделить какой-то кусок функциональности или поведения.
- Дать ему имя.
- Реализовать его.
- Спрятать реализацию за выбранным именем.
Надо сказать, что третий пункт выполним далеко не всегда. Возможность реализации сильно зависит от гибкости языка и от того, что вы абстрагируете.
Что делать если ваш язык недостаточно гибок? Ничего страшного, вместо реализации вы можете просто подробно описать свой приём, сделать его популярным и, таким образом, породить новый «паттерн проектирования». Или просто перейти на более мощный язык, если создание паттернов вас не прельщает.
Но довольно теории, займёмся делом…
Пример из жизни
Обычный код на питоне (взят из реального проекта с минимальными изменениями):
urls = ... photos = [] for url in urls: for attempt in range(DOWNLOAD_TRIES): try: photos.append(download_image(url)) break except ImageTooSmall: pass # пропускаем урл мелкой картинки except (urllib2. URLError, httplib.BadStatusLine, socket.error), e: if attempt + 1 == DOWNLOAD_TRIES: raise
У этого кода множество аспектов: итерация по списку url, загрузка изображений, сбор загруженных изображений в photos, пропуск мелких картинок, повторные попытки загрузки при возникновении сетевых ошибок. Все эти аспекты запутаны в единый кусок кода, хотя многие из них были бы полезны и сами по себе, если бы только мы могли их вычленить.
В частности итерация + сбор результатов реализованы во встроенной функции map
:
photos = map(download_image, urls)
Попробуем выудить и остальные аспекты. Начнём с пропуска мелких картинок, он мог бы выглядеть так:
@contextmanager def skip(error): try: yield except error: pass for url in urls: with skip(ImageTooSmall): photos.append(download_image(url))
Неплохо, но есть недостаток — пришлось отказаться от использования map
. Оставим пока эту проблему и перейдём к аспекту устойчивости к сетевым ошибкам. Аналогично предыдущей абстракции можно было бы написать:
with retry(DOWNLOAD_TRIES, (urllib2.URLError, httplib.BadStatusLine, socket.error)): # ... do stuff
Только вот это не будет работать, with
в питоне не может выполнить свой блок кода более одного раза. Мы уткнулись в ограничения языка и теперь вынуждены либо свернуть и использовать альтернативные решения, либо породить ещё один «паттерн». Замечать подобные ситуации важно, если вы хотите понять различия в языках, и чем один может быть мощнее другого, несмотря на то, что они все полны по Тьюрингу. В ruby и с меньшим удобством в perl мы могли продолжить манипулировать блоками, в лиспе — блоками или кодом (последнее в данном случае, видимо, ни к чему), в питоне нам придётся использовать альтернативный вариант.
Вернёмся к функциям высшего порядка, а точнее к их особой разновидности — декораторам:
@decorator def retry(call, tries, errors=Exception): for attempt in range(tries): try: return call() except errors: if attempt + 1 == tries: raise http_retry = retry(DOWNLOAD_TRIES, (urllib2. URLError, httplib.BadStatusLine, socket.error)) harder_download_image = http_retry(download_image) photos = map(harder_download_image, urls)
Как мы видим, подобный подход хорошо стыкуется с использованием map
, также мы получили пару штучек, которые нам ещё когда-нибудь пригодятся — retry
и http_retry
.
Перепишем skip
в том же стиле:
@decorator def skip(call, errors=Exception): try: return call() except errors: return None skip_small = skip(ImageTooSmall) http_retry = retry(DOWNLOAD_TRIES, (urllib2.URLError, httplib.BadStatusLine, socket.error)) download = http_retry(skip_small(download_image)) photos = filter(None, map(download, urls))
filter
понадобился, чтобы пропустить отброшенные картинки. На самом деле, шаблон filter(None, map(f, seq))
настолько часто встречается, что в некоторых языках есть встроенная функция для такого случая.
Мы тоже можем такую реализовать:
def keep(f, seq): return filter(None, map(f, seq)) photos = keep(download, urls)
Что в итоге? Теперь все аспекты нашего кода на виду, легко различимы, изменяемы, заменяемы и удаляемы. А в качестве бонуса мы получили набор абстракций, которые могут быть использованы в дальнейшем. А ещё, надеюсь, я заставил кого-нибудь увидеть новый способ сделать свой код лучше.
P.S. Реализацию @decorator
можно взять здесь.
P.P.S. Другие примеры абстрагирования потока управления: манипуляции с функциями в underscore.js, списковые и генераторные выражения, перегрузка функций, кеширующие обёртки для функций и многое другое.
P.P.P.S. Серьёзно, нужно придумать перевод получше для выражения «control flow».
Абстрактное мышление – примеры, методы, формы (информатика, 6 класс)
4.4
Средняя оценка: 4.4
Всего получено оценок: 209.
4.4
Средняя оценка: 4. 4
Всего получено оценок: 209.
Постигать законы окружающей действительности через систему отвлеченных толкований позволяет абстрактное мышление, основными категориями которого являются понятия, суждения и умозаключения. При абстрактном мышлении происходит выход за границы обыденной картины мира, путем абстрагирования от реальности в попытке предельно сфокусироваться на некоторой идее.
Абстрактное мышление
В отличие от чувственного восприятия, основанного на познании окружающей действительности органами чувств, мышление — это интеллектуальная работа, выполняемая мозгом человека. И если с помощью органов чувств человек познает внешнюю сторону действительности, то есть воспринимает внешние признаки объектов: цвет, запах, вкус, тепло, то мышление позволяет вникнуть в саму суть изучаемых предметов или явлений, выявить взаимосвязи между ними.
Период интенсивного развития головного мозга приходится на возраст от двух до одиннадцати лет. В это время для развития мышления важно особое внимание уделять развитию математических способностей, решать логические задачи. За абстрактное мышление отвечает левое полушарие мозга.
Рис. 1. Отделы головного мозга.Абстрактное мышление — один из видов мышления
Одним из видов мышления является отвлеченное абстрактно-логическое мышление. Абстрактное мышление строится на теоретической базе абстрактных понятий, над которыми можно выполнять логические операции. Для такого вида мышления свойственно абстрагирование от реальности, благодаря чему строится обобщенная картина мыслей.
Примеры абстрактного мышления можно увидеть в математике, где вводится различные отвлеченные понятия и характеристики. Так, объекта «Цифра» – в природе не существует, но можно использовать это понятие для обозначения количества предметов. В информатике, физике и других науках используются абстрактные понятия для упрощения процесса изучения реальных природных или технических объектов.
Формы абстрактного мышления
Посредством абстрактного мышления человек в процессе рассуждений открывает для себя новые грани изучаемого объекта, расширяет свои знания об окружающей действительности.
Формы абстрактного мышления:
- понятие;
- суждение;
- умозаключение.
Понятие
Понятие отражает результат интеллектуальной деятельности человека, в результате которой формируется общее понимание сути объекта по его существенным признакам. Существенные признаки — это те признаки, которые позволяют отнести объект к той или иной группе. Например, понятие «Автомобиль» обладает рядом несущественных признаков, таких как цвет, марка, мощность мотора. Эти признаки у разных автомобилей различны. Не имеет значения, какого цвета машина, все равно это автомобиль. Но у данного понятия есть также существенные признаки, позволяющие его относить к группе «Автомобили»: наличие двигателя, четырех колес.
Определение понятия — это установление всех существенных признаков. Отдельно признаки являются необходимыми, а все вместе они признаются достаточными для формирования понятия.
Например, наличие двигателя и четырех колес по отдельности необходимые признаки — без колес машина не поедет, без мотора — это уже не автомобиль, а тележка. Вместе эти признаки — достаточны для того, чтобы назвать объект на колесах с мотором машиной.
Понятие может быть житейским, полученным из личного опыта, и научным, полученным путем научения кем-то.
Способы определения понятий:
- анализ — разложение изучаемого предмета на отдельные компоненты;
- синтез — составление из разрозненных частей целого объекта;
- обобщение — объединение сходных по определенным признакам объектов;
- сравнение — определение различия или сходства объектов;
- абстрагирование — концентрация на одних свойствах и отстранения от других.
Суждение
Суждение — это форма мышления, которая воспроизводит не набор свойств объекта, как понятие, а связи и взаимодействие между объектами. Суждения выражаются в форме утверждения или отрицания.
Суждения могут быть простыми, например «Петр Ильич Чайковский — композитор», и сложными «Пришла весна, перелетные птицы вернулись из теплых краев».
О суждении можно сказать, что оно истинно или ложно.
Умозаключение
Умозаключение позволяет из одной или нескольких посылок построить новое заключение.
Например, «Овощи можно употреблять в пищу», «Лук — это овощ» — «Лук можно употреблять в пищу».
Методы мышления
Умозаключение, как наиболее сложная форма мышления, получается в результате рассуждений. В зависимости от подхода в рассуждении различают следующие методы получения умозаключений:
- дедукция — когда рассуждение проводится от общего к частному;
- индукция — рассуждение от частного к общему;
- аналогия — в рассуждении осуществляется перенос информации с одного предмета на другой.
Известный писатель Артур Конан Дойл в своих знаменитых рассказах о Шерлоке Холмсе упоминает методы дедукции и индукции, которыми пользовался знаменитый сыщик.
Рис. 3. Портрет Шерлока Холмса.Что мы узнали?
Абстрактное мышление, как один из видов умственной деятельности, позволяет сформировать обобщенную картину окружающей действительности. Формы абстрактного мышления — понятие, суждение, умозаключение. Понятие образовывается в результате анализа, синтеза, обобщения, сравнения, абстрагирования. Умозаключение строится путем дедукции, индукции, аналогии.
Тест по теме
Доска почёта
Чтобы попасть сюда — пройдите тест.
Алексей Беляев
10/10
Оценка статьи
4.4
Средняя оценка: 4.4
Всего получено оценок: 209.
А какая ваша оценка?
Лестница абстракции — Ешьте
Лестница абстракции — одна из моих любимых концепций, помогающих написать что-то, что стоит прочитать. Пишете ли вы научную статью, пост в Facebook или стихотворение, в какой-то степени вы уже можете использовать лестницу абстракции, не улучшая свое письмо. Тем не менее, понимание концепций поможет вам пересмотреть и обдумать свое письмо по-новому.
Определение некоторых терминов
Прежде чем мы перейдем к этой лестнице, давайте определим несколько понятий. Во-первых, слово «абстрактный»: согласно онлайн-словарю Google прилагательное «абстрактный» означает «существующий в мысли или в виде идеи, но не имеющий физического или конкретного существования». Абстрактные идеи — великие. Это понятия, которые нельзя потрогать или попробовать на вкус — их нужно визуализировать. Любовь, справедливость, честь, красота, свобода, грация, богатство, доброта, истина, счастье и т. д. Если вы можете поставить перед словом «то, что есть» и написать об этом целую книгу, то это довольно абстрактно.
Во-вторых, мы должны определить антоним абстрактного, «конкретный». Опять же, согласно Google, бетон означает «существующий в материальной или физической форме; настоящий или твердый; не абстрактно». Конкретные слова — это осязаемые вещи, которые мы понимаем с помощью наших органов чувств. Клавиатура, на которой я это пишу, — это конкретный объект. Ключи в моем кармане. Пряный гамбо, который я съел на ужине, на который я ходил прошлой ночью.
Лестница абстракции
Итак, теперь Лестница абстракции, концепция, впервые предложенная С.И. Хаякавой в его книге Язык в мыслях и действиях. Хаякава заметил, что письмо можно разбить на абстрактные и конкретные идеи, а лестница помогает показать различные уровни абстракции. Например, на картинке выше самым конкретным является конкретная осязаемая вещь: моя копия «Убить пересмешника ». Но по мере того, как вы поднимаетесь по лестнице, это становится все более и более общим и охватывает все больше и больше вещей.
Система классификации животных — хороший пример лестницы абстракции:
Домен гораздо более абстрактен, вид наиболее конкретен. Хотя если бы вы видели конкретного волка, то могли бы получить более конкретную, даже тогда систему классификации. Если бы вы хотели обсудить достоинства всех живых существ, в том числе и волков, и это было бы более абстрактно.
Допустим, я иду на прогулку к леднику Менденхолл в Джуно, Аляска, мой родной город. Год 2006. Зима, и за озером я вижу волка.
«Эй, смотри, это Ромео!» Я говорю. (Если вам интересно, читайте больше о Ромео здесь). Ромео был особенным волком, одним индивидуальным существом, самой нижней ступенью лестницы абстракции.
«Интересно, что за волк Ромео?» Я мог бы спросить себя. Я иду к периодической таблице и узнаю, что он из рода серых волков. В мире есть много других серых волков, так что это ступенька вверх по лестнице. Я вижу, что Ромео играет с соседскими собаками. Почему собаки? Что ж, на следующей ступени находится его род, canis, в который входят собаки. Они являются частью одного рода. Во всяком случае, вы получаете картину.
Поскольку абстрактное и конкретное — две противоположные стороны спектра, ваша лестница может иметь столько ступенек, сколько вы хотите. Для простоты в лестнице Хаякавы было четыре ступени.
Четвертый уровень: Абстракции | Примеры : Жизнь, красота, любовь, время, успех, сила, зло, добро |
Третий уровень: Широкая группа имен с небольшой спецификацией | Примеры : Люди, женщины, молодежь, промышленность, цели, вещи, телевидение |
Второй уровень: Более определенные группы | Примеры : подростки, средний класс, швейная промышленность, университетский городок, телевизионные драмы, комнатные растения |
Первый уровень: Конкретные, идентифицируемые существительные | Примеры : Nike Air Jordan; моя черно-белая собака Соло; Дилемма всеядного; Новый ребенок моего друга. |
И что?
(@drletizia)
Так почему я болтаю об абстракции, конкретике и этой чертовой лестнице?
По словам Яна Стревера: «Большинство текстов содержат ряд уровней абстракции, но успешных профессиональных писателей активно используют абстракции первого уровня . Изощренность мысли имеет дело с областью абстракции, но изощренность письма достигается за счет поддержки этих абстракций конкретными деталями» (Чунг).
Одной из самых больших проблем, с которыми борются студенты, является специфика. У вашего письма должна быть более крупная идея или цель — начиная с этой верхней ступени — но вы должны потратить много времени на иллюстрацию и объяснение этой идеи в деталях, в примерах . Качественное письмо касается вершины лестницы, а затем тратит большую часть своего времени на конкретные детали, объясняя большую идею.
Если вы обнаружите, что проводите слишком много времени посередине карьерной лестницы, вы начнете звучать как политик на предвыборной речи. Это может быть хорошим политиканством. Но это слишком общее для таких, как мы.
Процитированная работа
Чанг, Дэвид Н. «Лестница абстракции Хаякавы». Университет штата Вашингтон. факультет.wwu.edu/auer/Resources/Hayakawa-Abstraction-Ladder.pdf. По состоянию на 26 августа 2017 г.
@drletizia. «Лестница абстракции — Письменная мастерская 7-го класса TC». Twitter , 6 ноября 2015 г., 8:10, https://twitter.com/drletizia/status/662663232981700608. По состоянию на 26 августа 2017 г.
Штамм, Логан. «Как этот совет по написанию от сенатора улучшит ваш блог». SEJ. https://www.searchenginejournal.com/writing-tip-senator-will-punch-blog-posts/129100/. По состоянию на 26 августа 2017 г.
Важные моменты — Hello World
Каждый день мы сталкиваемся с абстракциями вокруг себя. Они могут быть сокращенными версиями чего-то, чтобы показать пример всего. Например, британская телепрограмма Матч дня показывает только лучшие моменты футбольных матчей; музыкальные веб-сайты позволяют транслировать отрывки из предстоящих альбомов; а аннотация на обороте книги дает только представление обо всей истории.
Абстракции также могут быть символами, которые используются для передачи значения при одновременном снижении сложности. Примерами являются дорожные знаки, карта лондонского метро, расписание занятий и инфографика.
Мы также регулярно используем абстрактные идеи в нашей повседневной жизни. Например, большинство из нас имеют лишь условное представление о большинстве машин, которыми мы пользуемся. Мы используем термины «автомобиль», «микроволновая печь» и «мобильный телефон», не зная толком, что они делают, и не имея представления о том, как они работают.
Математические задачи со словами — отличный пример абстракции. Учащиеся должны выбрать (извлечь) соответствующую информацию из описания, чтобы создать числовое предложение, которое решает задачу.
Абстракция в информатикеВ информатике абстракция является одним из ключевых элементов вычислительного мышления. Barefoot Computing утверждает, что «абстракция заключается в упрощении вещей — определении того, что важно, не слишком заботясь о деталях», в то время как исследователь в области образования Кит Терви говорит, что «абстракция — это процесс, при котором любые ненужные детали опускаются, чтобы помочь нам решить проблему. или достижения конкретного результата».
Одной из целей Национальной учебной программы Англии по информатике является обеспечение того, чтобы все учащиеся «могли понимать и применять фундаментальные принципы и концепции информатики, включая абстракцию, логику, алгоритмы и представление данных».
Абстракция позволяет нам, ученым-компьютерщикам, сконцентрироваться на важных моментах разработки решения, игнорируя несущественные детали — почти так же, как это делают ученики при решении математических задач.
Например, нас могут попросить создать алгоритм приготовления чашки чая. В нашем алгоритме мы можем игнорировать некоторые сложности, которые повлечет за собой эта задача, например, как пользоваться чайником, и использовать (абстрактные) инструкции, такие как «включить чайник», чтобы сделать наш алгоритм проще и понятнее. .
Абстракция на пустом местеБольшинство языков программирования являются абстракциями. Они скрывают сложность, а для нас, людей, непонимание двоичных инструкций, используемых компьютерами. Многие ключевые слова и команды в языках программирования, например команды печати и ввода, также абстрагируются от более сложных задач.
В Scratch есть несколько блоков, которые абстрагируют внутреннюю обработку. На рисунках 1 и 2 ниже показаны два таких блока, и в их подписях можно увидеть скрытые от пользователя шаги.
Идея урока абстракции с использованием ScratchИспользуя декомпозицию и педагогический подход PRIMM (предсказать-выполнить-исследовать-модифицировать-сделать) к структурированию уроков программирования (см. рамку для более подробной информации), мы можем выделить еще один из Поцарапайте блоки, чтобы начать понимать, как работает абстракция.
Проведите класс через следующие шаги, используя рисунок 3:
Предскажите:Попросите учащихся посмотреть на код и спросить: «Что делает этот фрагмент кода? Что будет со спрайтом?»
Выполнить:Попросите учащихся запустить программу и спросите их: «Делает ли код то, что вы ожидали? Если нет, то можете ли вы выяснить, почему?»
Исследование:Попросите учащихся отметить код и прокомментировать его. Вы можете задавать такие вопросы, как «Что делает каждый блок? Что представляют цифры? Что произойдет, если вы измените номера?»
Изменить:Попросите учащихся изменить код, чтобы спрайт также прыгал по левому краю экрана.
Марка:Попросите учеников добавить код, чтобы спрайт прыгал вверху и внизу экрана. Спросите их, что им придется изменить, чтобы протестировать этот код. В качестве дополнительной задачи попросите учащихся повторить блок «Если на грани, подпрыгните».
Абстракция с использованием «Моих блоков»Использование «Моих блоков» в Scratch — отличный способ развить понимание абстракции. При создании абстракции учащиеся должны полностью понимать, какую информацию необходимо скрыть от пользователя.
Одной из сложностей обучения Scratch детей младшего возраста является необходимость понимания ими координат и использования отрицательных чисел для управления движением спрайта по сцене. Мы можем использовать абстракцию, чтобы скрыть эти сложности, создав новые блоки для перемещения влево, вправо, вверх и вниз. Проведите учащихся через следующие шаги:
Предскажите:Как вы думаете, что будет делать блок на рис. 4?
Выполнить:Используя блок «При нажатии клавиши со стрелкой вправо», запустите блок «Переместить вправо на x шагов». Делает ли он то, что вы думали?
Исследуйте:Исследуйте определение блока на рис. 5. Как это работает? Будет ли это работать для всех направлений?
Изменить:Можете ли вы создать другие блоки для перемещения влево, вверх и вниз?
Марка:Можете ли вы создать еще один блок под названием «Оставаться на экране», чтобы тело спрайта не исчезало с экрана? Можете ли вы затем изменить блоки «Переместить вправо», «Влево», «Вверх» и «Вниз», чтобы включить этот блок «Оставаться на экране»?
Жанетт Винг, известная как автор вычислительного мышления, называет абстракцию наиболее важным мыслительным процессом в информатике. Абстракции повсюду в вычислениях: они скрывают сложность лежащих в их основе процессов, будь то сложность алгоритма, программы, самого компьютера или вашего собственного понимания того, что такое Интернет.