Много визуального шума в коде. Как это исправить?

Мой код выглядит тривиально, обычная выборка и выдача ответа, но все как-то плохо. Слишком много визуального шума, читать такое разработчику другому, наверное, будет сложно. Поэтому вопрос: как красиво отрефакторить?

[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 шт):

Автор решения: aepot

Мне почему-то легче код читать, если круглые скобки не отделять пробелами.

Еще у вас "списочная" привычка. Используйте массив там, где не надо модифицировать полученный список. Он легче и работа с ним подлежит более мощным оптимизациям, даже на уровне компилятора.

Ну и мне обычные 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));
}

Дополнительно весь процесс можно разбить на именованные документированные методы.

→ Ссылка