LINUX.ORG.RU
ФорумTalks

[Вещества?]Понять высказывание


0

2

Помогите расшифровать высказывание самого ******* ООПрограммиста - Смольянинова:

Инвариант класса – это утверждение, которое имеет значение «истина» тогда и только тогда, когда любой метод класса, вызванный:

*с агрументами, удовлетворяющий предусловию метода,

*для объекта класса, атрибуты которого порождают значение «истина» инварианта класса,

порождает объект класса, с состоянием, обеспечивающим значение «истина» инварианта класса.



Последнее исправление: yaronasa (всего исправлений: 1)
Ответ на: комментарий от quest

Ты видимо никогда не учился у него. Этот гад не признает никаких википедий, иначе я б не мучался тут.

yaronasa
() автор топика

> утверждение, которое имеет значение «истина» тогда и только тогда, когда [...] метод класса [...] порождает объект класса, с состоянием, обеспечивающим значение «истина» инварианта класса.

Вашему «ООПрограммисту» нужно срочно лечить бесконечную рекурсию головного мозга.

Очевидно, что имелось ввиду следующее:

Инвариант класса — это выражение, имеющее для экземпляра класса значение «истина» тогда и только тогда, когда экземпляр находится в непротиворечивом состоянии.

А поскольку состояние объекта меняется только посредством вызова методов, то вызов любого метода с аргументами, удовлетворяющими предусловию метода, для любого объекта, находящего в непротиворечивом состоянии, должен в результате оставлять этот объект в непротиворечивом состоянии.

geekless ★★
()

Можно поинтересоваться, откуда это определение? Меня в нём смущает условие «для объекта класса, атрибуты которого порождают значение 'истина' инварианта класса», т.к. оно делает утверждение Инвариант класса истинным по определению (или я что-то неправильно понимаю?), что делает само определение бесполезным.

Kirakishou
()
Ответ на: комментарий от geekless

> когда экземпляр находится в непротиворечивом состоянии.

Ни в приведённом определении, ни в статьях англ.википедии ни о какой непротиворечивости речи не идёт, так что не надо путать вопрошающего.

Kirakishou
()

В общем, мне кажется, что в определении ошибочно не разделяются понятия Инвариант и Инвариант Класса.

Возможно, оно должно было звучать так:

Инвариант класса – это утверждение, сказанное относительно некоторого инварианта и некоторого класса, которое имеет значение «истина» тогда и только тогда, когда любой метод класса, вызванный:

  • с агрументами, удовлетворяющий предусловию метода,
  • для объекта класса, атрибуты которого порождают значение «истина» инварианта

порождает объект класса, с состоянием, также обеспечивающим значение «истина» инварианта.

Kirakishou
()
Ответ на: комментарий от geekless

http://en.wikipedia.org/wiki/Class_invariant

In computer programming, specifically object-oriented programming, a class invariant is an invariant used to constrain objects of a class. Methods of the class should preserve the invariant. The class invariant constrains the state stored in the object.

И так далее. В этом определении инвариант определяет набор _ограничений_, но не корректность. Мы можем использовать ограничения для сохранения корректности, но корректность!=ограничения, и ни в одном из приведённых определений понятие корректности не используется.

Kirakishou
()

Боже, пусть сходит провертиртся, напишет helloworld. Судя по всему, товарищ самозаконсервировался в абстрактных формулировках и начал выделять анаэробные токсины, не имеющие отношения к реальности.

mclaudt
()
Ответ на: комментарий от Kirakishou

Мда, забыл уточнить, что википедия — не источник определений.

А указанный фрагмент текста вообще определением не является.

Тем не менее, погуглив, определение инварианту класса я нашел у Мейера:

A class invariant is such an assertion, expressing general consistency constraints that apply to every class instance.

Тогда вполне законное следствие из определения: A class invariant is a condition that defines all valid states for an object.

В этом определении инвариант определяет набор _ограничений_, но не корректность. Мы можем использовать ограничения для сохранения корректности, но корректность!=ограничения, и ни в одном из приведённых определений понятие корректности не используется.

Этот абзац лишен смысла. Давайте просто признаем, что мы оба не правы: я — дав неверное определение, а вы — написав эту несуразицу. :)

