Путаница и сложность кода — проблема в большинстве программных проектов. Особенно это хорошо видно в корпоративных проектах. Причиной этой путаницы может быть быстрое и незапланированное развитие, плохо спроектированная структура и неопределенная архитектура. Но мы должны это знать. Код по своей сути сложен. Мы можем написать код по принципу свободного интерфейса, чтобы сделать его более читабельным и понятным в этой сложной структуре, а в некоторых случаях — в кодах.
Свободный интерфейс
- Более обнаружимые и читаемые коды
- В коде есть информация о предметной области (на самом деле мы создаем мини-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 по этой теме. Я бы порекомендовал пересмотреть это.
Хорошего кодирования