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

60

Eu tenho três visualizações no meu programa (aplicativo iOS). Somente um deles está ativo ao mesmo tempo, então desativo a visibilidade para dois deles e alterno a visibilidade conforme o usuário pressiona os botões. As visualizações são inicializadas como visíveis, então desativei 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 existem de fato três visualizações, e não duas como se poderia pensar ao ver o código. Como outros programadores fazem isso? É pura preferência ou existem algumas convenções?

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

Kevin
fonte

Respostas:

134

Você tem um invariável:

Somente uma única visualização (de 3) está ativa (e visível).

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
  • defina a visualização como ativa e visível
  • defina as outras 2 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
  • defensivo: seu único parâmetro é muito mais difícil de arruinar, enquanto setVisibilityque é mais difícil lembrar que a faixa de valores é 0.0f - 1.0fe que apenas um deve ser definido como1.0f
  • resiliente: o próximo cara não pode esquecer acidentalmente uma das vistas
  • adaptável: adicionar / remover uma visualização não requer análise de todo o código do aplicativo para descobrir onde estão os comutadores, uma única função (essa) precisa ser atualizada

Idealmente, para ajudar a impor a invariável, nenhuma outra função deve ser capaz de mexer com essa configuração ...

Matthieu M.
fonte
Ótima sugestão. Eu vou fazer isso com o meu exemplo atual. Mas e quando esse projeto não é possível / desejado? Ou você decide no local qual é a melhor maneira de lidar com isso?
Kevin
4
@ Kevin: Depende realmente. Às vezes, você pode resolver o problema repetindo uma coleção, às vezes não, mas o princípio principal é evitar a duplicação e facilitar a preservação de invariantes. Quanto mais ações "manuais" precisam ser lembradas para que as coisas funcionem corretamente, menos chances você tem de que as coisas funcionem corretamente. Detesto ser vago aqui, mas há tantas situações diferentes que receio que uma regra "genérica" ​​apenas o desvie.
Matthieu M.
23
"facilitar a preservação de invariantes" é uma regra genérica que vale a pena lembrar.
Gusdor
11
@ Tony: Não sei se o incentivo ao uso de uma variável global está "fazendo o certo", mas, de fato, se você sabe exatamente o que estava ativo antes, precisa apenas atualizar duas visualizações. Outra solução é que cada visualização lembre-se de sua visibilidade e setVisibilitynão faça nada se a visibilidade já for a solicitada, o que reduz a responsabilidade.
Matthieu M.
11
@MatthieuM. Eu escrevi às pressas, mas na verdade é o que eu quis dizer também. Se você conhece o estado anterior, é necessário atualizar apenas 2 no máximo. Como se lembrar desse estado é outra questão ;-). Quanto a diminuir a responsabilidade: se a classe de exibição não fornecer isso, você precisará agrupar a classe em outro objeto apenas para adicionar essa propriedade. Essa é uma solução limpa, mas talvez um pouco exagerada.
quer
12

Idéia alternativa: se seu objetivo é impedir a ocorrência de erros, porque as pessoas esquecem que há três visualizações e fazem algo com apenas duas delas que realmente deveriam fazer com todas elas, então crie uma função que torne impossível esquecer:

setViewVisibilities(0.0f, 0.0f, 1.0f)

Agora você tem algo muito mais poderoso - o 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ódigos desnecessários, pois cria um protocolo nomeado estrito que reforça a propriedade com a qual você se importa.

No caso em view3que não é necessário alterar a visibilidade, você pode adicionar um comportamento em que a passagem de um valor especial como -1.0ou nilou algo nesse sentido significa "não alterar a visibilidade da visualização". Isso contorna o problema de definir visibilidades desnecessariamente.

Jack
fonte
9
Se o OP tiver mais de 10 visualizações, será impossível manter um parâmetro por visualização. Seu ponto de vista sobre erros em tempo de compilação está correto, mas esta é uma solução muito insustentável, infelizmente.
Chris Cirefice
3
@ ChrisCirefice: se o número de visualizações aumentar, você poderá criar algum tipo de objeto / classe "ViewState", o que impõe essa invariante. Em seguida, use isso para alternar etc. Com tantas visualizações, algum tipo de objeto gerente provavelmente faz sentido de qualquer maneira.
sleske
8

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

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

Basile Starynkevitch
fonte
11
@ Niall Se possível, uma afirmação seria ainda melhor que um comentário.
200_success 17/08/2015
9
Os comentários são não a solução para código insustentável e ilegível
dj18
2
@ Kevin ou você pode escrever um código perfeitamente legível sem comentários.
Jan
11
@Jan Os comentários são mais do que apenas explicando o código faz .......
Kevin
2
@ Kevin Eu diria que nunca devem existir comentários para explicar o que o código faz, mas para explicar por que ele está fazendo isso. E nessas situações, muitas vezes um refator consegue transmitir a intenção sem precisar do comentário (que parece o ponto de Jan).
precisa saber é o seguinte
4

Nesse caso específico, @Mattieu M. tem a solução certa.

No caso mais geral, onde não há transformação semelhante, você deve se perguntar: existe alguma chance de um futuro programador estragar isso?

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

Stig Hemmer
fonte