Является ли «инвариантное» свойство частью определения абстракции?

В рамках моего обучения я думаю, что лучший ответ (со смыслом) для определения абстракции, который я нашел, взят из stackoverflow:

Что такое абстракция?

Кроме того,

В рамках текущего онлайн-курса cs61B Fall 2006, Беркли, я изучил приведенное ниже определение ADT, близкое к приведенному выше определению, но добавив дополнительное слово «инвариант». Должен ли я считать это слово следствием приведенного выше определения? или Является ли это слово частью определения?

_Abstract_Data_Type_ (ADT) — это класс с четко определенным интерфейсом, но детали его реализации надежно скрыты от других классов. Таким образом, вы можете изменить реализацию класса, не ставя под угрозу программы, которые от него зависят. Класс Date является ADT.

ADT позволяет применять инварианты.

Инвариант — это факт о структуре данных, который всегда истинен (при условии, что код не содержит ошибок), независимо от того, какие методы вызываются внешними классами. Например, Date ADT применяет инвариант, согласно которому объект Date всегда представляет допустимую дату. Инвариант применяется, разрешая доступ к определенным полям только через вызовы методов.


person overexchange    schedule 05.03.2014    source источник
comment
Значение абстракции, э-э, абстрактно. Как правило, в вычислительной технике это означает модель или описание некоторой системы или компонента, которое скрывает несущественные детали. Инвариант — это инструмент для документирования (и, возможно, тестирования/проверки) системы. Это в основном утверждение некоторого условия, которое всегда верно. Я полагаю, это как бы предполагает, что есть некоторая абстракция для описания, но эти два понятия не тесно связаны.   -  person Hot Licks    schedule 05.03.2014
comment
FWIW: Насколько мне известно, концепция инварианта восходит к концу 60-х или, возможно, началу 70-х годов, и ее отстаивал (я почти уверен) Э. У. Дейкстра. Понятие абстракции также восходит к той эпохе, но сначала это были самостоятельные понятия. Дейкстра был глубоко увлечен формальной проверкой и доказательством правильности, когда уравнения (инварианты), определяющие, что делает программа, записывались и каким-то образом обрабатывались, чтобы доказать правильность программы. Он так и не усовершенствовал эту концепцию, но многие из его идей были включены в структурное программирование.   -  person Hot Licks    schedule 05.03.2014


Ответы (1)


Одно из моих любимых определений абстракции дал Роберт С. Мартин из книги Принципы, шаблоны и практики Agile:

Абстракция — это устранение ненужного и усиление существенного.

Основываясь на этом определении, абстракция может принимать множество форм на разных уровнях:

  • Это может быть целая система
  • Это может быть подсистема
  • Это может быть определение формата сообщения (сродни протоколу).
  • Это может быть функция (как в функциональном программировании)
  • Это может быть абстрактный базовый класс
  • Это может быть интерфейс
  • Это может быть конкретный класс
  • и т. д.

В Объектно-ориентированном программном обеспечении Бертран Мейер описывает классы как Абстрактные типы данных. Идея этой книги состоит в том, что описание абстрактного типа данных включает предварительные и постусловия. В Eiffel (язык, используемый в книге) они называются утверждениями, но мы также знаем их как инварианты.

Взгляд Мейера на объектно-ориентированный дизайн включает инварианты. На детальном уровне (класс/объект/функция) я согласен с тем, что имеет смысл рассматривать инварианты как способ описать абстракцию.

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

person Mark Seemann    schedule 05.03.2014
comment
Итак, отметьте, как бы вы закрепили определение? так что я не могу вернуться назад и снова подумать об определении. - person overexchange; 05.03.2014
comment
С вашей точки зрения: имеет смысл рассматривать инварианты как способ описания абстракции. Хотели бы вы сказать, что абстракция — это не что иное, как обеспечение соблюдения инвариантов? - person overexchange; 05.03.2014
comment
Это больше, чем инварианты; хорошая абстракция часто также является метафорой. - person Mark Seemann; 05.03.2014
comment
@RubenBartelink - Но если это как заказать кофе, это сравнение. - person Hot Licks; 06.03.2014
comment
@HotLicks Да, обычно вы можете быть правы, и я оставлю ваш комментарий без адреса. Но у вас нет смайлика... Мы не на english.stackexchange.com - мы на SO. Хотя первым языком Марка был не английский, обычно кажется, что его вторым языком была архитектура программного обеспечения; следовательно, он не применяет такой термин, как метафора, вольно. en.wikipedia.org/wiki/Simile говорит: Как правило, метафора сильнее и более всеобъемлющее из двух форм риторических аналогий. Итак, вернемся к точке зрения Марка: хорошая абстракция является метафорой. - person Ruben Bartelink; 06.03.2014
comment
Типа, чувак, не бери теленка! (Это метафора или сравнение?) - person Hot Licks; 06.03.2014
comment
На самом деле главное в абстракции то, что она скрывает ненужные детали, создавая более простую концептуальную модель для работы. В этом смысле рассмотрение метафоры может быть отвлекающим и контрпродуктивным, если метафорическая модель имеет детали, которые не соответствуют исходному интерфейсу. Практически все, с чем вы имеете дело в вычислительной технике, является абстракцией, но лишь изредка кто-то в какой-то значительной степени сопоставляется с метафорой. В основном метафоры (и сравнения) полезны как педагогические инструменты или темы для обсуждения, а не как строгие модели/описания для (er) конкретной абстракции. - person Hot Licks; 06.03.2014
comment
@HotLicks Да, сравнение похоже на метафору. Но Марк говорит о метафоре. И Системная Метафора — это вещь. И он намекал на это. И вы не ошибаетесь во всем, что говорите о сравнениях. Но это в лучшем случае побочный момент. Но ты не собираешься сдаваться. Но я! - person Ruben Bartelink; 07.03.2014
comment
@RubenBartelink - Близко, насколько я могу судить по ссылке, системная метафора похожа на коробку конфет - вы никогда не знаете, что получите (и они, вероятно, растают на ваших руках и создадут беспорядок) . (Ссылка вообще не определяет этот термин.) (И я только что понял, что проект, над которым я сейчас работаю, страдает метафорией — большая часть его описана с использованием терминологии, основанной на метафорах, и нет общего понимания эти термины. Следовательно, общение происходит, но страдает понимание.) - person Hot Licks; 07.03.2014
comment
@HotLicks Я выбрал тот, на который я ссылался, основываясь на том, что эта вики в целом является авторитетной, но, возможно, это не лучший источник. Вот более читаемая статья и презентация. Как описано в этот SO Q системная метафора, хотя потенциально мощный, если есть хороший, определенно имеет минусы - вплоть до банальности :) - person Ruben Bartelink; 07.03.2014
comment
@HotLicks Как и в случае с большей частью Xp, здесь есть множество чрезвычайно хорошо продуманных идей, но также, как и во всем, всегда есть много места для неправильного толкования и непонимания. Для меня главная мысль Марка - хорошая абстракция часто также является метафорой и является намного менее бессвязной, чем любая из наших бессвязных фраз :P - person Ruben Bartelink; 07.03.2014
comment
Интересно, не лучше ли использовать термин «аналогия», поскольку он более прямолинеен с природой зверя. - person Hot Licks; 07.03.2014