"O número ideal de argumentos para uma função é zero" está totalmente errado. O número ideal de argumentos é exatamente o número necessário para permitir que sua função seja livre de efeitos colaterais. Menos do que isso e você desnecessariamente faz com que suas funções sejam impuras, forçando-o a se afastar do poço do sucesso e a subir o gradiente de dor. Às vezes, "Tio Bob" fica no local com seus conselhos. Às vezes, ele está espetacularmente errado. Seu conselho de zero argumentos é um exemplo deste último
( Fonte: comentário de @David Arno sob outra pergunta neste site )
O comentário ganhou uma quantidade espetacular de 133 votos positivos, e é por isso que eu gostaria de prestar mais atenção ao seu mérito.
Tanto quanto sei, existem duas maneiras distintas de programação: programação funcional pura (o que esse comentário é encorajador) e diga, não pergunte (o que de vez em quando também é recomendado neste site). AFAIK, esses dois princípios são fundamentalmente incompatíveis, próximos de serem opostos: o funcional puro pode ser resumido como "apenas retornar valores, não tem efeitos colaterais", enquanto dizer, não perguntar pode ser resumido como "não retornar nada, só tem efeitos colaterais ". Além disso, fico meio perplexo porque pensei que dizer, não perguntar era considerado o núcleo do paradigma OO, enquanto funções puras eram consideradas o núcleo do paradigma funcional - agora vejo funções puras recomendadas no OO!
Suponho que os desenvolvedores provavelmente devam escolher um desses paradigmas e cumpri-lo? Bem, devo admitir que nunca poderia me seguir. Muitas vezes, parece conveniente que eu retorne um valor e não consigo ver como conseguir o que quero alcançar apenas com efeitos colaterais. Muitas vezes, parece conveniente para mim ter efeitos colaterais e não consigo realmente ver como posso alcançar o que quero alcançar apenas retornando valores. Além disso, muitas vezes (acho que isso é horrível), tenho métodos que fazem as duas coisas.
No entanto, dessas 133 votações anteriores, estou raciocinando que atualmente a programação funcional pura está "ganhando", pois se torna um consenso que é superior dizer, não pergunte. Isso está correto?
Portanto, no exemplo deste jogo antipadrão, estou tentando fazer : Se eu quisesse fazê-lo estar em conformidade com o paradigma funcional puro - COMO ?!
Parece-me razoável ter um estado de batalha. Como este é um jogo baseado em turnos, mantenho os estados de batalha em um dicionário (multiplayer - pode haver muitas batalhas disputadas por muitos jogadores ao mesmo tempo). Sempre que um jogador faz a sua vez, eu chamo um método apropriado no estado de batalha que (a) modifica o estado de acordo e (b) retorna atualizações para os jogadores, que são serializados no JSON e basicamente apenas lhes diz o que aconteceu no jogo. borda. Suponho que isso viole flagrantemente os dois princípios e, ao mesmo tempo.
OK - eu poderia tornar um método RETURN um estado de batalha em vez de modificá-lo no lugar, se realmente quisesse. Mas! Terei de copiar desnecessariamente tudo o que está no estado de batalha para retornar um estado totalmente novo em vez de modificá-lo?
Agora, talvez, se o movimento é um ataque, eu poderia apenas retornar um personagem atualizado HP? O problema é que não é tão simples: regras de jogo, uma jogada pode e muitas vezes terá muito mais efeitos do que apenas remover uma parte do HP de um jogador. Por exemplo, pode aumentar a distância entre caracteres, aplicar efeitos especiais, etc.
Parece muito mais simples modificar o estado em vigor e retornar atualizações ...
Mas como um engenheiro experiente lidaria com isso?