geekless ★★
()

Инварианты... Инварианты это круто, только это попытка выдать желаемое за действительное. А именно будто к ООП можно применить формальный подход. Не, я не спорю что он есть. Принцип lsp, транзитивность equals и т.д. Только это такой low level, что вообще не имеет никакого отношения к решению практических задач.

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

О, я знаю, что тебе понравится. Сам недавно ловил приходы. Инварианты на классах - детсад. Вот что тебе нужно: VDM

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

http://www.studfiles.ru/dir/cat32/subj92/file3273/view4656.html

Прокрутил страницу наугад, читаю:

1. Основной сущностью программы является объект, который наделен состоянием и поведением.

Такое ощущение, что это отрывок из священного писания андройдов. Брррр.

geekless ★★
()
Ответ на: комментарий от yaronasa
1.
2.
...
18.

Признаки кретинизма автора и неоптимизированности модели:

  • Список из двузначного числа «заповедей». Даже Цермело-Френкель с аксиомой выбора (ZFC) уложились в девять аксиом.
  • Использование нумерованного списка вместо маркированного там, где нет никакой физически выделенной упорядоченности.
mclaudt
()
Ответ на: комментарий от yaronasa

Мдя, складывается впечатление, что автор рандомно понатыкал все попавшиеся ему факты в теории ООП и по случайным сиюминутным связям сгруппировал, рандомно понатыкав бирки с индексами, наплодив кучу сущностей. Пахнет шизой.

mclaudt
()
Ответ на: комментарий от geekless

А указанный фрагмент текста вообще определением не является.

In computer programming, specifically object-oriented programming, a class invariant is an invariant used to constrain objects of a class.

Если уж это не является определением, то что тогда вообще им является?

википедия — не источник определений

Википедия — ненадёжный источник определений, но это не значит, что каждое определение в нём будет ошибочным. И в данном случае оно даёт гораздо более точное и формальное определение инварианту класса, т.к. определяет его как инвариант. Мейер использует гораздо более расплывчатое понятие assertion, которое само ещё требует дополнительных пояснений.

Этот абзац лишен смысла.

Отнюдь, хотя если вы не обратили внимание на различие понятий инварианта и инварианта класса, то оно могло вам таким показаться.

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

> a class invariant is an invariant

Масло маслянное. Спасибо, кэп. Между тем, суть определения должна быть заключена именно во второй части высказывания: «used to constrain objects of a class». А её тут нет.

Отнюдь, хотя если вы не обратили внимание на различие понятий инварианта и инварианта класса

Второе понятие есть подмножество первого. Спасибо, кэп.

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

>>Масло маслянное. Спасибо, кэп.

С чего ты взял, что отношение принадлежности в понятиях должно автоматом просвечивать при их именовании?

Например, тот факт, что абсолютно сходящийся ряд сходится - это теорема, подлежащая доказательству.

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

> С чего ты взял, что отношение принадлежности в понятиях должно автоматом просвечивать при их именовании?

А оно и не должно. Поэтому определение Мейера — определение, а определение из википедии — «пересказ своими словами».

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

А вообще мне кажется, что не должно существовать никакого общепринятого формализма в программировании, не уходящего корнями в логику работы конкретного компилятора и его парсера.

Все попытки выстроить его без обращения на нижний уровень, оставаясь на прикладном программерском, будут представлять собой нагромождение бессвязных фактов по типу сабжевой методички.

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

Ага. Например, понятие класса во всех ЯП различно, а значит никакого отвязанного от конкретного языка ОО-формализма не построить.

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

Если это сарказм, то напомню, что одно лишь понятие класса никакой формализм составить не может. Пойдешь дальше - больше сложностей.

Хотя, наверное, можно за основу взять исходники компилятора языка. Если где и сидит искомая понятийная структура, то только там. Хотя случай бутстрапа печалит.

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

Хотя, чисто теоретически, можно взять некую систему понятий S и доказать, что для любой системы, отвечающей определению S, верны утверждения A, B, C.

Затем взять языки X, Y, Z и доказать, что они отвечают определению S, а значит для них верны утверждения A, B, C.

Однако это мне видится лишенной практического смысла затеей.

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

