Cada vez mais está caindo o conceito de código limpo. e aqui vou fazer algumas críticas ao seu código:
/**
* Calcula o valor total de um pedido com base nos seus itens.
* @param items - Um array de itens do pedido.
* @returns O valor total calculado.
*/
function calculateOrderTotal(items: OrderItem[]): number {
return items.reduce((sum, item) => sum + item.price * item.quantity, 0);
}
Esse comentário é totalmente desnecessário.
function calculateOrderTotal(items: OrderItem[]): number {
return items.reduce((sum, item) => sum + item.price * item.quantity, 0);
}
Somente o código sozinho já deixa claro o que o método está fazendo.
A assinatura da função dispensa completamente o uso do comentário, dá pra entender completamente o que é feito.
Em um projeto eu vou perder 5 a 10 minutos comentando todas as funções? Jamais.
Agora trago exemplos de casos reais:
public SignContractService(
SignContractRepository scRepository,
ValidationResponseTransformer transformer,
OracleObjectStorageService oracleOsService,
UploadService uploadService,
ContractRenderPdfService contractRenderPdfService,
CompanySignatureRepository companySignatureRepository,
AppDbContext dbContext)
{
this.scRepository = scRepository;
this.transformer = transformer;
this.oracleOsService = oracleOsService;
this.uploadService = uploadService;
this.contractRenderPdfService = contractRenderPdfService;
this.companySignatureRepository = companySignatureRepository;
this.dbContext = dbContext;
}
public async Task<DefaultResponseDTO> SignContract(
Guid eventId,
Guid eventRoleCollaboratorId,
Guid contractId,
SignContractDTO signContractDTO)
{
var roleInvalid = await dbContext.CollaboratorEventRoles
.Where(cer => dbContext.EventRoleCollaborators
.Where(erc => erc.CollaboratorId == cer.CollaboratorId)
.Where(erc => erc.EventEventRole.EventRoleId == cer.EventRoleId)
.Any(erc => erc.Id == eventRoleCollaboratorId)
).AnyAsync(cer => cer.Status != Enums.Collaborator.CollaboratorEventRoleStatus.Active);
if (roleInvalid) return transformer.GenerateDefaultErrorResponse("Cargo com pendências, não é possível assinar o contrato");
var contract = await scRepository.GetContractAsync(eventRoleCollaboratorId, contractId);
if (contract == null) return transformer.GenerateDefaultErrorResponse("Contrato não encontrado");
var signaturePath = $"event/{eventId}/collaborator/{eventRoleCollaboratorId}/contract/{contractId}/signature.png";
var contractPath = $"event/{eventId}/collaborator/{eventRoleCollaboratorId}/contract/{contractId}/contract.pdf";
await oracleOsService.MoveFile(
uploadService.GetUploadPath(signContractDTO.signatureId),
signaturePath
);
var collaboratorSignature = await oracleOsService.DownloadFile(signaturePath);
if (collaboratorSignature == null) return transformer.GenerateDefaultErrorResponse("Erro ao baixar a assinatura do colaborador");
var currentCompanySignature = await companySignatureRepository.GetCurrentSignature();
if (currentCompanySignature == null) return transformer.GenerateDefaultErrorResponse("A assinatura da empresa não está cadastrada");
var companySignature = await oracleOsService.DownloadFile(currentCompanySignature.Path);
if (companySignature == null) return transformer.GenerateDefaultErrorResponse("Erro ao baixar a assinatura da empresa");
var pdfBytes = await contractRenderPdfService.RenderContract(contract, eventRoleCollaboratorId, collaboratorSignature, companySignature);
if (pdfBytes == null) return transformer.GenerateDefaultErrorResponse("Erro ao gerar o PDF do contrato");
var uploaded = await oracleOsService.UploadFile(contractPath, pdfBytes, "application/pdf");
if (!uploaded) return transformer.GenerateDefaultErrorResponse("Erro ao salvar o contrato assinado");
var signedContractModel = new EventRoleCollaboratorContract
{
EventRoleCollaboratorId = eventRoleCollaboratorId,
ContractModelId = contractId,
signatureImgPath = signaturePath,
signedContractPath = contractPath,
};
await scRepository.AddEventRoleCollaboratorContract(signedContractModel);
return new DefaultResponseDTO();
}
Tamanho Ideal: Idealmente, uma função não deve ultrapassar 15-20 linhas. Se uma função está ficando longa, provavelmente está fazendo demais.
Essa função está gigante: Validando entrada do usuário, comunicando com 3 serviços, comunicando com 2 repositórios, fazendo query, salvando.
Te desafio a refatorar ela com Clean Code!
Vai ficar péssimo! ela está legível, cumpre o que faz, você que nunca viu o código sabe o que ela faz!
Considerações pessoais
É bom saber clean code? SIM!
Devemos levar ao pé da letra? Não!
Devemos saber quando quebrar a regra!