Lista longa de parâmetros versus lista de variáveis ​​de estado longo

10

Em um livro em C ++, o autor diz que não precisamos mais de uma função com uma longa lista de parâmetros porque a maioria dos parâmetros pode ser refatorada em variáveis ​​de estado em uma classe. Por outro lado, um livro de programação funcional diz que as variáveis ​​de estado são más porque causa efeitos colaterais que causam códigos propensos a erros e dificilmente paralelizados. Estou ficando confuso. O código deve evitar confiar tanto em variáveis ​​de estado quanto possível, movendo sua variável de estado para a lista de parâmetros de função?

TomCaps
fonte
O livro original comentando sobre C ++ era uma linguagem funcional?
Martin York

Respostas:

7

Depende se você estiver programando em um proceduralou functionalparadigma. Um estado mutável é necessário para o primeiro e incapacitante para o posterior. Isto é maçãs e laranjas. Ambos estão corretos em bailiwicks!

Você pode aplicar atribuição única e outras técnicas funcionais a linguagens procedimentais imperativas; o estado imutável torna a programação simultânea mais determinística, mas tornar quase todos os objetos imutáveis ​​em uma linguagem como Java ou C ++ é quase impossível porque seus modelos de memória não suportam facilmente esse paradigma.


fonte
:Obrigado! O livro << 97 coisas que todo programador deveria saber >> diz que devemos aplicar princípios de programação funcional, como evitar efeitos colaterais. Não podemos aplicar os princípios de programação funcional em um contexto de código imperativo?
TomCaps 19/09/11
Estado não é necessário para programação procedural. É comum, mas não obrigatório. O fato de ser comum se deve mais a hábitos do que qualquer outra coisa. Embora eu admita que certamente existem situações em que manter uma variável (state) por perto é mais fácil do que as alternativas (por exemplo, processamento assíncrono).
Marjan Venema
Nada @Marjan que tem variáveis imutáveis é o estado
@Jarrod: Agora você me confundiu. Lendo sua resposta novamente, vejo que perdi o "Mutável" em "O estado mutável é obrigatório". Mas seu comentário parece dizer que ter variáveis ​​imutáveis ​​é estado. Não entenda. Pode ser porque eu não estou acostumado a brincar e pensar em mutável e imutável nesses termos. Alguma referência (s) para eu ler?
Marjan Venema
@MarjanVenema: Sim, ter variáveis ​​imutáveis ​​é estado. A diferença no estado de manipulação entre programação procedural e funcional não é aquela proc.prog. tem estado e funcional não - pelo contrário, a diferença é que proc. prog. tem estado mutável , enquanto estado é sempre imutável na programação funcional (pura). Veja, por exemplo , en.wikipedia.org/wiki/Puring_functional , que explica que idiomas puramente funcionais evitam atualizações.
sleske
1

Se entendi bem sua pergunta, você está questionando que condições qualificam o uso de um parâmetro ou variável de classe / membro / campo / etc? Suponho que você esteja se referindo a um método, e não a uma função. Se for especificamente sobre C ++, sugiro que mova sua pergunta para o estouro de pilha.

Uma longa lista de parâmetros pode ser um sinal de que você pode precisar refatorar seu método para um conjunto de métodos mais granulares. Geralmente, o uso de parâmetros tornará seu código mais frouxamente acoplado. Não tenho mais certeza se isso é verdade para a maioria das linguagens OO modernas, mas a criação de objetos pode ser cara, especialmente se houver muitas variáveis ​​de classe envolvidas; portanto, se suas variáveis ​​de classe eram objetos e eram frequentemente referenciadas em um programa, elas podem ser justificadas como variáveis ​​de classe.

Além disso:

  • Outros métodos poderiam fazer uso das variáveis ​​de classe? Se sim, considere ir com variáveis ​​de classe.
  • O seu método é público? Se público, use parâmetros.
  • Sua lista de parâmetros pode ser representada adequadamente como um hash / mapa / array / coleção / lista / etc? Se sim, considere uma opção.
  • Seu método é estático? Se sim, use parâmetros.
Travis J
fonte
0

Não, as variáveis ​​de estado em si não causam efeitos colaterais.

Chamar um método setter (em uma estrutura de dados visível em outro lugar) é um efeito colateral.

Você pode ter estruturas de dados para ocultar longas listas de parâmetros e ainda evitar efeitos colaterais se construí-las adequadamente. Aqui está um pequeno exemplo (em Java, não testado):

class ManyParams {
    final String theName = null;
    final int    theAge = 0:
    ManyParams() {}
    ManyParams(String a, int b) { theName=a; theAge = b; }
    public withName(String n) {
        return new ManyParams(n, this.theAge);
    }
    public withAge(int i) {
         return new ManyParams(theName, i);
    }
}
/// to be used like this
foo(new ManyParams.withName("John").withAge(42));

Obviamente, o construtor de ManyParams ainda terá uma longa lista de parâmetros dessa maneira. Mas está escondido.

Ingo
fonte