Eu suspeito que não vou dar uma olhada nessa questão, mas sou muito programador experiente e espero que alguns dos leitores mais abertos prestem atenção.
Acredito que ele se adapte melhor às linguagens de programação orientadas a objetos para que seus procedimentos de retorno de valor (VRPs) sejam determinísticos e puros.
'VRP' é o nome acadêmico moderno para uma função que é chamada como parte de uma expressão e tem um valor de retorno que substitui nocionalmente a chamada durante a avaliação da expressão. Por exemplo, em uma declaração como x = 1 + f(y)
a funçãof
está servindo como um VRP.
'Determinístico' significa que o resultado da função depende apenas dos valores de seus parâmetros. Se você chamá-lo novamente com os mesmos valores de parâmetro, certamente obterá o mesmo resultado.
'Puro' significa sem efeitos colaterais: chamar a função não faz nada, exceto calcular o resultado. Isso pode ser interpretado como significando que não é importante efeitos colaterais , na prática; portanto, se o VRP emitir uma mensagem de depuração toda vez que for chamado, por exemplo, isso provavelmente poderá ser ignorado.
Portanto, se, em C #, sua função não é determinística e pura, eu digo que você deve torná-la uma void
função (em outras palavras, não um VRP), e qualquer valor que ele precise retornar deve ser retornado em um out
ou em um ref
parâmetro.
Por exemplo, se você tem uma função para excluir algumas linhas de uma tabela de banco de dados e deseja que ela retorne o número de linhas excluídas, deve declarar algo assim:
public void DeleteBasketItems(BasketItemCategory category, out int count);
Se, às vezes, você quiser chamar essa função, mas não obtê-la count
, sempre poderá declarar uma sobrecarga.
Você pode querer saber por que esse estilo combina melhor com a programação orientada a objetos. Em termos gerais, ele se encaixa em um estilo de programação que pode ser (um pouco impreciso) denominado 'programação procedural', e é um estilo de programação procedural que se encaixa melhor na programação orientada a objetos.
Por quê? O modelo clássico de objetos é que eles têm propriedades (também conhecidas como atributos), e você interroga e manipula o objeto (principalmente) lendo e atualizando essas propriedades. Um estilo de programação procedural tende a facilitar isso, porque você pode executar código arbitrário entre operações que obtêm e configuram propriedades.
A desvantagem da programação processual é que, como você pode executar código arbitrário em todo o lugar, pode obter algumas interações muito obtusas e vulneráveis a erros por meio de variáveis globais e efeitos colaterais.
Portanto, de maneira simples, é uma boa prática sinalizar para alguém que está lendo seu código que uma função pode ter efeitos colaterais, tornando-a sem retorno de valor.