Pergunta

Eu tenho que implementar Java.Polynomial como um trabalho escolar. Parte dos métodos são add (polinomial) , multiplicam (polinomial) etc.

No caso de algo como

p.add(q); // computes p + q

é melhor volta vazia e continuar a soma dos polinômios em p? ou é melhor para retornar um polinômio e manter o valor anterior de p intacta?

Meu instinto me diz que eu deveria fazer o seguinte

  • implementar p.add (q) como um método de 'destrutiva' ... ele adiciona q para o valor de p e armazena a soma de p
  • também implementar um método estático Polynomial.add (p, q), que retorna a soma dos polinômios.

O que você acha?

Foi útil?

Solução

Pessoalmente, eu realmente gosto de tipos imutáveis. Eu ia escrever p.plus(q) vez de p.add(q) e fazê-lo retornar um novo polinomial. Imutabilidade tem muita coisa para ele, não apenas em termos de thread-segurança (que soa como ele não vai ser um problema, neste caso), mas também em termos de raciocínio sobre seu código. É muito mais fácil de prever o que vai acontecer se você sabe que nada pode alterar o conteúdo de um objeto sob seus pés uma vez que você escondeu uma referência a ele.

Outras dicas

É uma questão de estilo. Geralmente é melhor (e "mais puro") quando os objetos são imutáveis ??de modo métodos não são "destrutiva" (eles não são mutantes, eles não têm efeitos colaterais), mas retornar uma nova instância com o novo valor.

A classe imutável mais conhecido é String.

"É melhor voltar um polinômio e manter o valor anterior de p intacta"

A vida é melhor se você fizer seus tipos numéricos se comportam como outros números.

As operações de "destrutivas" são um mal necessário quando você tem que otimizar o desempenho, reduzindo as alocações de memória.

A desvantagem é que o processamento se torna opaco por causa dos mais procura complexas-mudanças de estado nas variáveis. Você não quer mudança de estado oculto; Você quer suas atribuições de valores para as variáveis ??para ser um grande, de primeira classe óbvio, com-an- = tipo de coisa.

Então, todo mundo está dizendo que você deve torná-lo imutável, e a menos que haja razões muito específicas de desempenho para torná-lo mutável (não você estará adicionando um bilhão de polinômios a uma única magia e deseja fazer a alocação de memória), imutabilidade é o caminho a percorrer.

Se você tem motivos de desempenho genuínos, você pode querer ter um uma versão não-destrutivo destrutivo e, mas lembre-se - isso leva à confusão. Eu acho que a sua ideia de add sobrecarga para ser destrutivo ou não com base no arity vai tornar as coisas muito, muito confuso. Melhor fazer tudo o não-destrutivo e fazer um método addDestructive (poli p) se você escolher.

Mesmo se você fizer o método de "destrutivo", você vai querer voltar o novo valor de qualquer maneira para permitir a função de encadeamento. E, para o que vale a pena, quando confrontados com o mesmo problema para BigInteger e BigDecimal, Sun decidiu ir não-destrutivos.

Faça-o imutável, e fazer a interface o mesmo que para BigInteger (tanto quanto aplicável).

é melhor volta vazia e continuar a soma dos polinômios em p?

Não é ruim, não necessariamente melhor, quer.

ou é melhor para retornar um polinômio e manter o valor anterior de p intacta?

É melhor, menos surpresas e código mais fácil de entender e manter. (Embora você terá que criar mais variáveis)

Um polinômio tem um valor fixo, em termos de suas variáveis, e, portanto, ele só realmente faz sentido para que seja imutável. Retornar um novo polinomial para suas operações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top