Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C#3编写流畅界面的技巧_C#_Design Patterns_Fluent Interface - Fatal编程技术网

用C#3编写流畅界面的技巧

用C#3编写流畅界面的技巧,c#,design-patterns,fluent-interface,C#,Design Patterns,Fluent Interface,我想了解一些关于C#中流畅接口的好技巧。我自己也只是在学习,但我很想听听别人在我读的文章之外的想法。我特别关注: 什么时候说得太流利了 有流畅的模式吗 C#中有什么使fluent接口更流畅(例如扩展方法) 复杂的fluent界面仍然是fluent界面吗 重构以获得流畅的接口或重构现有的流畅接口 有没有你曾经合作过或可以推荐的好例子 如果你能在每篇文章上发表一条建议或想法,或者其他任何东西。我也想看看他们是如何投票的 提前谢谢你。关于你的第四点 是的,我认为一个复杂流畅的界面仍然可以流畅 我认为流

我想了解一些关于C#中流畅接口的好技巧。我自己也只是在学习,但我很想听听别人在我读的文章之外的想法。我特别关注:

  • 什么时候说得太流利了
  • 有流畅的模式吗
  • C#中有什么使fluent接口更流畅(例如扩展方法)
  • 复杂的fluent界面仍然是fluent界面吗
  • 重构以获得流畅的接口或重构现有的流畅接口
  • 有没有你曾经合作过或可以推荐的好例子
  • 如果你能在每篇文章上发表一条建议或想法,或者其他任何东西。我也想看看他们是如何投票的

    提前谢谢你。

    关于你的第四点

    是的,我认为一个复杂流畅的界面仍然可以流畅

    我认为流畅的界面有点折衷。(虽然这是一个很好的方法!)有很多关于使用自然语言进行编程的研究,但通常自然语言不够精确,无法表达程序

    流畅的接口被构造成像编程语言一样编写,只允许用自然语言表达的一小部分内容,但它们的阅读方式像自然语言一样

    例如,如果您查看rhino Mock,与普通库相比,编写部分非常复杂。我花了更长的时间学习,主要是因为流畅的界面,但它使代码更容易阅读。因为程序通常只编写一次,而读取的次数远远不止一次,所以这是一个很好的折衷方案


    因此,我想稍微说明一下我的观点。书写复杂但易于阅读的流畅界面仍然可以流畅。

    关于第二和第三个问题

    我注意到了三种流畅的模式

    第一个使用using语句(C#2.0)在特定上下文中运行代码,例如:

    using(var transaction = new Transaction())
    {
      // ..
      // ..
    }
    
    这将使用事务的构造函数和处理器来设置事务,然后在此上下文中运行代码

    第二种方法的效果几乎相同,但对于lambda的方法,这在犀牛模仿中被大量使用

    (new Transaction()).Run( () => mycode(); );
    
    最著名的fluent接口是使用返回类型来链接方法调用。大多数方法都会返回该值,以便可以在同一对象上链接调用。但是,您也可以根据调用的方法返回不同的对象来更改上下文。如果您有一个只能在事务中运行的对象(抱歉,我想不出另一个示例),您可以给它一个StartTransaction方法,该方法返回一个初始化的事务,您可以在其中运行call run和stoptransaction,伪代码为:

    class Runner
    {
      Transaction StartTransaction()
      {
        return new Transaction(this);
      }
    }
    
    class Transaction
    {
      Transaction Run()
      Transaction StopTransaction()
    }
    
    电话在哪里

    var runner = new Runner();
    runner
      .StartTransaction()
      .Run()
      .StopTransaction();
    

    当然,您需要添加各种错误处理等。

    作为流畅界面的消费者,我所经历的最大挑战是,大多数界面都不是真正流畅的界面,而是我通常称之为“清晰界面”的实例

    流畅的界面意味着它的主要目标是使其易于说话,而易读的界面意味着它的主要目标是易于阅读。大多数流畅的界面往往很难编写代码,但反过来,很容易被其他人阅读

    Assert().That().This(actual).Is().Equal().To(expected).
        Except().If(x => x.GreaterThan(10));
    

    …比实际编写代码更容易阅读

    在使用继承和流畅接口时,您会遇到麻烦,因为使用多态方法会破坏调用链,您肯定不想在不需要的地方使用难看的强制转换和偏执,从而使接口变得不流畅。 我写了一篇关于一种模式的文章,该模式为您提供了一种使用泛型构建器和带有泛型约束的泛型扩展方法的解决方案:
    Moq隐藏了equals、
    ToString等未被引用的方法,以使其流畅的界面更易于使用


    这篇文章解释了这样做的好处

    我也在学习如何在工作中为一个小应用程序编写一个流畅的界面。我四处询问并研究了一下,发现编写流畅界面的一个好方法是使用“构建器模式”,请阅读更多关于它的信息

    本质上,我就是这样开始我的事业的:

    public class Coffee
    {
        private bool _cream;
        private int _ounces;
    
        public Coffee Make { get new Coffee(); }
    
        public Coffee WithCream()
        {
            _cream = true;
            return this;
        }
    
        public Coffee WithOuncesToServe(int ounces)
        {
            _ounces = ounces;
            return this;
        }
    }
    

    这是一篇关于在流畅的界面中实现闭包的交叉帖子。

    不久前,我曾有过与您现在同样的疑问。我已经做了一些研究,现在我正在写一些帖子来帮助解决这些问题

    查看我的博客:

    在下面的帖子中,我将介绍你提到的每一点

    致意
    AndréVianna

    一件事是,你必须考虑英语语法的形态,并确保你没有在下面引入未记录的顺序耦合

    // Snarky employees get a raise.
    employees.WhereSnarky().GiveRaise();
    
    vs


    犀牛模仿就是一个很好的例子。还有,喜欢你对什么是好的看法。我认为流畅的界面,无论是否公开,都是为用户、其他程序员等提供易于使用的界面。所以复杂性带来的痛苦并不全是坏事。这篇文章不错。我试试看。文章链接好像变了。现在看来:这里有一个提示:发现性和简单性比fluentapi在大多数情况下提供的少量增加的可读性要重要得多。像LinQ(synatax的方法)那样流畅,用C语言构建一个流畅的DSL只是创建了一个不可能理解的API。它真的比普通的
    actual==expected | actual>10
    更容易阅读吗?链接已经失效;这是一个很好的例子,说明了为什么不推荐只链接的答案。我想这是你吧?:这是最新的
    // Depending on implementation, everyone may get a raise.
    employees.GiveRaise().WhereSnarky();