💡 Инструкция: Выберите один ответ из пяти. На работу отведено 55 минут. После завершения откроются правильные ответы, объяснения и результаты по темам.
Вопрос 2 из 20
Какой контрольный тест лучше всего проверит правило, связанное с `struct Report`?
Julia Julia · Неизменяемые структуры struct Копировать
struct Report
values::Vector{Float64}
name::String
end
r = Report([1.0, 2.0], "day")
push!(r.values, 3.0)
@show r
Проверить на отдельном примере, что неизменяемый `struct` делает глубоко неизменяемыми все поля, поэтому массив внутри него нельзя менять через ссылку.
Проверить на отдельном примере, что `mutable struct` допускает изменение полей, но это не отменяет требований к типам полей и согласованности состояния.
Проверить на отдельном примере, что поля обычного `struct` нельзя переназначать после создания, хотя изменяемые объекты внутри полей могут менять своё содержимое.
Проверить на отдельном примере, что проверка инварианта нужна только в конструкторе: публичные изменяющие методы не способны нарушить уже созданное состояние.
Проверить на отдельном примере, что после объявления внешнего конструктора он становится единственной точкой создания экземпляра, даже если внутренний конструктор явно не переопределён.
Вопрос 4 из 20
Какой результат приёмочного теста подтвердит корректность участка с `struct Report`?
s=(x_1:T_1,\ldots,x_n:T_n)
Приёмка должна подтвердить, что проверка инварианта нужна только в конструкторе: публичные изменяющие методы не способны нарушить уже созданное состояние.
Приёмка должна подтвердить, что после объявления внешнего конструктора он становится единственной точкой создания экземпляра, даже если внутренний конструктор явно не переопределён.
Приёмка должна подтвердить, что поля обычного `struct` нельзя переназначать после создания, хотя изменяемые объекты внутри полей могут менять своё содержимое.
Приёмка должна подтвердить, что `mutable struct` допускает изменение полей, но это не отменяет требований к типам полей и согласованности состояния.
Приёмка должна подтвердить, что неизменяемый `struct` делает глубоко неизменяемыми все поля, поэтому массив внутри него нельзя менять через ссылку.
Вопрос 12 из 20
Что нужно подтвердить отдельным примером для `new(float(lo), float(hi))`?
Julia Julia · Конструкторы Копировать
struct Interval
lo::Float64
hi::Float64
function Interval(lo, hi)
lo <= hi || throw(ArgumentError("lo > hi"))
new(float(lo), float(hi))
end
end
@show Interval(1, 3)
Проверить на отдельном примере, что инвариант типа должен сохраняться после любого публичного действия; открытая мутация связанных полей легко создаёт состояние, которое конструктор изначально запрещал.
Проверить на отдельном примере, что поля обычного `struct` нельзя переназначать после создания, хотя изменяемые объекты внутри полей могут менять своё содержимое.
Проверить на отдельном примере, что после объявления внешнего конструктора он становится единственной точкой создания экземпляра, даже если внутренний конструктор явно не переопределён.
Проверить на отдельном примере, что внутренний конструктор контролирует все пути создания экземпляра и может проверять аргументы до вызова `new`; внешние конструкторы удобны для преобразования входов.
Проверить на отдельном примере, что проверка инварианта нужна только в конструкторе: публичные изменяющие методы не способны нарушить уже созданное состояние.
Вопрос 14 из 20
Как проверить, что новая реализация `new(float(lo), float(hi))` не изменила обещанное пользователю поведение?
x\in\mathcal{D}\Rightarrow\operatorname{new}(x)\in\mathcal{I}
Приёмка должна подтвердить, что внутренний конструктор контролирует все пути создания экземпляра и может проверять аргументы до вызова `new`; внешние конструкторы удобны для преобразования входов.
Приёмка должна подтвердить, что инвариант типа должен сохраняться после любого публичного действия; открытая мутация связанных полей легко создаёт состояние, которое конструктор изначально запрещал.
Приёмка должна подтвердить, что поля обычного `struct` нельзя переназначать после создания, хотя изменяемые объекты внутри полей могут менять своё содержимое.
Приёмка должна подтвердить, что после объявления внешнего конструктора он становится единственной точкой создания экземпляра, даже если внутренний конструктор явно не переопределён.
Приёмка должна подтвердить, что проверка инварианта нужна только в конструкторе: публичные изменяющие методы не способны нарушить уже созданное состояние.
Вопрос 17 из 20
Что нужно подтвердить отдельным примером для `0 <= n <= available(a) || throw(ArgumentError("reserve"))`?
Julia Julia · Инварианты Копировать
mutable struct Account
balance::Int
reserved::Int
end
available(a) = a.balance - a.reserved
function reserve!(a, n)
0 <= n <= available(a) || throw(ArgumentError("reserve"))
a.reserved += n
end
Проверить на отдельном примере, что неизменяемость внешнего `struct` гарантирует сохранность инварианта, даже если наружу возвращается ссылка на изменяемый массив из его поля.
Проверить на отдельном примере, что если внутренний конструктор проверил объект один раз, любые последующие публичные методы уже не способны создать запрещённое состояние.
Проверить на отдельном примере, что аннотации типов полей сами проверяют отношения между значениями, например что счётчик не превышает размер связанного буфера.
Проверить на отдельном примере, что инвариант должен сохраняться после каждого публичного действия: даже корректно созданный объект можно испортить методом, который несогласованно меняет связанные данные.
Проверить на отдельном примере, что для `mutable struct` присваивание полю автоматически повторяет проверки внутреннего конструктора и потому не может нарушить инвариант.