É melhor chamar uma função que não tenha um efeito nesse ponto, se ela melhorar a clareza do código?

60

Eu tenho três visualizações no meu programa (aplicativo iOS). Apenas um deles está ativo ao mesmo tempo, por isso, deixo a visibilidade para dois deles e mudo a visibilidade enquanto o usuário pressiona os botões. As visualizações são inicializadas como visíveis, portanto, defino a visibilidade no código antes da exibição principal.

Eu posso fazer

[view1 setAlpha:0.0f];
[view2 setAlpha:0.0f];

para duas das visualizações, mas agora a terceira (a que deve estar visível no início do aplicativo) não é abordada. Eu coloquei um

[view3 setAlpha:1.0f];

após os dois primeiros, porque acho que fica claro que há, de fato, três visões, e não duas, como se poderia pensar ao ver o código. Como outros programadores fazem isso? É puramente preferência ou existem algumas convenções?

Se a ligação for muito pesada, obviamente é melhor não ligar quando isso não for necessário, mas eu estava pensando em coisas pequenas como o meu exemplo.

    
por Kevin 17.08.2015 / 09:55
fonte

4 respostas

134

Você tem uma invariante:

Only a single view (out of 3) is ever active (and visible).

Em seguida, sugiro que você forneça uma função para alternar a atividade e a visibilidade de todas as visualizações de uma só vez:

[setActiveView viewID:2]

Esta função irá:

  • verifique se a visualização já está ativa, evitando trabalho desnecessário
  • define a exibição como ativa e visível
  • defina as outras duas visualizações como inativas e invisíveis

Tem várias vantagens sobre uma chamada bruta para setVisibility :

  • amigável: chamá-lo desnecessariamente não cria um problema de desempenho
  • defensiva: seu parâmetro único é muito mais difícil de ser alterado, enquanto para setVisibility é mais difícil lembrar que o intervalo de valores é 0.0f - 1.0f e que apenas um deve ser definido como 1.0f
  • resiliente: o próximo cara não pode esquecer acidentalmente uma das visualizações
  • adaptável: adicionar / remover uma visualização não exige examinar minuciosamente todo o código do aplicativo para descobrir onde estão os comutadores, uma única função (esta) precisa ser atualizada

Idealmente, para ajudar a impor a invariante, nenhuma outra função deve ser capaz de atrapalhar essa configuração ...

    
por 17.08.2015 / 11:48
fonte
12

Idéia alternativa: se seu objetivo é evitar que bugs ocorram porque as pessoas esquecem que há três visualizações e fazem algo com apenas duas delas, o que elas realmente deveriam fazer com todas elas, faça uma função que torne <<> impossível esquecer:

setViewVisibilities(0.0f, 0.0f, 1.0f)

Agora você tem algo muito mais poderoso - tempo de compilação garante que você não esqueceu . Se você esquecer um parâmetro, o compilador gritará com você. Isso é muito mais útil do que comentários ou código desnecessário, pois cria um protocolo nomeado restrito que impõe a propriedade que você gosta.

Para o caso em que view3 não precisa de visibilidade, você pode adicionar um comportamento em que passar um valor especial como -1.0 ou nil ou algo assim significa "não altere a visibilidade da exibição em absoluto". Isso contorna o problema de configurar visibilidades desnecessariamente.

    
por 17.08.2015 / 10:58
fonte
8

Acredito que adicionar um comentário explicando que a chamada é desnecessária (e por que) é melhor.

(talvez, o fato de uma chamada ser desnecessária, ou que você precise de um comentário sobre isso, possa ser um cheiro de código)

    
por 17.08.2015 / 09:56
fonte
4

Neste caso particular, @Mattieu M. tem a solução certa.

No caso mais geral, onde não há transformação similar, você tem que se perguntar: Existe qualquer chance de que um futuro programador possa bagunçar isso?

A resposta geralmente é sim. O que significa, sim, você deve adicionar a chamada. Talvez alguma versão futura do framework comece com todas as visualizações OFF em vez de ON.

    
por 18.08.2015 / 09:29
fonte