Во первых, я не намереваюсь продолжать беседу с тем, кто готов спорить просто ради того, чтобы спорить. Во вторых, определения вида «масло маслянное» - естественный (и очень часто единственно возможный) способ определения некоторых понятий, который очень широко используется в математике, поэтому язвительные замечания тут неуместны.

Между тем, суть определения должна быть заключена именно во второй части высказывания

Вы ошибаетесь, цель определения - прямо или косвенно дать ответ на вопрос «что есть?» а не «зачем нужно?», поэтому «used to constrain objects of a class» это лишь дополнительное пояснение, но не суть определения. Если не верите, можете в этом убедиться на той же википедии, тут и тут (а ежели для вас википедия не является достаточно достоверным источником, то в этих же статьях вы найдёте и нужные ссылки). Более того, для огромного числа понятий вообще не даётся объяснения, зачем оно нужно, но тем не менее, для них по прежнему существуют определения, например, монада.

Второе понятие есть подмножество первого.

Очень хорошо, что вы это поняли. А теперь можете перечитать тот самый абзац и убедиться, что он не лишён смысла.

Поэтому определение Мейера — определение, а определение из википедии — «пересказ своими словами».

Как раз наоборот, определение в википедии есть настоящее определение, основывающееся на теории множеств («инвариант класса» есть подмножество «инвариант»), в то время как Мейер даёт пересказ своими словами, используя расплывчатое понятие «assertion».

За сим удаляюсь, всего хорошего.

Kirakishou
()
Ответ на: комментарий от dizza

>>О, я знаю, что тебе понравится. Сам недавно ловил приходы. Инварианты на классах - детсад. Вот что тебе нужно: VDM

Любопытно. Короче так - несколько поколений кодеров одной фирмы за десятки лет выработали единый синтаксис и семантику обмена информацией о структуре кодируемого проекта.

Кажется, на фундаментальные знания не тянет. Это как учить язык переговоров крановщиков в надежде понять закон гравитации.

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

>>Это как учить язык переговоров крановщиков в надежде понять закон гравитации.

Хотя, не настаиваю. Ведь сочинять на ходу невнятные аналогии это примерно как резать арбуз без косточек.

mclaudt
()
Ответ на: комментарий от Kirakishou

> Во первых, я не намереваюсь продолжать беседу с тем, кто готов спорить просто ради того, чтобы спорить.

Тащемта я свою неправоту признал еще N комментов назад. И кто тут спорит ради спора?

Вы ошибаетесь, цель определения - прямо или косвенно дать ответ на вопрос «что есть?» а не «зачем нужно?»


Верно. Определение из Object-Oriented Software Construction позволят точно ответить на вопрос «что это». В самом прямом смысле слова определить. Определение из википедии не говорит нам ровным счётом ничего.

поэтому «used to constrain objects of a class» это лишь дополнительное пояснение, но не суть определения


То есть, по вашему, суть «без дополнительных пояснений»: a class invariant is an invariant. А теперь «без дополнительных пояснений», только из этого «определения», укажите различия между понятиями invariant и class invariant. Не получится. Потому что определения нет.

> Второе понятие есть подмножество первого.


Очень хорошо, что вы это поняли. А теперь можете перечитать тот самый абзац и убедиться, что он не лишён смысла.


Он лишен смысла. «инвариант определяет набор _ограничений_, но не корректность» — это бессмыслица, как минимум потому, что у нас нет определения корректности объекта. А еще потому, что инвариант — не определяет «набор ограничений», просто является предикатом (утверждением).

Как раз наоборот, определение в википедии есть настоящее определение, основывающееся на теории множеств («инвариант класса» есть подмножество «инвариант»)


«С чего ты взял, что отношение принадлежности в понятиях должно автоматом просвечивать при их именовании? Например, тот факт, что абсолютно сходящийся ряд сходится - это теорема, подлежащая доказательству.» (с) mclaudt
Это во-первых.

Во-вторых же, в википедии дано такое определение: «a predicate is called an invariant to a sequence of operations provided that: if the predicate is true before starting the sequence, then it is true at the end of the sequence.». А теперь: как из него при помощи теории множеств вывести определение для class invariant? Правильный ответ: никак, потому что так определения не выводятся.


