💡 Инструкция: Выберите один ответ из пяти. Время — 85 минут. У каждого задания ровно один правильный вариант. Фрагменты рассчитаны на Ruby 4.0.6; задания Rails — на Rails 8.1.3. После завершения откроются общий процент, 6 тематических результатов и разбор всех ответов.
Вопрос 1 из 30
Какой фактический результат даст этот фрагмент по теме «Внутренний DSL»? Правильным считается только полностью согласованное утверждение.
Ruby Ruby — Внутренний DSL Копировать
# Проследите выполнение и выберите точный результат.
routes = RouteSet.build do
get '/health', to: :health
post '/orders', to: :create_order
end
p routes.entries
Блок строит объект RouteSet через явные методы `get` и `post`, сохраняя декларации как данные. Это объясняется тем, что блок конфигурации можно передать объекту явно либо выполнить в его контексте; явный параметр сохраняет доступ к внешнему self понятным.
Блок видит private-метод контекста RuleContext и захваченную внешнюю переменную limit. Это объясняется тем, что внутренний DSL остаётся Ruby-кодом и выигрывает от малого словаря предметных операций; магия не должна скрывать порядок и побочные эффекты.
Блок строит объект RouteSet через явные методы `get` и `post`, сохраняя декларации как данные. Это объясняется тем, что внутренний DSL остаётся Ruby-кодом и выигрывает от малого словаря предметных операций; магия не должна скрывать порядок и побочные эффекты.
Неизвестный тип поля приводит к DomainDslError, а не сохраняется до позднего падения генератора. Это объясняется тем, что внутренний DSL остаётся Ruby-кодом и выигрывает от малого словаря предметных операций; магия не должна скрывать порядок и побочные эффекты.
Блок строит объект RouteSet через явные методы `get` и `post`, сохраняя декларации как данные. Это объясняется тем, что стоимость DSL складывается из построения и исполнения; повторная компиляция декларации на каждый запрос создаёт лишние объекты и блокировки.
Вопрос 5 из 30
Не запуская пример, выберите точный итог для блока «Риски безопасности». Проверьте обе половины ответа: частично верный вариант остаётся неверным.
Ruby Ruby — Риски безопасности Копировать
# Проследите выполнение и выберите точный результат.
require 'json'
raw = JSON.parse(File.read('rules.json'), symbolize_names: true)
allowed = %i[name threshold]
unknown = raw.keys - allowed
raise "unknown keys: #{unknown.join(', ')}" unless unknown.empty?
Неизвестный тип поля приводит к DomainDslError, а не сохраняется до позднего падения генератора. Наблюдение согласуется с тем, что DSL — исполняемый Ruby, поэтому загрузка чужого файла эквивалентна выполнению кода с правами процесса; парсер данных безопаснее для недоверенной конфигурации.
JSON/YAML safe_load создаёт данные, которые затем проходят белую проверку, не выполняя произвольный Ruby-код. Наблюдение согласуется с тем, что внутренний DSL остаётся Ruby-кодом и выигрывает от малого словаря предметных операций; магия не должна скрывать порядок и побочные эффекты.
JSON/YAML safe_load создаёт данные, которые затем проходят белую проверку, не выполняя произвольный Ruby-код. Наблюдение согласуется с тем, что DSL — исполняемый Ruby, поэтому загрузка чужого файла эквивалентна выполнению кода с правами процесса; парсер данных безопаснее для недоверенной конфигурации.
Блок строит объект RouteSet через явные методы `get` и `post`, сохраняя декларации как данные. Наблюдение согласуется с тем, что DSL — исполняемый Ruby, поэтому загрузка чужого файла эквивалентна выполнению кода с правами процесса; парсер данных безопаснее для недоверенной конфигурации.
JSON/YAML safe_load создаёт данные, которые затем проходят белую проверку, не выполняя произвольный Ruby-код. Наблюдение согласуется с тем, что стоимость DSL складывается из построения и исполнения; повторная компиляция декларации на каждый запрос создаёт лишние объекты и блокировки.
Вопрос 8 из 30
Что в реализации по теме «Блок конфигурации» требует исправления прежде всего? Сопоставьте не только итог, но и правило, риск или проверку, которые с ним связаны.
Ruby Ruby — Блок конфигурации Копировать
# Обычный запуск проходит. Найдите скрытый риск.
config = ClientConfig.new
config.configure do |c|
c.timeout = 2
c.retries = 3
end
p [config.timeout, config.retries]
Instance_eval делает методы короче, но меняет self и может неожиданно вызвать одноимённый private-метод DSL вместо метода внешнего объекта. Этот риск связан с тем, что внутренний DSL остаётся Ruby-кодом и выигрывает от малого словаря предметных операций; магия не должна скрывать порядок и побочные эффекты.
Instance_eval делает методы короче, но меняет self и может неожиданно вызвать одноимённый private-метод DSL вместо метода внешнего объекта. Этот риск связан с тем, что блок конфигурации можно передать объекту явно либо выполнить в его контексте; явный параметр сохраняет доступ к внешнему self понятным.
Instance_eval делает методы короче, но меняет self и может неожиданно вызвать одноимённый private-метод DSL вместо метода внешнего объекта. Этот риск связан с тем, что стоимость DSL складывается из построения и исполнения; повторная компиляция декларации на каждый запрос создаёт лишние объекты и блокировки.
Глобальный кэш с ключом по имени DSL возвращает старую схему после изменения файла и бесконтрольно растёт при динамических именах. Этот риск связан с тем, что блок конфигурации можно передать объекту явно либо выполнить в его контексте; явный параметр сохраняет доступ к внешнему self понятным.
DSL, который немедленно выполняет внешние действия при чтении файла, делает загрузку конфигурации необратимой и трудной для проверки. Этот риск связан с тем, что блок конфигурации можно передать объекту явно либо выполнить в его контексте; явный параметр сохраняет доступ к внешнему self понятным.
Вопрос 10 из 30
Какое скрытое условие делает фрагмент «Проверка ошибок» хрупким? Оценивайте ответ целиком: обе части утверждения должны быть точными.
Ruby Ruby — Проверка ошибок Копировать
# Обычный запуск проходит. Найдите скрытый риск.
class SchemaDsl
TYPES = %i[string integer].freeze
def field(name, type:)
raise DomainDslError, "unknown type: #{type}" unless TYPES.include?(type)
# сохранить поле
end
end
Method_missing, принимающий любое имя, превращает опечатку в молчаливую новую команду. К такому сбою приводит правило: DSL должен отклонять неизвестные команды, дубликаты и несовместимые параметры в момент построения с указанием места декларации.
Method_missing, принимающий любое имя, превращает опечатку в молчаливую новую команду. К такому сбою приводит правило: `instance_exec` меняет self и может передать аргументы блоку; лексические локальные переменные при этом сохраняются.
Выполнение непроверенного блока с правами богатого объекта даёт доступ ко всем его private-методам через неявный self. К такому сбою приводит правило: DSL должен отклонять неизвестные команды, дубликаты и несовместимые параметры в момент построения с указанием места декларации.
Ограничение списка методов DSL не мешает блоку вызвать Kernel, константы и глобальные объекты процесса. К такому сбою приводит правило: DSL должен отклонять неизвестные команды, дубликаты и несовместимые параметры в момент построения с указанием места декларации.
Method_missing, принимающий любое имя, превращает опечатку в молчаливую новую команду. К такому сбою приводит правило: блок конфигурации можно передать объекту явно либо выполнить в его контексте; явный параметр сохраняет доступ к внешнему self понятным.
Вопрос 11 из 30
Обычный сценарий проходит. Какой риск остаётся в теме «Риски безопасности»? Одного совпавшего вывода недостаточно — проверьте также вторую часть ответа.
Ruby Ruby — Риски безопасности Копировать
# Обычный запуск проходит. Найдите скрытый риск.
require 'json'
raw = JSON.parse(File.read('rules.json'), symbolize_names: true)
allowed = %i[name threshold]
unknown = raw.keys - allowed
raise "unknown keys: #{unknown.join(', ')}" unless unknown.empty?
Ограничение списка методов DSL не мешает блоку вызвать Kernel, константы и глобальные объекты процесса. Источник риска: DSL — исполняемый Ruby, поэтому загрузка чужого файла эквивалентна выполнению кода с правами процесса; парсер данных безопаснее для недоверенной конфигурации.
Method_missing, принимающий любое имя, превращает опечатку в молчаливую новую команду. Источник риска: DSL — исполняемый Ruby, поэтому загрузка чужого файла эквивалентна выполнению кода с правами процесса; парсер данных безопаснее для недоверенной конфигурации.
Ограничение списка методов DSL не мешает блоку вызвать Kernel, константы и глобальные объекты процесса. Источник риска: внутренний DSL остаётся Ruby-кодом и выигрывает от малого словаря предметных операций; магия не должна скрывать порядок и побочные эффекты.
Выполнение непроверенного блока с правами богатого объекта даёт доступ ко всем его private-методам через неявный self. Источник риска: DSL — исполняемый Ruby, поэтому загрузка чужого файла эквивалентна выполнению кода с правами процесса; парсер данных безопаснее для недоверенной конфигурации.
Ограничение списка методов DSL не мешает блоку вызвать Kernel, константы и глобальные объекты процесса. Источник риска: стоимость DSL складывается из построения и исполнения; повторная компиляция декларации на каждый запрос создаёт лишние объекты и блокировки.
Вопрос 12 из 30
Какой риск не исчезает после успешного запуска кода «Контроль производительности»? Проверьте обе половины ответа: частично верный вариант остаётся неверным.
Ruby Ruby — Контроль производительности Копировать
# Обычный запуск проходит. Найдите скрытый риск.
SCHEMA = SchemaDsl.build do
field :email, type: :string
field :age, type: :integer
end.freeze
p SCHEMA.validate(email: 'a@b', age: 30)
Глобальный кэш с ключом по имени DSL возвращает старую схему после изменения файла и бесконтрольно растёт при динамических именах. Проблема возникает из-за того, что стоимость DSL складывается из построения и исполнения; повторная компиляция декларации на каждый запрос создаёт лишние объекты и блокировки.
Глобальный кэш с ключом по имени DSL возвращает старую схему после изменения файла и бесконтрольно растёт при динамических именах. Проблема возникает из-за того, что блок конфигурации можно передать объекту явно либо выполнить в его контексте; явный параметр сохраняет доступ к внешнему self понятным.
Instance_eval делает методы короче, но меняет self и может неожиданно вызвать одноимённый private-метод DSL вместо метода внешнего объекта. Проблема возникает из-за того, что стоимость DSL складывается из построения и исполнения; повторная компиляция декларации на каждый запрос создаёт лишние объекты и блокировки.
Глобальный кэш с ключом по имени DSL возвращает старую схему после изменения файла и бесконтрольно растёт при динамических именах. Проблема возникает из-за того, что внутренний DSL остаётся Ruby-кодом и выигрывает от малого словаря предметных операций; магия не должна скрывать порядок и побочные эффекты.
DSL, который немедленно выполняет внешние действия при чтении файла, делает загрузку конфигурации необратимой и трудной для проверки. Проблема возникает из-за того, что стоимость DSL складывается из построения и исполнения; повторная компиляция декларации на каждый запрос создаёт лишние объекты и блокировки.
Вопрос 17 из 30
Какое общее правило связывает результат и риск в разделе «Риски безопасности»? Нужен вариант без логического разрыва между первой и второй частью.
DSL — исполняемый Ruby, поэтому загрузка чужого файла эквивалентна выполнению кода с правами процесса; парсер данных безопаснее для недоверенной конфигурации. Это правило даёт такой результат: блок строит объект RouteSet через явные методы `get` и `post`, сохраняя декларации как данные.
DSL — исполняемый Ruby, поэтому загрузка чужого файла эквивалентна выполнению кода с правами процесса; парсер данных безопаснее для недоверенной конфигурации. Это правило даёт такой результат: неизвестный тип поля приводит к DomainDslError, а не сохраняется до позднего падения генератора.
DSL — исполняемый Ruby, поэтому загрузка чужого файла эквивалентна выполнению кода с правами процесса; парсер данных безопаснее для недоверенной конфигурации. Это правило даёт такой результат: JSON/YAML safe_load создаёт данные, которые затем проходят белую проверку, не выполняя произвольный Ruby-код.
Стоимость DSL складывается из построения и исполнения; повторная компиляция декларации на каждый запрос создаёт лишние объекты и блокировки. Это правило даёт такой результат: JSON/YAML safe_load создаёт данные, которые затем проходят белую проверку, не выполняя произвольный Ruby-код.
Внутренний DSL остаётся Ruby-кодом и выигрывает от малого словаря предметных операций; магия не должна скрывать порядок и побочные эффекты. Это правило даёт такой результат: JSON/YAML safe_load создаёт данные, которые затем проходят белую проверку, не выполняя произвольный Ruby-код.
Вопрос 19 из 30
Какой рефакторинг делает контракт блока «Внутренний DSL» явным и проверяемым? Ищите не знакомые слова, а технически непротиворечивую пару утверждений.
Ruby Ruby — Внутренний DSL Копировать
# Выберите изменение, которое исправляет причину.
routes = RouteSet.build do
get '/health', to: :health
post '/orders', to: :create_order
end
p routes.entries
Ограничить словарь обычными методами, валидировать итоговую модель целиком и добавлять source location к ошибке. Так закрывается риск: DSL, который немедленно выполняет внешние действия при чтении файла, делает загрузку конфигурации необратимой и трудной для проверки.
Разделить построение декларации и её выполнение; результат DSL должен быть обычным проверяемым объектом. Так закрывается риск: instance_eval делает методы короче, но меняет self и может неожиданно вызвать одноимённый private-метод DSL вместо метода внешнего объекта.
Для внешней конфигурации использовать формат данных и собственный интерпретатор с ограниченными операциями. Так закрывается риск: DSL, который немедленно выполняет внешние действия при чтении файла, делает загрузку конфигурации необратимой и трудной для проверки.
Разделить построение декларации и её выполнение; результат DSL должен быть обычным проверяемым объектом. Так закрывается риск: глобальный кэш с ключом по имени DSL возвращает старую схему после изменения файла и бесконтрольно растёт при динамических именах.
Разделить построение декларации и её выполнение; результат DSL должен быть обычным проверяемым объектом. Так закрывается риск: DSL, который немедленно выполняет внешние действия при чтении файла, делает загрузку конфигурации необратимой и трудной для проверки.
Вопрос 22 из 30
Какой подход сохраняет намерение кода и устраняет дефект в теме «Проверка ошибок»? Одного совпавшего вывода недостаточно — проверьте также вторую часть ответа.
Ruby Ruby — Проверка ошибок Копировать
# Выберите изменение, которое исправляет причину.
class SchemaDsl
TYPES = %i[string integer].freeze
def field(name, type:)
raise DomainDslError, "unknown type: #{type}" unless TYPES.include?(type)
# сохранить поле
end
end
Ограничить словарь обычными методами, валидировать итоговую модель целиком и добавлять source location к ошибке. Решение адресует следующий дефект: ограничение списка методов DSL не мешает блоку вызвать Kernel, константы и глобальные объекты процесса.
Создавать минимальный контекст без сетевых/файловых полномочий и не выполнять как DSL код из недоверенного источника. Решение адресует следующий дефект: method_missing, принимающий любое имя, превращает опечатку в молчаливую новую команду.
Ограничить словарь обычными методами, валидировать итоговую модель целиком и добавлять source location к ошибке. Решение адресует следующий дефект: выполнение непроверенного блока с правами богатого объекта даёт доступ ко всем его private-методам через неявный self.
Для внешней конфигурации использовать формат данных и собственный интерпретатор с ограниченными операциями. Решение адресует следующий дефект: method_missing, принимающий любое имя, превращает опечатку в молчаливую новую команду.
Ограничить словарь обычными методами, валидировать итоговую модель целиком и добавлять source location к ошибке. Решение адресует следующий дефект: method_missing, принимающий любое имя, превращает опечатку в молчаливую новую команду.
Вопрос 23 из 30
Что нужно поменять, чтобы ошибка «Риски безопасности» не возвращалась при следующем изменении? Смотрите на всю причинную связку, а не только на знакомую формулировку.
Ruby Ruby — Риски безопасности Копировать
# Выберите изменение, которое исправляет причину.
require 'json'
raw = JSON.parse(File.read('rules.json'), symbolize_names: true)
allowed = %i[name threshold]
unknown = raw.keys - allowed
raise "unknown keys: #{unknown.join(', ')}" unless unknown.empty?
Для внешней конфигурации использовать формат данных и собственный интерпретатор с ограниченными операциями. Именно эта мера закрывает риск: ограничение списка методов DSL не мешает блоку вызвать Kernel, константы и глобальные объекты процесса.
Разделить построение декларации и её выполнение; результат DSL должен быть обычным проверяемым объектом. Именно эта мера закрывает риск: ограничение списка методов DSL не мешает блоку вызвать Kernel, константы и глобальные объекты процесса.
Для внешней конфигурации использовать формат данных и собственный интерпретатор с ограниченными операциями. Именно эта мера закрывает риск: выполнение непроверенного блока с правами богатого объекта даёт доступ ко всем его private-методам через неявный self.
Ограничить словарь обычными методами, валидировать итоговую модель целиком и добавлять source location к ошибке. Именно эта мера закрывает риск: ограничение списка методов DSL не мешает блоку вызвать Kernel, константы и глобальные объекты процесса.
Для внешней конфигурации использовать формат данных и собственный интерпретатор с ограниченными операциями. Именно эта мера закрывает риск: method_missing, принимающий любое имя, превращает опечатку в молчаливую новую команду.
Вопрос 24 из 30
Какой рефакторинг переводит правило «Контроль производительности» из договорённости в проверяемый контракт? Правильным считается только полностью согласованное утверждение.
Ruby Ruby — Контроль производительности Копировать
# Выберите изменение, которое исправляет причину.
SCHEMA = SchemaDsl.build do
field :email, type: :string
field :age, type: :integer
end.freeze
p SCHEMA.validate(email: 'a@b', age: 30)
Ограничить словарь обычными методами, валидировать итоговую модель целиком и добавлять source location к ошибке. После изменения не должен сохраняться риск: глобальный кэш с ключом по имени DSL возвращает старую схему после изменения файла и бесконтрольно растёт при динамических именах.
Компилировать при загрузке/обновлении конфигурации, делать результат immutable и иметь явную версию для инвалидирования. После изменения не должен сохраняться риск: DSL, который немедленно выполняет внешние действия при чтении файла, делает загрузку конфигурации необратимой и трудной для проверки.
Создавать минимальный контекст без сетевых/файловых полномочий и не выполнять как DSL код из недоверенного источника. После изменения не должен сохраняться риск: глобальный кэш с ключом по имени DSL возвращает старую схему после изменения файла и бесконтрольно растёт при динамических именах.
Компилировать при загрузке/обновлении конфигурации, делать результат immutable и иметь явную версию для инвалидирования. После изменения не должен сохраняться риск: глобальный кэш с ключом по имени DSL возвращает старую схему после изменения файла и бесконтрольно растёт при динамических именах.
Компилировать при загрузке/обновлении конфигурации, делать результат immutable и иметь явную версию для инвалидирования. После изменения не должен сохраняться риск: instance_eval делает методы короче, но меняет self и может неожиданно вызвать одноимённый private-метод DSL вместо метода внешнего объекта.