Путаница и сложность кода — проблема в большинстве программных проектов. Особенно это хорошо видно в корпоративных проектах. Причиной этой путаницы может быть быстрое и незапланированное развитие, плохо спроектированная структура и неопределенная архитектура. Но мы должны это знать. Код по своей сути сложен. Мы можем написать код по принципу свободного интерфейса, чтобы сделать его более читабельным и понятным в этой сложной структуре, а в некоторых случаях — в кодах.
Свободный интерфейс
- Более обнаружимые и читаемые коды
- В коде есть информация о предметной области (на самом деле мы создаем мини-DSL)
- Если мы хотим создать предметно-ориентированный язык, мы можем его использовать. И поэтому бизнес-аналитики могут прокомментировать это, когда они смотрят на код
- это обеспечивает простую структуру для использования
Другими словами, он обеспечивает смысл и беглость (упорядоченную или неупорядоченную) для клиентов кода. Мы увидим разницу между традиционным кодированием и кодированием с удобным интерфейсом.
Свободный интерфейс состоит из двух важных принципов
- Метод цепочки
- Более читаемый API (Domain Spesific Language-DSL)
Примечание: метод цепочки и плавный интерфейс это совершенно разные вещи. Свободный интерфейс — это приложение, связывающее методы, которое используется для создания мини-DSL или читаемых API.
В каком случае мы можем использовать это?
- Рамки при разработке; Рассмотрим компанию, которая создает программную инфраструктуру. Эта инфраструктура будет использоваться всеми приложениями, которые компания разработает для приложений. Многие разработчики программного обеспечения, которые разработали эту платформу приложений. и это будут лучшие новые приложения, которые будут производиться через крышу. В этом случае команды разработали инфраструктуру, с учетом этих принципов они могут разработать библиотеку.
- В классах, которые мы часто используем
- Мы хотим скрыть устаревшие коды или коды сторонней библиотеки с помощью шаблона Gateway
Формы использования
Таким способом мы можем создавать экземпляры классов, которые используются в приложениях автоматизации тестирования.
Свойства класса определены как только для чтения и не являются заданными операциями. Мы добавили отдельные методы для операции над множествами, и этот метод был назван более понятным в отношении бизнес-области. Затем мы делаем сам тип класса в качестве возвращаемого значения этого метода, чтобы создать цепочку методов, как вы можете видеть выше.
Давайте взглянем:
Мы можем использовать процесс, когда хотим выполнить любой процесс шаг за шагом. Например, вы разрабатываете приложение для автоматизации тестирования, и вам нужно будет запускать в нем тесты других платформ и сред. Вы разработаете библиотеку классов для этого. Здесь мы должны разработать наш код с беглым интерфейсом в этом случае. Фактически, эта библиотека является клиентом кода, и мы должны предоставить более читаемые классы.
public class TestProcessorOutput { public string ScreenTestOutputMessage { get; set; } public string StoredProcedureTestOutputMessage { get; set; } public string RunOutPutFileValidationTestOutputMessage { get; set; } public string RunInputFilevalidationTestOutputMessage { get; set; } } public interface ITestProcessor { ITestProcessor RunScreenTests(); ITestProcessor RunStoredProcedureTests(); ITestProcessor RunOutPutFileValidationTests(); ITestProcessor RunInputFilevalidationTests(); TestProcessorOutput TakeResults(); } public class TestProcessor : ITestProcessor { public TestProcessorOutput TestOutput { get; private set; } public TestProcessor(TestProcessorOutput testOutput) { this.TestOutput = testOutput; } public ITestProcessor RunScreenTests() { // testleri çalıştırır this.TestOutput.ScreenTestOutputMessage = ""; return this; } public ITestProcessor RunStoredProcedureTests() { // testleri çalıştırır this.TestOutput.StoredProcedureTestOutputMessage = ""; return this; } public ITestProcessor RunOutPutFileValidationTests() { // testleri çalıştırır this.TestOutput.RunOutPutFileValidationTestOutputMessage = ""; return this; } public ITestProcessor RunInputFilevalidationTests() { // testleri çalıştırır this.TestOutput.RunInputFilevalidationTestOutputMessage = ""; return this; } public TestProcessorOutput TakeResults() { return this.TestOutput; } } public static class FluentTestFactory { public static ITestProcessor Init() { return new TestProcessor(new TestProcessorOutput()); } } // using of it var testOutputs = FluentTestFactory .Init() .RunInputFilevalidationTests() .RunOutPutFileValidationTests() .RunScreenTests() .RunStoredProcedureTests() .TakeResults();
Давайте посмотрим на диаграмму классов нашего образца:
Популярные библиотеки, использующие принцип свободного интерфейса; Moq, Свободный NHibernate , FluentData, Nbuilder, Automapper, StructureMap. Вы увидите похожие примеры кода ниже
В результате, Fluent Interface был использован для создания лучшей кодовой базы, а также это лучший способ написать более читаемый код.
Вы можете найти помощь по этой теме в следующих ссылках
- http://www.martinfowler.com/bliki/FluentInterface.html
- http://russelleast.wordpress.com/tag/fluent-interfaces/
- http://www.youtube.com/watch?v=lVgz-DeTJhM
- http://www.youtube.com/watch?v=m63k7UOMweA
- http://visualstudiomagazine.com/articles/2013/11/01/when-to-build-fluent-interfaces-for-re-use-and-clarity.aspx
Он содержит примеры кода в github по этой теме. Я бы порекомендовал пересмотреть это.
Хорошего кодирования