@frontjss

Что такое закон негерметичных абстракций?

Объясните пожалуйста понятно что это значит?
  • Вопрос задан
  • 307 просмотров
Пригласить эксперта
Ответы на вопрос 1
@majstar_Zubr
C++, C#, gamedev
Любая абстракция может частично или полностью включать определение другой абстракции.

Есть какие-то сущности.

Они взаимодействуют в какой-то среде определённым образом.

Отразим эти правила в какой-то спецификации.

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

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

А теперь, допустим, мы хотим решить обратную задачу: мы хотим описать спецификацию концептуально нового взаимодействия. Как этого добиться, если у нас есть набор абстракций, которые привязаны к конкретным сущностям?

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

Первый вариант: мы, возможно, можем сделать композит из уже составленных абстракций. В таком случае, у нас появится абстракция уровня выше, а может быть и несколько абстракций, что в свою очередь породит новые взаимодействия, в описании которых будет обязательно присутствовать наш композит. Вносить такие изменения относительно легко, потому что это простое наращивание. Например, этим вариантом можно прийти от атомарных операции к понятию транзакции.

Вариант второй: мы не можем сделать композит, потому что на самом деле нам не хватает понятий в спецификации. Нам требуется такая сущность, которая бы в одном случае могла стать одной абстракцией, а в другом случае - другой. Либо нам требуется частичное поведение из разных сущностей. Нам это важно, потому что мы описываем взаимодействия через конечный набор терминов, которые означают абстракции, которые до постановки этой задачи целиком и полностью были синонимами сущностей. Теперь же, для решения нашей задачи придется ввести промежуточный слой отображения между сущностями с одной стороны и понятиями (абстракциями) с другой. В целом, нам придется придумать и описать не только новую сущность, но новую абстракцию.
Когда мы начнем описывать новую сущность, мы можем прийти к выводу, что нам не хватает терминов, что полет привести к тому, что мы начнем делать ещё один уровень описания, более низкий, мы начнем декомпозировать наши сущности на наборы более низких по уровню абстракций и описывать уже взаимодействия для низкоуровневых абстракций, чтобы произвести обобщения, сформировать низкоуровневых, относительно исходных сушностей терминологию, чтобы суметь сделать такой композит, которые был бы на одном уровне абстракций с исходными сущностями. В целом, это условно плохой вариант, потому что в этом случае инкапсуляция сущности протекла, и нам пришлось нырнуть на уровень абстракции ниже.

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

Следствие закона такое, что идеальный API и идеальная библиотеке наращиваются только композитами с более высокими абстракциями, никогда не имеют depricated методов, никогда не имеют аналогов и никогда не имеют проблем с обратной совместимостью.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы