LINUX.ORG.RU

вопрос по типобезопасности. что она дает?

 


0

1

В википедии дано вот такое определение.

В 1974 году Лисков и Зиллес (англ. Liskov and Zilles) назвали сильно типизированными те языки, в которых «при передаче объекта из вызывающей функции в вызываемую, тип этого объекта должен быть совместим с типом, определённым в вызываемой функции»[1]. Джексон писал: «В сильно типизированном языке всякая ячейка данных будет иметь уникальный тип и всякий процесс будет провозглашать свои требования по взаимосвязи в терминах этих типов»[2].

В статье Луки Карделли[en] «Полнотиповое программирование»[3], система типов называется «сильной», если она исключает возможность возникновения ошибки согласования типов времени выполнения. Иначе говоря, отсутствие непроконтролированных ошибок времени выполнения называется типобезопасностью; ранние работы Хоара называют это свойство безопасностью (англ. security).

Непонятно, какой в этом толк. Допустим, есть тип лист, который имеет свойство intersect. допустим, есть объект этого типа, в котором этот intersect переопределен.

l1 := list(1,2,3)
l2 := list(2,3,4)

f := method(list1, list2, list1 intersect(list2))

f(l1, l2) // list(2, 3)

l1 intersect := "foo"

f(l1, l2) // foo

Тип по-прежнему тот же, а результат другой.

Это значит, что нам для типобезопасности, нужна еще и иммутабельность? Тогда непонятно, причем тут ООП, ведь Лисков — она вроде про ООП писала?

тип должен задавать некоторые инварианты, которым должна следовать реализация intersect. Например то что возвращаемым значением должен быть список того-же типа. В этом случае такая замена метода insersect будет нарушением.

maxcom ★★★★★
()
Ответ на: комментарий от jackdempsey2015

Ты умственно отсталый что ли? Я задал тебе конкретный вопрос.

f :: List -> List -> List   -- была
f :: List -> List -> String -- и вдруг стала

Тип по-прежнему тот же, а результат другой.

Что ты кукарекаешь здесь? Тип другой.

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

f :: List -> List -> List  — была

Да ладно тебе... она была

f :: Any -> Any -> Any

и осталась такой же.

tailgunner ★★★★★
()

так у intersect тоже ведь тип определён. ты не можешь переопределить метод если у него возвращаемое значение другого типа. а если тип тот же, тогда в чём проблема?

AndreyKl ★★★★★
()

Допустим, есть тип лист, который имеет свойство intersect. допустим, есть объект этого типа, в котором этот intersect переопределен.
Тип по-прежнему тот же, а результат другой.

Почему тип тот же?

Stil ★★★★★
()

Прими таблетки и перестань ходить на лор.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.