используя расплывчатое понятие «assertion».


Вы не знаете, что такое утверждение? Печально, но поправимо. Можно воспользоваться той же книгой: An assertion is an expression
involving some entities of the software, and stating a property that these entities may satisfy at certain stages of software execution.

За сим удаляюсь, всего хорошего.


Аналогично. Вы уперлись рогом и совершенно не желаете включить логику и понять, в чем именно не правы.

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

> Ведь сочинять на ходу невнятные аналогии это примерно как резать арбуз без косточек.

Глубокомысленно.

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

> Тащемта я свою неправоту признал еще N комментов назад. И кто тут спорит ради спора?

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

То есть, по вашему, суть «без дополнительных пояснений»: a class invariant is an invariant. А теперь «без дополнительных пояснений», только из этого «определения», укажите различия между понятиями invariant и class invariant. Не получится. Потому что определения нет.

Соглашусь, одного лишь «a class invariant is an invariant» недостаточно для определения. Для того, чтобы это стало определением, необходимо дополнительно описать свойства объектов модмножества CI. В том определении из википедии, оно, вообще говоря, дано: «Methods of the class should preserve the invariant», или, перефразируя, «Invariants that are preserved by class methods».

Он лишен смысла. «инвариант определяет набор _ограничений_, но не корректность» — ... А еще потому, что инвариант — не определяет «набор ограничений», просто является предикатом (утверждением).

Тот факт, что инвариант является предикатом, не мешает его использовать для того чтобы задавать ограничения. В данном случае, если аттрибуты класса удовлетворяют предикату, мы считаем, что они не нарушают ограничений, и наоборот.

... как минимум потому, что у нас нет определения корректности объекта ...

Во первых, отсутствие у нас чёткого определения одного из терминов не делает эту фразу бессмысленной. Во вторых, расплывчатость определения корректности и является той причиной, по которой я настаиваю, чтобы из определения CI это слово вообще исключить, заменив его упоминанием ограничений, которые очень точно задаются с помощью предикатов.

Во-вторых же, в википедии дано такое определение: «a predicate is called an invariant to a sequence of operations provided that: if the predicate is true before starting the sequence, then it is true at the end of the sequence.». А теперь: как из него при помощи теории множеств вывести определение для class invariant? Правильный ответ: никак, потому что так определения не выводятся.

Исходя из «a class invariant is an invariant» - никак, соглашусь. Оно выводится добавляя упомянутое ранее отличительное свойство CI.

Можно воспользоваться той же книгой: An assertion is an expression

involving some entities of the software, and stating a property that these entities may satisfy at certain stages of software execution.

Очень хорошо, теперь давайте проанализируем определение assertion и CI. Assertion есть некоторое утверждение относительно сущностей ПО (в нашем случае классов & объектов), указывающее свойства этих сущностей в разные моменты выполнения программы (перевод вольный, если можете перевести лучше - прошу). Далее, берём определение CI:

A class invariant is such an assertion, expressing general consistency constraints that apply to every class instance.

Используя определение assertion, можно сказать что CI есть некоторое утверждение относительно сущностей ПО (в нашем случае классов & объектов), указывающее общие ограничения для всех экземпляров класса в разные моменты выполнения программы (опять же, перевод вольный, если можете перевести лучше - прошу).

Как видим, в этом определении вообще теряется понятие инварианта и его свойств, а именно, приведённое вами ранее:

In computer science, a predicate is called an invariant to a sequence of operations provided that: if the predicate is true before starting the sequence, then it is true at the end of the sequence.

Т.е., теряется требование того, чтобы аттрибуты объекта удовлетворяли предикату и до, и после выполнения последовательности операций. В связи с этим, у меня теперь вообще вызывает сомнения корректность этого определения.

С определением из википедии подобных проблем не возникает: CI явно определяется как инвариант, а заодно с ним наследует все его свойства.

Собственно, даже если подправить определение Мейера, возникает вопрос: а нужно ли плодить сущности и дополнительно вводить понятие assertion, и зачем привязываться к «entities of the software» если можно использовать более абстрактные понятия.

По этим причинам я пока остаюсь при мнении, что определение из википедии гораздо лучше.

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