这种方法链接在C#中会受到反对吗

本文关键字:方法 链接 | 更新日期: 2023-09-27 18:01:09

假设我有这个代码:

Foo foo = new Foo();
foo.Bar();

这样做会被认为是不好的做法吗?

new Foo().Bar();

这种方法链接在C#中会受到反对吗

我经常看到。它来自于我将大型方法重构为类的习惯。我最后只是打电话给:

new ClassThatWasAMethod(initialization, variables, here).PerformAction();

有一种叫做德米特定律的东西,它说你在那里所做的一切都太"健谈"了。即:

new Foo().Bar().Baz(); // potentially more

但是,一个名字不好的"法律"并不意味着这一点。也就是说,你不会因为不遵守该准则而入狱。

这很常见。

流体接口。你可以从任何地方采样新的up对象——严格用于副作用的函数通常不受欢迎,因为它们很难推理。通常,它要么从现有对象开始,要么修改其属性:

getMyItem(itemId).Width(42).Height(33).Open();

或者构建一些项目:

var result = new Builder().Width(42).Height(44).Create();

另一个例子是LINQ——您链接许多查询以获得结果——同样,您通常使用结果,但可能只是用于副作用。

从某些东西开始并使用结果

var filteredSquares = myArray.Select(x => x * x).Where(r => r < 1000); 

严格副作用(忽略结果(:

Enumerable.Range(1,10).Select(x => x * x).Aggregate(0, (c,x)=> 
    {
       Console.Write(x); // side effect
       return 0; // to make Aggregate happy
    });

我发现这是一个很好的实践。

重构技术之一是,只要意图明显,只要只使用一次,就可以删除中间变量。

只有当表达式变得复杂时才引入变量。该变量有助于代码实现自我文档化。

IPizza hawaiianPizza = new PizzaBuilder()
    .AddCheese()
    .AddMushroom()
    .AddPineapples();

如果没有将任何状态传递给构造函数,那么该方法很可能是静态的,然后调用可能不会引起任何质疑。