c#中流畅方法的命名约定

本文关键字:命名约定 方法 | 更新日期: 2023-09-27 18:17:38

主要问题

是否有流畅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);

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

c#中流畅方法的命名约定

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

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

Person类:

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