SowingSadness
@SowingSadness
web-разработчик

Определение нарушения уровня абстракции?

Хабросообщество, помогите.

Есть вопрос, который гложет меня уже несколько дней.


Как понять, что я нарушил уровень абстракции при реализации класса?

Как рассчитать, уровень абстракции метода Х.

Как вычислить уровень абстракции используемого класса в методе Х?

Пересекается ли декомпозиция логики работы класса по методам с множеством задач, в которых возможно нарушение уровня абстракции?
  • Вопрос задан
  • 5488 просмотров
Решения вопроса 1
SowingSadness
@SowingSadness Автор вопроса
web-разработчик
Капаясь на сайте intuit в курсе UML, неожиданно обнаружил ответ на мой вопрос :)

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

Подсистема — это система, функционирование которой не зависит от сервисов других подсистем.
Программная система структурируется в виде совокупности относительно независимых подсистем. Также определяются взаимодействия между подсистемами.

Модель — это некий (материальный или нет) объект, отображающий лишь наиболее значимые для данной задачи характеристики системы.

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

Так что, нарушение уровня абстракции не может быть в рамках методов одного класса.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
TheHorse
@TheHorse
Нарушением уровня абстракций, насколько я понимаю то, что вы вкладываете в понятие уровня абстракции, будет факт несогласованности интерфейса класса. Если у вас есть методы из названий которых следует, что они относятся к разным уровням абстракции, вы нарушили абстракцию класса. Другими словами, если в одном классе есть методы getCount и getCountOfFlat — на лицо нарушение абстрагирования. Появление таких методов вероятно при наличии наследования, которое я считаю исключением из правил.

На сколько я понимаю, из курса ТСПП, уровень абстракции — абстрактная величина, и не может быть вычислена.

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

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

P. S. Никогда не встречал понятие уровня абстракции за пределам контекста декомпозиции, может не правильно понял, следовательно, не правильно ответил :(
Ответ написан
forketyfork
@forketyfork
Если говорить о нарушении уровня абстракции в методе, то оно, как правило, заключается в том, что метод выполняет несколько действий, которые относятся к разным уровням абстракции.
Скажем, если в одном и том же сервисном методе присутствует как бизнес-логика, так и обращения к базе данных или файловой системе, не абстрагированные, например, через DAO, то это — нарушение абстракции на уровне метода.

Если говорить о нарушении уровня абстракции в отношении класса, то оно обычно представлено тем, что разные методы класса относятся к разным уровням абстракции.
Например, если одни методы DAO в качестве параметров получают доменные объекты, а другие — значения полей для прямой вставки в таблицу, то это — нарушение абстракции на уровне класса.
Ответ написан
wartur
@wartur
Если подумать о теории и космическом то:

В моем видении все просто.

Если вы где-то для двух классах наследниках реализовываете два одинаковых метода, то это эти методы нужно реализовывать в базовом классе. Так же если вы написали в базовом классе метод который используется только в одном наследнике, то нужно переносить этот метод в данный класс.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы