Быстрые интерфейсы - объединение в цепочку метода

34
задан Cᴏʀʏ 13 October 2012 в 15:42
поделиться

8 ответов

Можно создать быстрый интерфейс в любой версии.NET или любого другого языка, который Объектно-ориентирован. Все, что необходимо сделать, создают объект, методы которого всегда возвращают сам объект.

, Например, в C#:

public class JohnBuilder
{
    public JohnBuilder AddSmartCode(string s)
    {
        // do something
        return this;
    }

    public JohnBuilder WithfluentInterface(string s)
    {
        // do something
        return this;
    }

    public JohnBuilder ButHow(string s)
    {
        // do something
        return this;
    }
}

Использование:

John = new JohnBuilder()
    .AddSmartCode("c#")
    .WithfluentInterface("Please")
    .ButHow("Dunno");
50
ответ дан Chris Pietschmann 27 November 2019 в 15:58
поделиться

Центральная идея позади создания быстрого интерфейса является одной из удобочитаемости - кто-то читающий код должен быть в состоянии понять то, что достигается, не имея необходимость рыть в реализацию для разъяснения деталей.

На современных языках OO, таких как C#, VB.NET и Java, объединение в цепочку метода является одним способом, которым это достигается, но это не единственная техника - два других являются классами фабрики и названными параметрами.

Примечание также, что эти методы не являются взаимоисключающими - цель состоит в том, чтобы максимизировать удобочитаемость кода, не чистоту подхода.

Метод, Объединяющий в цепочку

, ключевое понимание позади объединения в цепочку метода никогда не должно иметь метода, который возвращается пусто, но всегда возвращать некоторый объект, или чаще, некоторый интерфейс, который позволяет, чтобы дальнейшие вызовы были сделаны.

Вы не должны обязательно возвращать тот же объект, на котором метод назвали - то есть, необходимо не всегда "возвращать это";.

Один полезный метод проектирования должен создать внутренний класс - я всегда снабжаю суффиксом их "Выражение" - который представляет быстрый API, допуская конфигурацию другого класса.

Это имеет два преимущества - это сохраняет быстрый API в одном месте, изолированном от основной функциональности класса, и (потому что это - внутренний класс), это может переделать внутренности основного класса способами, которыми не могут другие классы.

можно хотеть использовать серию интерфейсов, управлять, какие методы доступны разработчику в определенный момент времени.

Классы Фабрики

Иногда Вы хотите создать серию связанных объектов - примеры включают API Критериев NHibernate, Носорога. Ограничения ожидания насмешек и NUnit 2.4's новый синтаксис.

В обоих из этих случаев, у Вас есть фактические объекты, которые Вы храните, но сделать их легче создать существуют классы фабрики, обеспечивающие статические методы произвести экземпляры, которых Вы требуете.

, Например, в NUnit 2.4 можно записать:

Assert.That( result, Is.EqualTo(4));

класс, статический класс, полный методов фабрики, которые создают ограничения для оценки NUnit.

На самом деле, для обеспечения погрешностей округления и другой неточности чисел с плавающей точкой можно определить точность для теста:

Assert.That( result, Is.EqualTo(4.0).Within(0.01));

(Извинения усовершенствования - мой синтаксис может быть выключен.)

Именованные Параметры

