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