Como nomear uma variável quando a palavra é um substantivo e um verbo

46

Eu encontrei um problema com a orientação geral de:

  • substantivos para variáveis
  • verbos para funções
Especificamente, tenho um caso em que a palavra é ambígua - pode ser um verbo ou um substantivo. E, em alguns casos, quando estamos discutindo o aplicativo, serão usadas ambas maneiras na mesma frase.

Minha intenção é garantir que o programa permanecerá legível para futuros desenvolvedores, assim como para mim, quando eu retornar às seções de código meses depois.

Um dos exemplos é com battery . Um battery tem charge e você também pode charge() a bateria.

Acho que ter Battery.Charge e Battery.Charge(value) será confuso para futuros desenvolvedores.

Minha solução atual é simplesmente escolher uma palavra diferente para um ou ambos os casos (a variável e a função). Meu problema com essa abordagem é a variável e a função Battery do objeto para charge não se alinhar com discussões de design envolvendo o Battery .

Minha pergunta é se existe outra maneira melhor de lidar com esse conflito na convenção de nomenclatura?

Algumas leituras adicionais sobre o assunto. Nenhum realmente abordou o particular da minha pergunta.

por GlenH7 25.01.2013 / 20:40
fonte

7 respostas

38

Em situações semelhantes, procuro encontrar sinônimos. Neste caso eu usaria "recarregar" para o verbo. O "re" é um pouco redundante, mas o significado é claro. Usar a "carga" simples para a carga restante na bateria é ambígua porque não especifica nenhuma unidade física. Eu preferiria "availableAmpHours", "hoursUntilRecharge" ou algo similar. As unidades dependerão do que for conveniente para a aplicação.

Minha preferência pessoal é usar verbos apenas para funções que mudam de estado. Eu uso substantivos para funções não mutantes. Eu suponho que depende do seu ponto de vista. No nível da máquina, as funções não mutantes fazem alguma coisa, mas no nível do modelo, elas não.

    
por 25.01.2013 / 21:03
fonte
20

Apenas lançando isso para fora, mas talvez a solução para essa instância de ambiguidade de nomes seja remover completamente essa funcionalidade da bateria. Eu nunca vi uma bateria de carga automática e faria mais sentido para mim ter uma classe BatteryCharger. Isso ajudaria a manter suas preocupações mais dissociadas e tornar a ação mais explícita.

battery.Charge(50) vs batteryCharger.Charge(battery, 50)

Para mim, a segunda forma é muito mais compreensível e mantém todo o seu código "Carregando" em um único lugar, em vez de espalhá-lo por todas as suas classes de bateria.

    
por 26.01.2013 / 18:37
fonte
8

Evite Significados Duplos

Você selecionou deliberadamente uma palavra com mais de um significado e essa primeira decisão é o problema. Há uma tonelada de palavras que são problemáticas para os programadores. Outro exemplo seria phone . Você pode phone alguém, ou você pode ter um phone no seu bolso.

Use Getters e Setters

A nomenclatura padrão para a maioria dos objetos é o método getters / settings para propriedades.

Battery.Charge            // would be a property
Battery.setCharge(value)  // would set the property
Battery.getCharge()       // would get the property

Propriedades são estados não substantivos

Acho que você está enganado ao classificar as propriedades do objeto como substantivos e as variáveis também podem ser consideradas estados. São estados relevantes para o escopo local de sua existência.

Você poderia descrever o valor que eles têm como substantivo, mas não tenho certeza se isso é verdade em todos os casos.

Nas propriedades do objeto de terminologia OOP descrevem o estado desse objeto. No seu caso, o Battery é um objeto, e é Charge é um estado. Então, isso seria uma propriedade do objeto, mas isso depende do contexto de como é usado.

Se você precisa ser capaz de Charge da bateria e também saber qual é a% atual deCharge, então você tem um problema.

Usando o escopo para reforçar o contexto

Contexto é o que irá esclarecer qual o significado de uma palavra que você pretende que um método ou propriedade transmita. O escopo está definindo a acessibilidade de uma propriedade / método de fora do objeto.

Batter._charge            // a hidden private property
Battery.setCharge(value)  // would set the private property
Battery.getCharge()       // would get the private property
Battery.Charge()          // would perform the Charge action

Métodos são verbos

Você pode descrever o método de um objeto como um verbo, mas a ação da palavra é mais adequada. Na terminologia OOP, você executa ações sobre objetos usando seus métodos. É uma má forma modificar a propriedade de um objeto de fora do objeto. É preferível chamar um método que execute as ações necessárias para alterar o estado.

A palavra Charge é um verbo, mas também é um substantivo. Quando usado para chamar o método de uma ação, fica claro que o verbo está sendo usado Battery.Charge(....) .

Mas o contexto é muito importante. Embora a palavra Charge() seja um verbo, ela não é tão significativa quanto startCharging() .

Os métodos válidos para Battery podem incluir Charging , Discharging , setCharge , getCharge , hasCharge , Discharge e Charged .

Métodos simples de uma palavra geralmente não explicitam claramente suas ações, mas há alguns casos como open e close em que é necessária pouca explicação.

Portanto, não há realmente uma resposta correta sobre como nomear esses tipos de propriedades / métodos. Exceto que você precisa usar as técnicas acima com sabedoria para garantir que não haja confusão.

    
por 26.01.2013 / 20:10
fonte
6

Pré-os com verbos que os tornarão um verbo ou um substantivo.

Battery.doCharge()

Battery.getCharge()
    
por 31.01.2013 / 20:53
fonte
4

Para o caso do verbo, acho que Charge está OK. Para o caso substantivo, getCurrentChargeLevel funcionaria para você?

    
por 25.01.2013 / 20:43
fonte
0

Na maioria dos casos, adicionar um verbo, um advérbio ou um adjetivo auxiliar é bom o suficiente para distingui-los e ajudar na compreensão. Com o seu caso de Carga e Carga () em uma bateria, fazendo com que DeltaCharge () possa mostrar que é uma função que pode ser usada para carregar ou descarregar.

Delta (nos casos em que há uma mudança, mas ambígua) é um modificador que eu uso e recomendo aos outros o tempo todo para entregar a mudança no estado (mesmo que o verbo seja meio óbvio).

    
por 25.01.2013 / 22:45
fonte
0

Notação húngara para o resgate. Você pode ter intCharge e fcnCharge(value) , evitando confusão e não adicionando um nome longo louco quando três letras vão funcionar bem.

Ou você pode usar o mesmo nome e deixar o IDE lidar com isso. Criar um nome mais longo ou diferente pode ser confuso a longo prazo.

    
por 25.01.2013 / 22:54
fonte