C#中fluent方法的命名约定? 主要问题

C#中fluent方法的命名约定? 主要问题,c#,naming,fluent,C#,Naming,Fluent,fluent C#方法是否有命名约定?我想让读者知道,当看到方法名称时,方法遵循fluent设计模式 背景 我将要编写一个类类型,它使用许多fluent方法来构建静态工厂样式的构造函数。比如说, Person bob = Person.New() .Name("Bob") .Age(30) .Location("USA")

fluent C#方法是否有命名约定?我想让读者知道,当看到方法名称时,方法遵循fluent设计模式

背景 我将要编写一个类类型,它使用许多fluent方法来构建静态工厂样式的构造函数。比如说,

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
                   );
,但我更喜欢fluent方法,因为命名参数方法更多地局限于单个方法调用,这使得在构建之后向Bob的头部添加cat变得不太实际

因为这个项目还没有使用fluent方法,所以我想用一种明显的方式来命名它们。我认为
fluent\u AssertName
可以代替
Name()
,但这似乎很麻烦。目前我正在考虑
F_Name()

更新 虽然上面的示例是针对构造函数的,但我希望在整个程序操作过程中使用这种流畅的方法。此外,fluent方法的优点是可以订购并允许冗余

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

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

我不确定您是否真的需要fluent方法,因为您可以通过以下方式简单地使用对象初始值设定项:

var person = new Person { Name= "Bob", Age= 30 };
但是,如果您需要fluent方法,例如为属性赋值而进行多个重载,例如使用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; }
}
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();
人员生成器类:

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; }
}
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();

Fluent方法通常用于不可变类,您是否也这样做?另外,我会避免使用
F\uuu
Fluent…
作为方法的前缀。相反,流畅的方法往往是动作或动词,如
SetValue
Save
ToList
。不管怎样,这个问题(虽然是个好问题!)都是离题的,因为它是基于观点的。我想你可以标记迁移它,但我可能会把它放在这里,然后打开那边的另一个。如果P.SE也关闭它,请不要回来对我大喊大叫:)@DavidG有关命名的问题主要是基于观点的,将在程序员那里关闭,与这里相同:从这里迁移到那里的许多问题都遭遇了这种命运。此外,请不要推荐其他SE站点,除非您熟悉该主题。请阅读:。另外,请不要鼓励。虽然我确实喜欢生成器模式,但在我的特定用例中,它似乎会阻止以后对
bob
的流畅修改。例如,我希望以后能够执行
bob.putacatonishheadjusttocrewWithhe()
。@ChemicalEngineer为什么不使用对象初始值设定项?我对对象初始值设定项有两个反对意见:(1)使用受限于构造;(2) 不能重复或按特定顺序执行变形(这是一个数学程序)。诚实流畅的方法很有效;我只是好奇是否有一个简单的命名约定使它们更容易阅读。切题:对象初始值设定项比问题中显示的命名可选参数方法有什么好处?或者对象初始值设定项基本上是命名可选参数的特定子集吗?@ChemicalEngineer假设您有一个类,该类具有20个属性,可能需要在构造函数中设置这些属性。您将为该类创建多少个构造函数?或者你真的想创建一个有20个参数的方法?