О декомпозии кода замолвим слово: контекстное программирование
Конечно, в идеале лучше вообще Не писать лишнего кода. А если и писать, то, как известно, нужно хорошо продумывать кости системы архитектуру системы и реализовывать мясо системы логику системы. В данной заметке мы приведем рецепты для удобной реализации последнего.
Мы приведем примеры для языка Clojure, однако сам принцип можно применить и в других функциональных языках программирования (например, ровно эту же идею мы применяем в Erlang).
Идея сама по себе — проста и основывается на следующих утверждениях:
На уровне псевдо-кода это можно представить так:
Вот и вся идея. А дальше — дело техники. С 100500 миллионами деталей.
Пример: реализация пользователем покупки
Распишем детали на конкретном простом примере, который доступен на GitHub тут.
Допустим, что у нас есть пользователи, с деньгами, и лоты, которые стоят денег и которые пользователи могут купить. Мы хотим написать код, который будет проводить покупку лота:
Для простоты, количество денег и лоты пользователя мы будем хранить в самой структуре пользователя.
Для реализации нам потребуется несколько вспомогательных функций.
Функция until-first-error
В подавляющем числе случаев, бизнес логику можно представить как последовательность шагов, которые нужно сделать пока не возникло ошибки. Для этого мы заведем функцию:
Реализацию этой функции можно посмотреть на GitHub тут.
Функция with-result-or-error
Очень часто элементарное действие состоит в том, что нужно просто выполнить какую-то функцию и, если она выполнилась успешно, добавить ее результат к контексту. Для этого заведем функцию:
В целом, единственная цель этой функции — уменьшить размер кода.
Ну и, наконец, наша «красавица».
Функция, реализующая покупку
И пару слов, про остальные функции, которые мы использовали:
А потестировать.
Потестируем этот пример приложения из clojure REPL. Стартуем REPL из консоли из корня проекта:
Контекст выполнения. Основы
Лексическое окружение позволяет сформировать доступный нам набор переменных и функций, учитывая вложенность кода. Но по ходу выполнения программы этот набор данных изменяется, более того у каждой вызванной функции своё собственное лексическое окружение. Каким образом можно отследить происходящие в лексическом окружении изменения, а также определить какое лексическое окружение является текущим, соответствующим данному этапу выполнения кода? Для этих целей используется контекст выполнения.
Контекст выполнения (execution context) в JavaScript используется для того, чтобы отслеживать ход выполнения кода. Именно с его помощью определяется доступное окружение на текущем этапе выполнения программы. А также контекст выполнения содержит в себе дополнительные параметры, которые формируются самостоятельно JavaScript-движком при обработке вашего кода.
Контекст выполнения тоже является абстрактным механизмом спецификации, как и лексическое окружение, к которому невозможно напрямую обратиться или изменить из программы. По сути он представляет собой некую обертку для выполняемого кода, содержащую определенные вспомогательные компоненты для отслеживания состояния программы, к некоторым из которых, мы можем обратиться из нашего кода.
Одним из таких динамически устанавливаемых параметров, к которому можно напрямую обратиться из кода и получить доступ к определенному набору данных в рамках текущего контекста выполнения, является ключевое слово this. Основным назначением ключевого слова this является переиспользование связанного с ним кода в рамках различных окружений. Значение, на которое ссылается ключевое слово this в том или ином месте программы определяется самим местом и способом создания текущего контекста выполнения. Более подробно механизм this будет рассмотрен в последующих частях курса.
Первым контекстом выполнения, который создаётся при запуске JavaScript скрипта является глобальный контекст выполнения (Global Execution Context). В рамках этого контекста будет обрабатываться весь глобальный код программы. Соответственно текущим Лексическим окружением, связанным с глобальным контекстом выполнения, является глобальное глобальное окружение Global Environment.
Например, создадим пустой файл JavaScript и страницу html, загружающую этот файл. Файл JavaScript добавляется на страницу с помощью тега script
Подробнее об этом теге можно прочитать здесь. Архив с уже готовыми исходными файлами доступен по этой ссылке.
Открыв эту html страницу в браузере и запустив Консоль Разработчика (F12), можно получить доступ к глобальному объекту, введя в консоли window this
Также в JavaScript есть такая особенность, что объявленные в глобальной области видимости функции и var переменные помещаются в свойства глобального объекта window :
Создатель JavaScript Брендан Эйх считает глобальный объект одним из своих «самых больших сожалений». Такая особенность глобального объекта отрицательно сказывается на производительности, значительно усложняет реализацию областей видимости переменных и приводит к меньшему модульности кода.
Глобальные переменные имеют два недостатка. Во-первых, части программного обеспечения, которые полагаются на глобальные переменные, подвержены побочным эффектам; они менее надежны, ведут себя менее предсказуемо и менее пригодны для повторного использования. Во-вторых, все JavaScript на веб-странице имеют одни и те же глобальные переменные: ваш код, встроенные модули, код аналитики, кнопки социальных сетей и т. д. А значит, может возникнуть конфликт имен переменных в разных частях вашей программы.
Именно поэтому лучше стараться максимально избегать создания глобальных переменных и объявлять переменные в локальных областях видимости, где они будут непосредственно использоваться.
Еще одной особенностью является то, что если в коде присвоить значение какой-либо необъявленной ранее переменной и, если этот код выполняется не в строгом режиме “use strict”, то JavaScript не только не отобразит ошибку, о несуществующей переменной, но и создаст её для нас в глобальном объекте.
Эта особенность тоже носит негативные эффекты и может привести к возникновению ошибок в процессе выполнения программы. Поэтому переменные всегда необходимо объявлять для их последующего использования. В режиме в строгом режиме “use strict” этот код уже не выполнится и корректно отобразит ошибку
Когда в JavaScript программе кроме глобального кода есть еще вызов функций. Например
То при каждом новом вызове функции создаётся свой контекст выполнения, при этом текущий контекст выполнения (тот, откуда была вызвана функция) приостанавливается.
В предыдущем примере, когда мы из глобального контекста вызываем функцию, обработка глобального контекста приостанавливается и управление переходит в контекст выполнения этой функции. Важно отметить, что в определенное время может обрабатываться только один контекст выполнения. Далее, после выполнения этой функции необходимо вернуться обратно в глобальный контекст, для выполнения следующего кода программы.
Чтобы хранить и отслеживать контексты выполнения они формируются в стек контекстов выполнения (call stack) — список контекстов, организованных по принципу «последним пришёл — первым вышел». Выполняемый контекст всегда является верхним элементом этого стека. После того, как необходимый код выполнится, связанный с ним контекст выполнения удалится, управление вернется в контекст, который находился элементом ниже, и теперь он будет верхним элементом — текущим контекстом выполнения.
Для предыдущего примера стек контекстов выполнения в ходе программы схематично можно показать так:
На этой схеме голубым цветом обозначен текущий, выполняющийся в данный момент времени контекст. А серым — приостановленные контексты, ожидающие окончания выполнения текущего контекста.
Если функция была вызвана из другой функции
то стек контекстов выполнения будет меняться так:
Термин «Контекст» в программировании? [закрыто]
Я программирую уже несколько месяцев, и часто используемое слово «контекст» в классах. Как ServletContext (Java), Activity (Android), Service (Java, Android), NSManagedContext (Objective-C, iOS).
Просматривая словари, я вижу, что слово означает: ситуация, окружающая среда, обстоятельства и т. Д. Однако, поскольку я не являюсь носителем английского языка, я не понимаю, к чему мне следует переводить его напрямую. Например, если бы мне нужно было написать класс с именем SomeClassContext или методом с параметром контекста, я бы не понял, когда мне следует назвать его контекстом, потому что я его не понимаю.
Я искал контекст в переполнении стека, но ни один вопрос / ответ не смог мне помочь.
Я был бы очень рад, если бы кто-то мог дать мне объяснение.
Допустим, вы идете к стоматологу, чтобы вытащить зуб.
Теперь допустим, что вы идете в банк.
Чем больше контекста вы дадите, тем больше знаний у другой стороны, чтобы помочь обработать ваш запрос. Иногда контекст является необязательным (например, вводит все больше и больше слов в поиске Google, чтобы получить лучшие результаты), а иногда это требуется (например, ввод PIN-кода в банкомате). В любом случае, это информация, которая обычно помогает сделать вещи.
Теперь предположим, что вы берете свои 100 долларов и покупаете билет на самолет, чтобы летать куда-нибудь теплым, пока заживает рот.
Вот интересная часть: для многих программ и API требуемый контекст обычно заканчивается как фактические параметры в сигнатуре метода, а необязательный контекст уходит куда-то еще, например, гибкая карта значения ключа, которая может содержать что угодно (и может быть пустой). ) или в локальное хранилище, где к нему можно получить доступ при необходимости.
Термин «Context» в программировании?
Я программирую уже несколько месяцев, и в классах часто используется слово «context». Например ServletContext (Java), Activity (Android), Service (Java, Android), NSManagedContext (Objective-C, iOS).
Заглянув в словари, я вижу, что это слово означает: ситуация, окружение, обстоятельства и т. д. Однако, поскольку я не являюсь носителем английского языка, я не понимаю, на что я должен переводить его непосредственно. Например, если бы я написал класс с именем SomeClassContext или метод с параметром context, я бы не понял, когда мне следует назвать его context, потому что я его не понимаю.
Я искал контекст на Stack Overflow, но ни один вопрос/ответ не смог мне помочь.
Я был бы очень рад, если бы кто-нибудь мог дать мне это объяснение.
9 ответов
Что означает термин контекст в контекстно-свободных и контекстно-зависимых языках? Может ли переменная иметь несколько контекстов? Если мне нужно сохранить определенное значение в определенном адресе памяти, как это влияет на контекст адреса памяти? И если я хочу обновить переменную, как меняется.
Допустим, вы идете к стоматологу, чтобы вам вырвали зуб.
Теперь предположим, что вы идете в банк.
Чем больше контекста вы даете, тем больше знаний у другой стороны, чтобы помочь справиться с вашим запросом. Иногда контекст необязателен (например, вводите все больше и больше слов в поиск Google, чтобы получить лучшие результаты), а иногда он необходим (например, укажите свой номер PIN в ATM). В любом случае, это информация, которая обычно помогает сделать что-то.
Вот интересная часть: для многих программ и APIs требуемый контекст обычно заканчивается как фактические параметры в сигнатуре метода, а необязательный контекст переходит куда-то еще, например, в гибкую карту ключ-значение, которая может содержать что угодно (и может быть пустой) или в локальное хранилище потоков, где к нему можно получить доступ при необходимости.
Надеюсь, это поможет.
Я сталкиваюсь с разработчиками программного обеспечения, использующими термин создания оболочек других классов или APIs или даже некоторых кодов, это термин, используемый опытными программистами Так что есть идеи что они имеют в виду под этим; например, простой вопрос; у нас есть два типа методов.
Контекст можно рассматривать как корзину для передачи информации. Обычно он используется для передачи вещей, не обязательно связанных непосредственно с вызовом метода, но все же может быть уместным. Непрофессиональный способ описания этого может быть «stuff you may care about».
Например, если бы вы писали службу для обновления значения в БД, вы, вероятно, передали бы идентификатор записи и новое значение.
Если вам нужны универсальные интерфейсы, вы также можете определить контекст для передачи, чтобы служба могла выполнять произвольную бизнес-логику. Таким образом, вы можете включить аутентификацию пользователя, состояние сеанса пользователя и т. Д. В контекст, поскольку служба может выполнять дополнительную логику, зависящую от этих значений.
Тем не менее, я публикую это сообщение, чтобы помочь всем, кто, как и я, изо всех сил пытается понять «Context»
Пациент идет к доктору и говорит, что treat_me ( «I have a headache» ) Doc office дает пациенту форму для заполнения. Пациент заполняет анкету. Форма используется врачом для выполнения запроса «treat_me».
Вот как теперь выглядит запрос :
Вот как выглядит filled_form_num_23321 :
Надеюсь, это поможет прояснить концепцию «Context».
я всегда думаю о контексте как о конкретном состоянии, имеющем отношение к объекту или конструкции, с которыми я работаю.
толщина штриха составляет 1.5 пикселей цвет заливки черный границы обзора (155, 200) цвет штриха красный
Это не так сложно, но требуется некоторое время, чтобы понять концепцию
Контекст в вашем случае-это среда, в которой работает ваше приложение.
Он предоставляет информацию / услуги / возможности, необходимые вашему приложению для правильной работы.
Слишком часто автор предполагает, что читатель имеет подробное представление о контексте, в котором используется слово «context».
Казалось бы, автор использует контекст для обозначения какого-то контейнера, возможно, кучи, которая содержит контекст чего-то. Это стало модным словом, которое приобретает много значений и сбивает с толку. Это элементы, которые являются контекстом и хранятся в контексте. Чтобы уменьшить путаницу контекста, в котором используется слово контекст, можно сказать, что «среда выполнения создает контейнер для хранения контекста в виде элементов.» Еще лучше «среда выполнения создает контейнер для хранения состояния в виде элементов, и этот контейнер с его состоянием называется CONTEXT.»
3 года спустя, так что, возможно, немного поздно, но, возможно, эта тема поможет вам. Это иллюстрирует, что слово «context» имеет техническое значение в программировании (а не просто простое английское значение).
Не уверен, что вы можете использовать его в качестве примера и извлечь из него какую-то информацию или нет. Я тоже хотел бы услышать языковое агностическое объяснение термина технического программирования «context»
Edit : Или это, по крайней мере, показывает, что термин «context» может быть применен в техническом, программном контексте (без каламбуров). Возможно, в более чем одном конкретном применении этого термина.
Похожие вопросы:
Есть некоторые новые APIs о context click в android SDK 23. И я не смог найти им полного объяснения. Некоторые результаты поиска (например, для SketchUp) заставляют меня думать, что термин context.
Я знаю, что есть технический термин для этого, и за всю свою жизнь я не могу его вспомнить: При проектировании класса (или какой-то вещи с функциями и данными) каждый вызов методов объекта должен.
Как бы вы назвали такую операцию в функциональном программировании? function(f,vargs) < //variable count of arguments return function()< return f(vargs) >> Я думаю, что это каррирование, но у меня.
Что означает термин контекст в контекстно-свободных и контекстно-зависимых языках? Может ли переменная иметь несколько контекстов? Если мне нужно сохранить определенное значение в определенном.
Я сталкиваюсь с разработчиками программного обеспечения, использующими термин создания оболочек других классов или APIs или даже некоторых кодов, это термин, используемый опытными программистами Так.
Что такое термин встроенные конструкторские функции в программировании? В чем важность конструктора?
Я новичок в Akka / Spray и Scala. Я вижу, как из akka документы, которые есть HttpRequest, которой является класс: Http запрос и там тоже RequestContext который по akka документы инкапсулирует.
Context Класс
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Определяет среду для объектов, которые находятся внутри нее и для которых может быть реализована политика.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Комментарии
Контекст — это упорядоченная последовательность свойств, которые определяют среду для объектов, находящихся внутри него. Контексты создаются во время процесса активации для объектов, настроенных для использования определенных автоматических служб, таких как синхронизация, транзакции, JIT-активация, безопасность и т. д. Внутри контекста возможно существование многих объектов.
Контекст нового объекта обычно выбирается на основе атрибутов meta-данных в классе. Этот механизм является расширяемым с помощью настраиваемых атрибутов. Они называются свойствами статического контекста, которые компилируются в метаданные класса. Свойства динамического контекста (также известные как свойства конфигурации) могут быть применены и настроены администраторами.
Дополнительные сведения о контекстах см. в разделе границы: процессы и домены приложений.
Конструкторы
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Инициализирует новый экземпляр класса Context.
Свойства
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Возвращает идентификатор текущего контекста.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Возвращает массив текущих контекстных свойств.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Возвращает контекст по умолчанию для текущего домена приложения.
Методы
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Выделяет неименованную область данных.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Выделяет именованную область данных.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Выполняет код в другом контексте.
Определяет, равен ли указанный объект текущему объекту.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Очищает вспомогательные объекты для контекстов не по умолчанию.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Освобождает именованную область данных во всех контекстах.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Замораживает контекст, делая невозможным добавление и удаление контекстных свойств из текущего контекста.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Получает значение из указанной области данных текущего контекста.
Служит хэш-функцией по умолчанию.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Ищет именованную область данных.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Возвращает контекстное свойство, указанное именем.
Возвращает объект Type для текущего экземпляра.
Создает неполную копию текущего объекта Object.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Регистрирует динамическое свойство, реализующее интерфейс IDynamicProperty с помощью службы удаленного взаимодействия.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Помещает данные в указанную область данных текущего контекста.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Устанавливает значение контекстного свойства, указанного именем.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Возвращает представление текущего контекста объектом класса String.
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Отменяет регистрацию динамического свойства, реализующего интерфейс IDynamicProperty.

