Поделиться через


Абстракции (абстрактные типы и интерфейсы)

Замечание

Это содержимое перепечатывается разрешением Pearson Education, Inc. из руководства по проектированию платформы: соглашения, идиомы и шаблоны для повторно используемых библиотек .NET, 2-го выпуска. Этот выпуск был опубликован в 2008 году, и книга с тех пор была полностью пересмотрена в третьем выпуске. Некоторые сведения на этой странице могут быть устаревшими.

Абстракция — это тип, описывающий контракт, но не обеспечивающий полную реализацию контракта. Абстракции обычно реализуются как абстрактные классы или интерфейсы, и они содержат четко определенный набор справочной документации, описывающей необходимую семантику типов, реализующих контракт. Некоторые из наиболее важных абстракций в .NET Framework включают Stream, IEnumerable<T> и Object.

Платформы можно расширить, реализуя конкретный тип, поддерживающий контракт абстракции и используя этот конкретный тип с использованием API платформы, потребляющих (работающих на) абстракции.

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

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

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

❌ НЕ предоставляйте абстракции, если они не проверяются путем разработки нескольких конкретных реализаций и API, потребляющих абстракции.

✔️ Тщательно выбирайте абстрактный класс и интерфейс при проектировании абстракции.

✔️ Рассмотрите возможность предоставления эталонных тестов для конкретных реализаций абстракции. Такие тесты должны позволить пользователям проверить правильность реализации контракта.

© Часть 2005, 2009 Корпорация Майкрософт. Все права защищены.

Перепечатан с разрешения Pearson Education, Inc. из Руководство по проектированию: Соглашения, идиомы и шаблоны для повторного использования библиотек .NET, 2-е издание Кшиштоф Чвалина и Брэд Абрамс, опубликованное 22 октября 2008 года Addison-Wesley Профессиональный в рамках серии разработки Microsoft Windows.

См. также