Статьи

Свободный интерфейс для более читабельного кода

Путаница и сложность кода  — проблема в большинстве программных проектов. Особенно это хорошо видно в корпоративных проектах. Причиной этой путаницы может быть быстрое и незапланированное развитие, плохо спроектированная структура и неопределенная архитектура. Но мы должны это знать. Код по своей сути сложен. Мы можем написать код по принципу свободного интерфейса, чтобы сделать его более читабельным и понятным в этой сложной структуре, а в некоторых случаях — в кодах.

Свободный интерфейс

  • Более обнаружимые и читаемые коды
  • В коде есть информация о предметной области (на самом деле мы создаем мини-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 был использован для создания лучшей кодовой базы, а также это лучший способ написать более читаемый код.

Вы можете найти помощь по этой теме в следующих ссылках

Он содержит примеры кода в  github  по этой теме. Я бы порекомендовал пересмотреть это.

Хорошего кодирования