💡 Инструкция: Выберите один ответ из пяти. Время — 55 минут. У каждого задания ровно один правильный вариант. Фрагменты рассчитаны на Ruby 4.0.6; задания Rails — на Rails 8.1.3. После завершения откроются общий процент, 4 тематических результатов и разбор всех ответов.
Вопрос 1 из 20
Разберите выражения по порядку. Как завершится фрагмент из раздела «Конструктор»? Ищите не знакомые слова, а технически непротиворечивую пару утверждений.
Ruby Ruby — Конструктор Копировать
# Проследите выполнение и выберите точный результат.
class User
attr_reader :name
def initialize(name)
@name = name
:ignored
end
end
p User.new('Ada').class
Чтение `balance` возвращает nil, затем писатель устанавливает 10, и повторное чтение возвращает 10. Это объясняется тем, что `Class#new` выделяет объект и вызывает его `initialize`; возвращаемое значение `initialize` не заменяет созданный экземпляр.
Несмотря на последнюю строку `:ignored`, `User.new` возвращает экземпляр User с установленным именем. Это объясняется тем, что `attr_reader`, `attr_writer` и `attr_accessor` создают обычные методы доступа; переменная экземпляра до присваивания читается как nil.
Несмотря на последнюю строку `:ignored`, `User.new` возвращает экземпляр User с установленным именем. Это объясняется тем, что метод класса — это singleton-метод объекта-класса; переменные экземпляра класса не совпадают с переменными экземпляров его объектов.
Несмотря на последнюю строку `:ignored`, `User.new` возвращает экземпляр User с установленным именем. Это объясняется тем, что `Class#new` выделяет объект и вызывает его `initialize`; возвращаемое значение `initialize` не заменяет созданный экземпляр.
Счётчик `@created` принадлежит объекту `Ticket` и увеличивается двумя вызовами `Ticket.build`. Это объясняется тем, что `Class#new` выделяет объект и вызывает его `initialize`; возвращаемое значение `initialize` не заменяет созданный экземпляр.
Вопрос 2 из 20
Что произойдёт после последней строки в примере по теме «Атрибуты»? Ищите не знакомые слова, а технически непротиворечивую пару утверждений.
Ruby Ruby — Атрибуты Копировать
# Проследите выполнение и выберите точный результат.
class Account
attr_accessor :balance
end
account = Account.new
p account.balance
account.balance = 10
p account.balance
Счётчик `@created` принадлежит объекту `Ticket` и увеличивается двумя вызовами `Ticket.build`. Причина такого результата: `attr_reader`, `attr_writer` и `attr_accessor` создают обычные методы доступа; переменная экземпляра до присваивания читается как nil.
Чтение `balance` возвращает nil, затем писатель устанавливает 10, и повторное чтение возвращает 10. Причина такого результата: метод класса — это singleton-метод объекта-класса; переменные экземпляра класса не совпадают с переменными экземпляров его объектов.
Несмотря на последнюю строку `:ignored`, `User.new` возвращает экземпляр User с установленным именем. Причина такого результата: `attr_reader`, `attr_writer` и `attr_accessor` создают обычные методы доступа; переменная экземпляра до присваивания читается как nil.
Чтение `balance` возвращает nil, затем писатель устанавливает 10, и повторное чтение возвращает 10. Причина такого результата: `attr_reader`, `attr_writer` и `attr_accessor` создают обычные методы доступа; переменная экземпляра до присваивания читается как nil.
Чтение `balance` возвращает nil, затем писатель устанавливает 10, и повторное чтение возвращает 10. Причина такого результата: `Class#new` выделяет объект и вызывает его `initialize`; возвращаемое значение `initialize` не заменяет созданный экземпляр.
Вопрос 3 из 20
Что произойдёт после последней строки в примере по теме «Открытые и закрытые методы»? Одного совпавшего вывода недостаточно — проверьте также вторую часть ответа.
Ruby Ruby — Открытые и закрытые методы Копировать
# Проследите выполнение и выберите точный результат.
class Vault
def reveal
[secret, self.secret]
end
private
def secret
:token
end
end
p Vault.new.reveal
Чтение `balance` возвращает nil, затем писатель устанавливает 10, и повторное чтение возвращает 10. Такой итог следует из правила: private-метод можно вызвать без получателя или с буквальным `self`, но нельзя отправить другому явному получателю; protected допускает явный вызов для совместимых экземпляров в иерархии.
Вызов `reveal` возвращает два символа `:token`: private-метод вызывается и без получателя, и с буквальным `self`. Такой итог следует из правила: private-метод можно вызвать без получателя или с буквальным `self`, но нельзя отправить другому явному получателю; protected допускает явный вызов для совместимых экземпляров в иерархии.
Вызов `reveal` возвращает два символа `:token`: private-метод вызывается и без получателя, и с буквальным `self`. Такой итог следует из правила: метод класса — это singleton-метод объекта-класса; переменные экземпляра класса не совпадают с переменными экземпляров его объектов.
Несмотря на последнюю строку `:ignored`, `User.new` возвращает экземпляр User с установленным именем. Такой итог следует из правила: private-метод можно вызвать без получателя или с буквальным `self`, но нельзя отправить другому явному получателю; protected допускает явный вызов для совместимых экземпляров в иерархии.
Вызов `reveal` возвращает два символа `:token`: private-метод вызывается и без получателя, и с буквальным `self`. Такой итог следует из правила: `attr_reader`, `attr_writer` и `attr_accessor` создают обычные методы доступа; переменная экземпляра до присваивания читается как nil.
Вопрос 6 из 20
Где в показанном решении «Атрибуты» скрыт дефект, который проявится не на каждом входе? В правильном ответе вторая часть действительно объясняет или проверяет первую.
Ruby Ruby — Атрибуты Копировать
# Обычный запуск проходит. Найдите скрытый риск.
class Account
attr_accessor :balance
end
account = Account.new
p account.balance
account.balance = 10
p account.balance
Публичный writer позволяет обойти инварианты, если проверка находится только в отдельном бизнес-методе. Этот риск связан с тем, что `Class#new` выделяет объект и вызывает его `initialize`; возвращаемое значение `initialize` не заменяет созданный экземпляр.
Попытка использовать `return` другого объекта из `initialize` создаёт ложное ожидание фабричного поведения. Этот риск связан с тем, что `attr_reader`, `attr_writer` и `attr_accessor` создают обычные методы доступа; переменная экземпляра до присваивания читается как nil.
Публичный writer позволяет обойти инварианты, если проверка находится только в отдельном бизнес-методе. Этот риск связан с тем, что `attr_reader`, `attr_writer` и `attr_accessor` создают обычные методы доступа; переменная экземпляра до присваивания читается как nil.
Публичный writer позволяет обойти инварианты, если проверка находится только в отдельном бизнес-методе. Этот риск связан с тем, что метод класса — это singleton-метод объекта-класса; переменные экземпляра класса не совпадают с переменными экземпляров его объектов.
Наследник не получает значение переменной экземпляра класса автоматически, хотя наследует сам метод, который её читает. Этот риск связан с тем, что `attr_reader`, `attr_writer` и `attr_accessor` создают обычные методы доступа; переменная экземпляра до присваивания читается как nil.
Вопрос 7 из 20
Какой риск не исчезает после успешного запуска кода «Открытые и закрытые методы»? Ищите не знакомые слова, а технически непротиворечивую пару утверждений.
Ruby Ruby — Открытые и закрытые методы Копировать
# Обычный запуск проходит. Найдите скрытый риск.
class Vault
def reveal
[secret, self.secret]
end
private
def secret
:token
end
end
p Vault.new.reveal
Наследник не получает значение переменной экземпляра класса автоматически, хотя наследует сам метод, который её читает. Уязвимое место возникает потому, что private-метод можно вызвать без получателя или с буквальным `self`, но нельзя отправить другому явному получателю; protected допускает явный вызов для совместимых экземпляров в иерархии.
Попытка использовать `return` другого объекта из `initialize` создаёт ложное ожидание фабричного поведения. Уязвимое место возникает потому, что private-метод можно вызвать без получателя или с буквальным `self`, но нельзя отправить другому явному получателю; protected допускает явный вызов для совместимых экземпляров в иерархии.
Механическая смена private на public ради теста расширяет внешний интерфейс и позволяет вызывать внутреннюю операцию в неверном состоянии. Уязвимое место возникает потому, что `attr_reader`, `attr_writer` и `attr_accessor` создают обычные методы доступа; переменная экземпляра до присваивания читается как nil.
Механическая смена private на public ради теста расширяет внешний интерфейс и позволяет вызывать внутреннюю операцию в неверном состоянии. Уязвимое место возникает потому, что private-метод можно вызвать без получателя или с буквальным `self`, но нельзя отправить другому явному получателю; protected допускает явный вызов для совместимых экземпляров в иерархии.
Механическая смена private на public ради теста расширяет внешний интерфейс и позволяет вызывать внутреннюю операцию в неверном состоянии. Уязвимое место возникает потому, что метод класса — это singleton-метод объекта-класса; переменные экземпляра класса не совпадают с переменными экземпляров его объектов.
Вопрос 10 из 20
Какой механизм объясняет и обычный, и граничный сценарий «Атрибуты»? Проверьте обе половины ответа: частично верный вариант остаётся неверным.
`attr_reader`, `attr_writer` и `attr_accessor` создают обычные методы доступа; переменная экземпляра до присваивания читается как nil. Из этого следует, что несмотря на последнюю строку `:ignored`, `User.new` возвращает экземпляр User с установленным именем.
`Class#new` выделяет объект и вызывает его `initialize`; возвращаемое значение `initialize` не заменяет созданный экземпляр. Из этого следует, что чтение `balance` возвращает nil, затем писатель устанавливает 10, и повторное чтение возвращает 10.
`attr_reader`, `attr_writer` и `attr_accessor` создают обычные методы доступа; переменная экземпляра до присваивания читается как nil. Из этого следует, что счётчик `@created` принадлежит объекту `Ticket` и увеличивается двумя вызовами `Ticket.build`.
`attr_reader`, `attr_writer` и `attr_accessor` создают обычные методы доступа; переменная экземпляра до присваивания читается как nil. Из этого следует, что чтение `balance` возвращает nil, затем писатель устанавливает 10, и повторное чтение возвращает 10.
Метод класса — это singleton-метод объекта-класса; переменные экземпляра класса не совпадают с переменными экземпляров его объектов. Из этого следует, что чтение `balance` возвращает nil, затем писатель устанавливает 10, и повторное чтение возвращает 10.
Вопрос 11 из 20
Как сформулировать правило блока «Открытые и закрытые методы» без лишних обещаний? Правильным считается только полностью согласованное утверждение.
Private-метод можно вызвать без получателя или с буквальным `self`, но нельзя отправить другому явному получателю; protected допускает явный вызов для совместимых экземпляров в иерархии. Наблюдаемое следствие: несмотря на последнюю строку `:ignored`, `User.new` возвращает экземпляр User с установленным именем.
Private-метод можно вызвать без получателя или с буквальным `self`, но нельзя отправить другому явному получателю; protected допускает явный вызов для совместимых экземпляров в иерархии. Наблюдаемое следствие: чтение `balance` возвращает nil, затем писатель устанавливает 10, и повторное чтение возвращает 10.
Метод класса — это singleton-метод объекта-класса; переменные экземпляра класса не совпадают с переменными экземпляров его объектов. Наблюдаемое следствие: вызов `reveal` возвращает два символа `:token`: private-метод вызывается и без получателя, и с буквальным `self`.
`attr_reader`, `attr_writer` и `attr_accessor` создают обычные методы доступа; переменная экземпляра до присваивания читается как nil. Наблюдаемое следствие: вызов `reveal` возвращает два символа `:token`: private-метод вызывается и без получателя, и с буквальным `self`.
Private-метод можно вызвать без получателя или с буквальным `self`, но нельзя отправить другому явному получателю; protected допускает явный вызов для совместимых экземпляров в иерархии. Наблюдаемое следствие: вызов `reveal` возвращает два символа `:token`: private-метод вызывается и без получателя, и с буквальным `self`.
Вопрос 13 из 20
Какое изменение устраняет причину проблемы в теме «Конструктор», а не маскирует симптом? В правильном ответе вторая часть действительно объясняет или проверяет первую.
Ruby Ruby — Конструктор Копировать
# Выберите изменение, которое исправляет причину.
class User
attr_reader :name
def initialize(name)
@name = name
:ignored
end
end
p User.new('Ada').class
Открывать writer только там, где прямое присваивание безопасно; иначе создать метод, который валидирует переход состояния. Так закрывается риск: попытка использовать `return` другого объекта из `initialize` создаёт ложное ожидание фабричного поведения.
Для фабрики с альтернативным результатом создать отдельный метод класса, а `initialize` оставить для установки допустимого состояния. Так закрывается риск: попытка использовать `return` другого объекта из `initialize` создаёт ложное ожидание фабричного поведения.
Для фабрики с альтернативным результатом создать отдельный метод класса, а `initialize` оставить для установки допустимого состояния. Так закрывается риск: наследник не получает значение переменной экземпляра класса автоматически, хотя наследует сам метод, который её читает.
Тестировать поведение через публичный контракт; для сложной внутренней логики выделить отдельный объект с собственным интерфейсом. Так закрывается риск: попытка использовать `return` другого объекта из `initialize` создаёт ложное ожидание фабричного поведения.
Для фабрики с альтернативным результатом создать отдельный метод класса, а `initialize` оставить для установки допустимого состояния. Так закрывается риск: публичный writer позволяет обойти инварианты, если проверка находится только в отдельном бизнес-методе.
Вопрос 14 из 20
Какое инженерное решение лучше всего соответствует механизму «Атрибуты»? Оценивайте ответ целиком: обе части утверждения должны быть точными.
Ruby Ruby — Атрибуты Копировать
# Выберите изменение, которое исправляет причину.
class Account
attr_accessor :balance
end
account = Account.new
p account.balance
account.balance = 10
p account.balance
Открывать writer только там, где прямое присваивание безопасно; иначе создать метод, который валидирует переход состояния. Это изменение устраняет проблему: публичный writer позволяет обойти инварианты, если проверка находится только в отдельном бизнес-методе.
Тестировать поведение через публичный контракт; для сложной внутренней логики выделить отдельный объект с собственным интерфейсом. Это изменение устраняет проблему: публичный writer позволяет обойти инварианты, если проверка находится только в отдельном бизнес-методе.
Открывать writer только там, где прямое присваивание безопасно; иначе создать метод, который валидирует переход состояния. Это изменение устраняет проблему: наследник не получает значение переменной экземпляра класса автоматически, хотя наследует сам метод, который её читает.
Открывать writer только там, где прямое присваивание безопасно; иначе создать метод, который валидирует переход состояния. Это изменение устраняет проблему: попытка использовать `return` другого объекта из `initialize` создаёт ложное ожидание фабричного поведения.
Для фабрики с альтернативным результатом создать отдельный метод класса, а `initialize` оставить для установки допустимого состояния. Это изменение устраняет проблему: публичный writer позволяет обойти инварианты, если проверка находится только в отдельном бизнес-методе.
Вопрос 16 из 20
Какое инженерное решение лучше всего соответствует механизму «Методы класса»? Оценивайте ответ целиком: обе части утверждения должны быть точными.
Если настройка должна наследоваться, определить явную политику копирования или использовать подходящий механизм, а не полагаться на общую `@variable`. Решение адресует следующий дефект: наследник не получает значение переменной экземпляра класса автоматически, хотя наследует сам метод, который её читает.
Если настройка должна наследоваться, определить явную политику копирования или использовать подходящий механизм, а не полагаться на общую `@variable`. Решение адресует следующий дефект: публичный writer позволяет обойти инварианты, если проверка находится только в отдельном бизнес-методе.
Если настройка должна наследоваться, определить явную политику копирования или использовать подходящий механизм, а не полагаться на общую `@variable`. Решение адресует следующий дефект: попытка использовать `return` другого объекта из `initialize` создаёт ложное ожидание фабричного поведения.
Тестировать поведение через публичный контракт; для сложной внутренней логики выделить отдельный объект с собственным интерфейсом. Решение адресует следующий дефект: наследник не получает значение переменной экземпляра класса автоматически, хотя наследует сам метод, который её читает.
Для фабрики с альтернативным результатом создать отдельный метод класса, а `initialize` оставить для установки допустимого состояния. Решение адресует следующий дефект: наследник не получает значение переменной экземпляра класса автоматически, хотя наследует сам метод, который её читает.
Вопрос 17 из 20
Какой регрессионный пример обнаружит ошибочное обобщение в теме «Конструктор»? Выберите связку, в которой верны и основной вывод, и его обоснование.
Проверить наследника: созданные методы доступа участвуют в обычном поиске методов и могут быть переопределены. Этот сценарий проверяет исправление: для фабрики с альтернативным результатом создать отдельный метод класса, а `initialize` оставить для установки допустимого состояния.
Проверить исключение внутри `initialize`: объект не возвращается вызывающему коду, хотя внешние побочные эффекты могли уже произойти. Этот сценарий проверяет исправление: для фабрики с альтернативным результатом создать отдельный метод класса, а `initialize` оставить для установки допустимого состояния.
Проверить исключение внутри `initialize`: объект не возвращается вызывающему коду, хотя внешние побочные эффекты могли уже произойти. Этот сценарий проверяет исправление: открывать writer только там, где прямое присваивание безопасно; иначе создать метод, который валидирует переход состояния.
Проверить исключение внутри `initialize`: объект не возвращается вызывающему коду, хотя внешние побочные эффекты могли уже произойти. Этот сценарий проверяет исправление: тестировать поведение через публичный контракт; для сложной внутренней логики выделить отдельный объект с собственным интерфейсом.
Создать подкласс и вызвать у него унаследованный метод: его `@created` сначала nil и операция `+=` потребует инициализации. Этот сценарий проверяет исправление: для фабрики с альтернативным результатом создать отдельный метод класса, а `initialize` оставить для установки допустимого состояния.
Вопрос 18 из 20
Что нужно воспроизвести отдельно перед выпуском изменения «Атрибуты»? Сопоставьте не только итог, но и правило, риск или проверку, которые с ним связаны.
Создать подкласс и вызвать у него унаследованный метод: его `@created` сначала nil и операция `+=` потребует инициализации. Так проверяется решение: открывать writer только там, где прямое присваивание безопасно; иначе создать метод, который валидирует переход состояния.
Проверить наследника: созданные методы доступа участвуют в обычном поиске методов и могут быть переопределены. Так проверяется решение: для фабрики с альтернативным результатом создать отдельный метод класса, а `initialize` оставить для установки допустимого состояния.
Проверить наследника: созданные методы доступа участвуют в обычном поиске методов и могут быть переопределены. Так проверяется решение: открывать writer только там, где прямое присваивание безопасно; иначе создать метод, который валидирует переход состояния.
Проверить наследника: созданные методы доступа участвуют в обычном поиске методов и могут быть переопределены. Так проверяется решение: тестировать поведение через публичный контракт; для сложной внутренней логики выделить отдельный объект с собственным интерфейсом.
Проверить исключение внутри `initialize`: объект не возвращается вызывающему коду, хотя внешние побочные эффекты могли уже произойти. Так проверяется решение: открывать writer только там, где прямое присваивание безопасно; иначе создать метод, который валидирует переход состояния.