Как корректно перенести цепочку методов на разные строки?
Стандартной практикой в LINQ является запись методов "цепочкой" - один за другим, каждый метод на своей строке:
var nodes = Enumerable
.Range(0, nodesCount)
.Select(z => new Node(z))
.ToArray();
Помимо LINQ, подобный подход применяется и для цепочки вызовов обычных методов, для упрощения чтения и восприятия и уменьшения длины строки. Однако с ними уже не все так логично и интуитивно, как с LINQ, на мой взгляд.
Прошу подсказать, как, к примеру, разложить следующую цепочку на 3-4 строки:
return CreateFromCsFiles(OpenFileHelper.OpenCodeFile(File.ReadAllText(pathToCsprojFile)).ToArray());
Как ни пробовал, все равно получается каша. Заранее спасибо!
Ответы (1 шт):
Можно ввести дополнительные переменные:
var text = File.ReadAllText(pathToCsprojFile);
var array = OpenFileHelper.OpenCodeFile(text).ToArray();
return CreateFromCsFiles(array);
В некоторых языках есть специальный оператор конвейера - pipe operator. Например, в F# таким является |>
. Если интересно, можно посмотреть его применение в документации.
За неимением такового, в C# можно сделать метод расширения.
public static class PipeExtension
{
public static TOut Pipe<TIn, TOut>(this TIn input, Func<TIn, TOut> fn)
{
return fn(input);
}
}
Код взят из доклада Pipeline Oriented Programming (pdf по ссылке), ScottWlaschin. Есть и видео от автора с таким же названием.
С его помощью код можно записать так:
return File.ReadAllText(pathToCsprojFile)
.Pipe(OpenFileHelper.OpenCodeFile).ToArray()
.Pipe(CreateFromCsFiles);