На языках, которые поддерживают их (включая Smalltalk и C# 4.0) названный параметрами, позволяют включать дополнительный "синтаксис" в вызов метода, улучшая удобочитаемость.

Считают гипотетическое Сохранение () методом, который берет имя файла и полномочия относиться к файлу после сохранения:

myDocument.Save("sampleFile.txt", FilePermissions.ReadOnly);

с именованными параметрами, этот метод мог быть похожим на это:

myDocument.Save(file:"SampleFile.txt", permissions:FilePermissions.ReadOnly);

или, более бегло:

myDocument.Save(toFile:"SampleFile.txt", withPermissions:FilePermissions.ReadOnly);
51
ответ дан Bevan 27 November 2019 в 15:58
поделиться

AFAIK, термин быстрый интерфейс не определяет определенную технологию или платформу, а скорее шаблон разработки. Википедия действительно имеет обширное пример быстрых интерфейсов в Cв™Ї.

В простом методе установщика, Вы не возвращаетесь void, но this. Тем путем можно объединить все в цепочку операторы на том объекте, которые ведут себя как этот. Вот быстрый пример на основе Вашего исходного вопроса:

public class JohnBuilder
{
    private IList<string> languages = new List<string>();
    private IList<string> fluentInterfaces = new List<string>();
    private string butHow = string.Empty;

    public JohnBuilder AddSmartCode(string language)
    {
        this.languages.Add(language);
        return this;
    }

    public JohnBuilder WithFluentInterface(string fluentInterface)
    {
        this.fluentInterfaces.Add(fluentInterface);
        return this;
    }

    public JohnBuilder ButHow(string butHow)
    {
        this.butHow = butHow;
        return this;
    }
}

public static class MyProgram
{
    public static void Main(string[] args)
    {
        JohnBuilder johnBuilder = new JohnBuilder().AddSmartCode("c#").WithFluentInterface("Please").ButHow("Dunno");
    }
}
16
ответ дан hangy 27 November 2019 в 15:58
поделиться

Быстрый интерфейс достигается в объектно-ориентированном программировании, всегда возвращая из Ваших методов тот же интерфейс, который содержит метод. Следовательно, можно достигнуть этого эффекта в Java, JavaScript и других любимых объектно-ориентированных языках, независимо от версии.

я нашел эту технику самой легкой выполнить с помощью интерфейсов:

public interface IFoo
{
    IFoo SetBar(string s);
    IFoo DoStuff();
    IFoo SetColor(Color c);
}

Таким образом, любой реальный класс, который реализует интерфейс, получает быстрый метод, объединяющий возможности в цепочку. FWIW.. Я записал вышеупомянутый код в C# 1.1

, Вы найдете эту технику замусоренной всюду по jQuery API

3
ответ дан Jeff Fritz 27 November 2019 в 15:58
поделиться

Несколько вещей приходят на ум, которые возможны в.Net 3.5/C# 3.0:

  1. , Если объект не реализует быстрый интерфейс, Вы могли бы использовать Дополнительные Методы для объединения в цепочку вызовов.

  2. Вы могли бы быть в состоянии использовать объектную инициализацию для моделирования быстрый, но это только работает во время инстанцирования и только работало бы на методы отдельного аргумента (где свойство является только методом set). Это кажется hackish мне, но там это.

Лично, я не вижу ничто плохого с использованием функционального объединения в цепочку, если Вы реализуете объект разработчика. Если объект разработчика имеет методы объединения в цепочку, это сохраняет объект, который Вы создаете чистый. Просто мысль.

1
ответ дан Jason Jackson 27 November 2019 в 15:58
поделиться

Это - то, как я создал свои так называемые быстрые интерфейсы или свой единственный forary в него

Tokenizer<Bid> tkn = new Tokenizer<Bid>();
tkn.Add(Token.LambdaToken<Bid>("<YourFullName>", b => Util.CurrentUser.FullName))
    .Add(Token.LambdaToken<Bid>("<WalkthroughDate>",
          b => b.WalkThroughDate.ToShortDateString()))
    .Add(Token.LambdaToken<Bid>("<ContactFullName>", b => b.Contact.FullName))
    .Cache("Bid")
    .SetPattern(@"<\w+>");

, Мой пример потребовал .net 3.5, но это - только причина моей лямбды. Поскольку Brad указал, что можно сделать это в любой версии .net. Хотя я думаю, что лямбда делает для более интересных возможностей, таких как это.

======

Некоторыми другими хорошими примерами является API Критериев nHibernate, существует также быстрое nhibernate расширение для конфигурирования nhibernate, но я никогда не использовал его

1
ответ дан JoshBerke 27 November 2019 в 15:58
поделиться

Dynamic keyword in C# 4.0 will make it possible to write dynamic style builders. Take a look at following article about JSON object construction.

0
ответ дан 27 November 2019 в 15:58
поделиться

Некоторое время назад у меня были те же сомнения, что и у вас сейчас. Я провел небольшое исследование и сейчас пишу серию сообщений в блоге о технологиях разработки свободного интерфейса.

Посмотрите на:

Рекомендации по разработке Fluent Interface в C #, часть 1

У меня есть раздел о цепочке X-вложенности, который может быть вам интересен.

В следующих постах я расскажу об этом более подробно.

С уважением,

Андре Вианна

5
ответ дан 27 November 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: