C#中流畅方法的命名约定?

时间:2015-10-14 00:32:04

标签: c# naming fluent

主要问题

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

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

1 个答案:

答案 0 :(得分:3)

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

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