Много визуального шума в коде. Как это исправить?
Мой код выглядит тривиально, обычная выборка и выдача ответа, но все как-то плохо. Слишком много визуального шума, читать такое разработчику другому, наверное, будет сложно. Поэтому вопрос: как красиво отрефакторить?
[PermissionRequired( PermissionType.AuditReport, PermissionActionType.Read )]
[PermissionRequired( PermissionType.EventReport, PermissionActionType.Read )]
[DeliveryHandler( Name = ReportAPI.Commands.ReportsGet )]
protected async Task OnReportsGet( IDeliveryHandlerContext context,
ReportsGetArguments arguments )
{
IUserPrincipal currentOperator = context.Principal;
List<ReportDto> reports = ReportLogic.Get( arguments.IDs, currentOperator );
List<string> fileNames = reports
.Where( x => !string.IsNullOrWhiteSpace( x.FileName ) )
.Select( x => x.FileName )
.ToList();
List<FileUrl> fileUrls = fileNames.Any()
? ( await _fileManagerClient.FilesGetUrls( fileNames,
new RequestParameters { TraceID = context.TraceID } )
.UnwrapOrDefault() )?.Items
: null;
fileUrls.EmptyIfNull().ToList().ForEach( fileUrl =>
{
ReportDto report = reports.First( x => x.FileName == fileUrl.Name );
report.Link = fileUrl.Url;
} );
await context.Ok( new ReportsGetResponse( reports ) );
}
Ответы (1 шт):
Мне почему-то легче код читать, если круглые скобки не отделять пробелами.
Еще у вас "списочная" привычка. Используйте массив там, где не надо модифицировать полученный список. Он легче и работа с ним подлежит более мощным оптимизациям, даже на уровне компилятора.
Ну и мне обычные if и foreach кажутся более читабельными и позволяют избежать морзянки из ? ?? ??? ? ?? :)
protected async Task OnReportsGet(IDeliveryHandlerContext context, ReportsGetArguments arguments)
{
IUserPrincipal currentOperator = context.Principal;
List<ReportDto> reports = ReportLogic.Get(arguments.IDs, currentOperator);
string[] fileNames = reports
.Select(x => x.FileName)
.Where(x => !string.IsNullOrWhiteSpace(x))
.ToArray();
if (fileNames.Length > 0)
{
var parameters = new RequestParameters { TraceID = context.TraceID };
var info = await _fileManagerClient.FilesGetUrls(fileNames, parameters).UnwrapOrDefault();
if (info?.Items is List<FileUrl> items)
{
foreach (var fileUrl in items)
{
ReportDto report = reports.First(x => x.FileName == fileUrl.Name);
report.Link = fileUrl.Url;
}
}
}
await context.Ok(new ReportsGetResponse(reports));
}
Дополнительно весь процесс можно разбить на именованные документированные методы.