Основная идея, лежащая в основе создания свободного интерфейса, заключается в удобочитаемости: кто-то, читающий код, должен иметь возможность понять, что достигается, без необходимости углубляться в реализацию, чтобы уточнить детали.
В современных ОО-языках, таких как C #, VB.NET и Java, объединение методов является одним из способов достижения этой цели, но это не единственный метод - два других - это фабричные классы и именованные параметры.
Обратите также внимание, что эти методы не являются взаимоисключающими - цель состоит в том, чтобы максимизировать читабельность кода, а не чистоту подхода.
Метод создания цепочек
Основная идея цепочки методов заключается в том, чтобы никогда не иметь метод, который возвращает void, а всегда возвращать некоторый объект или, чаще, интерфейс, который позволяет выполнять дальнейшие вызовы.
Вам не нужно обязательно возвращать тот же объект, для которого был вызван метод, то есть вам не всегда нужно «возвращать это».
Одним из полезных методов проектирования является создание внутреннего класса - я всегда добавляю к ним суффикс «Выражение» - который предоставляет свободный API, позволяющий настраивать другой класс.
У этого есть два преимущества: он держит свободный API в одном месте, изолирован от основной функциональности класса, и (потому что это внутренний класс) может работать с внутренностями основного класса так, как другие классы не могут .
Возможно, вы захотите использовать серию интерфейсов, чтобы контролировать, какие методы доступны разработчику в данный момент времени.
Фабричные классы
Иногда вы хотите создать ряд связанных объектов - примеры включают API Критерии NHibernate, ограничения ожидания Rhino.Mocks и новый синтаксис NUnit 2.4.
В обоих этих случаях у вас есть фактические объекты, которые вы храните, но для упрощения их создания существуют фабричные классы, предоставляющие статические методы для создания необходимых вам экземпляров.
Например, в NUnit 2.4 вы можете написать:
Assert.That( result, Is.EqualTo(4));
Класс "Is" - это статический класс, полный заводских методов, которые создают ограничения для оценки NUnit.
Фактически, чтобы учесть ошибки округления и другие неточности чисел с плавающей запятой, вы можете указать точность теста:
Assert.That( result, Is.EqualTo(4.0).Within(0.01));
(заранее извиняюсь - мой синтаксис может быть отключен.)
Именованные параметры
В языках, которые их поддерживают (включая Smalltalk и C # 4.0), именованные параметры обеспечивают способ включения дополнительного «синтаксиса» в вызов метода, улучшая читабельность.
Рассмотрим гипотетический метод Save (), который принимает имя файла и права на применение к файлу после сохранения:
myDocument.Save("sampleFile.txt", FilePermissions.ReadOnly);
с именованными параметрами, этот метод может выглядеть следующим образом:
myDocument.Save(file:"SampleFile.txt", permissions:FilePermissions.ReadOnly);
или, более свободно:
myDocument.Save(toFile:"SampleFile.txt", withPermissions:FilePermissions.ReadOnly);