Interface Segregation Principle (ISP)¶
ISP говорит: лучше несколько узких контрактов, чем один широкий интерфейс, от которого всем достается лишнее.
Что означает в 1С¶
Для 1С это обычно означает, что не нужно заставлять клиента зависеть от общего модуля или объекта, где рядом лежат:
- чтение;
- запись;
- печать;
- отправка;
- администрирование.
Если клиенту нужна только одна часть, контракт лучше сузить.
В 1С такая сегрегация часто выполняется не отдельной конструкцией языка, а организацией модуля через области.
Например:
- методы для внешних потребителей выносят в
Программный интерфейс; - более узкие точки входа для других подсистем могут оформляться областью
ДляВызоваИзДругихПодсистем; - методы для внутренних технических потребителей оставляют в
СлужебныйПрограммныйИнтерфейс.
То есть сегрегация здесь выражается не только в "разных интерфейсах" как в классическом ООП, но и в том, что модуль явно показывает: какой набор методов предназначен для какого круга клиентов.
Это поддерживают и стандарты: #std455: Структура модуля, #std551: Разработка конфигураций с повторным использованием общего кода и объектов метаданных и #std644: Обеспечение совместимости библиотек.
Пример на 1С¶
#Region Program interface
Function GetPrintData(InvoiceRef) Export
Return New Structure;
EndFunction
#EndRegion
#Region ДляВызоваИзДругихПодсистем
Function ExportForExchange(InvoiceRef) Export
Return "Exported";
EndFunction
#EndRegion
#Region Service interface
Procedure ResetCache() Export
EndProcedure
#EndRegion
Клиент печати зависит только от GetPrintData(), а клиент экспорта только от Export(). Им не нужен общий "супер-интерфейс", в котором перемешаны обе обязанности.
Где полезен¶
- в общих модулях прикладных сервисов;
- в интеграционных шлюзах;
- в коде форм, которым нужна только узкая часть большого API.
Когда применяют неправильно¶
- когда дробление уходит слишком далеко и интерфейсов становится больше, чем смысла;
- когда разделение не отражает реальных сценариев использования;
- когда клиентам почти всегда нужен полный набор операций.