【问题标题】:Naming convention for fluent methods in C#? [closed]C# 中流利方法的命名约定? [关闭]
【发布时间】:2015-10-14 00:32:03
【问题描述】:

主要问题

流畅的 C# 方法是否有命名约定?我希望读者在看到方法的名称时知道方法遵循流畅的设计模式。

背景

我即将编写一个类类型,它使用许多流畅的方法来构建静态工厂式构造函数。例如,

Person bob = Person.New()
                   .Name("Bob")
                   .Age(30)
                   .Location("USA")
                   .MakeAwesome()
                   .PutACatOnHisHeadJustToScrewWithHim()
                   .MakeIntoStackOverflowExample();

我了解可选参数将是此过程的一种方法。例如,它可能是

Person bob = Person.New(
                         name : "Bob"
                       , age : 30
                       , location : "USA"
                       , isAwesome : true
                       , hasACatOnHisHeadJustToScrewWithHim : true
                       , isAStackOverflowExample : true
                   );

,但我更喜欢流畅的方法,因为命名参数方法更局限于单个方法调用,因此在构建后稍后将猫添加到 Bob 的头上不太实用。

由于该项目尚未采用流利的方法,因此我想以一种使其流利性质显而易见的方式来命名它们。我想fluent_AssertName 可以代替Name(),但这似乎很麻烦。目前我在想F_Name()

更新

虽然上面的示例是针对构造函数的,但我想在整个程序操作中使用这种流畅的方法。此外,流利的方法具有有序和允许冗余的优点。

Number x = Number.New(0)
                 .Add(1)
                 .Multiply(2)
                 .Subtract(1)
                 .Multiply(2)
                 ;
// ...other code that uses x...
x.Add(5)
 .Multiply(10);

在我的特定用例中,流畅的方法似乎是最好的。我只是在寻找一个明显的命名约定来反映这种设计模式。

【问题讨论】:

  • Fluent 方法经常与不可变类一起使用,你会走这条路吗?此外,我会避免使用F_Fluent... 为方法添加前缀。相反,流利的方法往往是动作或动词,例如SetValueSaveToList。无论哪种方式,这个问题(虽然是一个好问题!)因为它是基于意见的,所以对于 SO 来说是题外话。
  • 我猜你可以标记迁移它,但我可能会把它留在这里,然后去那里打开另一个。
  • 如果 P.SE 也关闭它,请不要回来对我大喊大叫 :)
  • @DavidG 关于命名的问题主要是基于意见的,将在 Programmers 处关闭,与这里一样:许多从这里迁移到那里的问题都遭受了这种命运。此外,除非您熟悉那里的主题,否则请不要推荐其他 SE 站点。请阅读:What goes on Programmers.SE? A guide for Stack Overflow.
  • 另外,请不要鼓励cross-posting

标签: c# naming fluent


【解决方案1】:

我不确定你是否真的需要流畅的方法,因为你可以通过这种方式简单地使用对象初始化器:

var person = new Person { Name= "Bob", Age= 30 };

但如果您需要流畅的方法,例如进行多次重载以将值分配给属性,例如使用 int、string 或 color 设置颜色,这里有一个选项:

基础构建器类:

public class Builder<T, TBuilder>
    where T: new()
    where TBuilder : Builder<T, TBuilder>, new()
{
    protected T model;
    protected Builder()
    {
        model = new T();
    }
    public static TBuilder New()
    {
        return new TBuilder();
    }
    public T Get()
    {
        return model;
    }
}

人员类别:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Person Builder 类:

public class PersonBuilder:Builder<Person, PersonBuilder>
{
    public PersonBuilder():base()
    {
    }
    public PersonBuilder Name(string name)
    {
        model.Name = name;
        return this;
    }

    public PersonBuilder Age(int age)
    {
        model.Age = age;
        return this;
    }
}

用法:

var p = PersonBuilder.New().Name("Bob").Age(30).Get();

【讨论】:

  • 虽然我绝对喜欢构建器模式,但在我的特定用例中,它似乎会抑制以后对bob 的流畅修改。例如,我希望稍后能够执行bob.PutACatOnHisHeadJustToScrewWithHim()
  • @ChemicalEngineer 为什么不使用对象初始化器?
  • 我对对象初始化器有两个反对意见:(1)仅限于构造; (2) 不能重复或按特定顺序执行嬗变(这是针对数学程序的)。诚实流畅的方法效果很好;我只是好奇是否有一个简单的命名约定可以让它们更容易阅读。
  • 切向问题:对象初始化器是否比问题中显示的命名可选参数方法有任何好处?还是对象初始化器基本上是命名可选参数的特定子集?
  • @ChemicalEngineer 假设您有一个具有 20 个属性的类,可能需要在构造函数中设置这些属性。您将为该类创建多少个构造函数?还是真的要创建一个有 20 个参数的方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多