Convenção de nomenclatura a ser usada para parâmetros de função C #

14

Há situações em que um nome passado no parâmetro será convertido em um novo tipo, mas o nome do objeto passado deve permanecer semelhante. Para o caso de atributos de classe, podemos usar esse operador, mas e a variável local em funções. Qual convenção de codificação é amplamente usada.

exemplo,

void MyFunc(BaseClass myPara)
{
  DerivedClass _mypara = (BaseClass)myPara;
}

ou pelo contrário

void MyFunc(BaseClass _myPara)
{
  DerivedClass mypara = (BaseClass)_myPara;
}

ou qualquer outra convenção

Shamim Hafiz
fonte
1
O que quer que outras respostas você começa a seguir, há uma pequena ferramenta para analisar e fazer cumprir as regras estilísticas: archive.msdn.microsoft.com/sourceanalysis
Patrick Hughes

Respostas:

11

A prefixação de parâmetros ou variáveis ​​locais com um sublinhado não é muito idiomática no C #, não é muito fácil de ler e nem costuma ser usada (embora seja legal, você pode fazê-lo, se desejar).

O melhor nome para o parâmetro e a variável é um nome descritivo. Você precisa pensar por que está mudando o tipo, qual é a razão do elenco. Então você poderá criar dois nomes diferentes. Por exemplo, se você passou por uma "pessoa" e a converteu em um "cliente", então você poderia usar pessoa e / ou cliente nos nomes das variáveis, talvez.

Se você realmente não consegue pensar em dois nomes diferentes, então eu usaria "as" no nome ( houve uma pergunta neste site há alguns dias sobre isso ). Por exemplo, você usaria "myParaAsDerived" para a variável local.

Se possível, eu não usaria isso, pensaria muito sobre o problema que está resolvendo e que nomes significativos poderiam ser usados, mas se tudo mais falhar, isso é bastante legível.

Steve
fonte
Apenas uma verificação dupla (não estou familiarizado com C #). O sublinhado principal é realmente "corretamente" legal em c #? Em C e C ++, os identificadores com sublinhados iniciais (ou duplicados) são reservados; portanto, embora sejam legais em um sentido, você não deve definir seus próprios identificadores dessa maneira. csharp.comsci.us/etymology/identifiers.html sugere que o C # pode ser semelhante (consulte a parte inferior, última das "limitações"), mas na verdade não diz "reservado".
21311 Steve 1314
os sublinhados principais são completamente legais em C # e não são reservados sob nenhuma convenção que eu conheça.
21711 Steve Steve
9

Primeiramente usando

void MyFunc(BaseClass _myPara)
{
} 

Está claramente errado! Como muitos padrões de codificação c # usam um prefixo "_" em todos os nomes de campo ! Seu código precisa ser fácil de entender por outro programador, portanto, o código não deve ser escrito de maneira a enganar muitos programadores de C #.

Dados todos os benefícios de métodos pequenos, pessoalmente não vejo necessidade de uma convenção de nomenclatura para separar variáveis ​​locais de parâmetros. Se seus métodos têm tantos parâmetros e variáveis ​​locais que você não pode dizer o que está acontecendo sem uma convenção de nomenclatura, você tem problemas maiores. (Isso está bem coberto no Clean Code Book , um livro em Java, mas ainda o achei muito útil como programador de C #)

Ian
fonte
4

Se você quiser prefixá-los com alguma coisa, use o p_parâmetro: em geral, acho que você provavelmente irritaria muitas pessoas se fizesse isso. MAS seja consistente, não faça isso em um só lugar, apenas porque você precisa de dois nomes diferentes para variáveis ​​que deseja dar o mesmo nome.

Uma boa regra geral com nomes de variáveis ​​é semelhante;

  • Se você tiver apenas um tipo de objeto, nomeie-o por sua função:

    var builder = new PizzaBuilder();
  • Se você tiver mais de um nome, de acordo com sua função e especialidade:

    var pizzaBuilder = new PizzaBuilder();
    var milkShakeBuilder = new MilkShakeBuilder();

fonte
O parâmetro p_ (ou apenas p) para é uma convenção antiga que tem sido muito usada em C ++ e C. Ele tende a ir com l_ para local e (em C ++) m_ para variável de membro. Eu já vi isso em Pascal, Modula 2 e Ada também, então não é apenas uma coisa da família C. Ele é meio que o amor-it-ou-ódio-lo, no entanto. Eu o usei quase obsessivamente, minha desculpa é Steve Haighs argumentando para "As". Por exemplo, os métodos setter costumam fazer m_Whatever = p_Whatever;- dar aos dois identificadores nomes significativamente diferentes seria estranho. Mas comecei a questionar se esses casos são comuns o suficiente para justificar a convenção consistente.
21311 Steve 1314
4

As convenções de nomenclatura em C # terão:

  • Usando PascalCasing para métodos, propriedades públicas e nomes de classes
  • Usando IPascalCasing (observe o I no início) para nomes de interface
  • Usando camelCasing para parâmetros de método e variáveis ​​locais
  • Usando _underscoredCamelCasing para campos privados de toda a classe

E, por favor, fique longe da notação húngara. É inútil e não adere às convenções de C #.

Matteo Mosca
fonte
os campos privados são em Pascal, caso sejam estáticos.
Sara
2

A sublinhada na nomeação de variáveis ​​pode ser meio desnecessária, pois temos a palavra-chave "this" para referenciar especificamente as variáveis ​​no nível da classe. Se você quiser saber mais sobre as convenções de nomenclatura variável dos especialistas, sugiro que você dê uma olhada no infame artigo chamado "Regras de Ottinger para nomeação de variáveis ​​e classes", de Tim Ottinger, um artigo apoiado pelo mentor de codificação limpa Robert C. Martin .

Ottinger afirma que seu código deve permanecer o mais humanamente legível possível, como uma prosa bem escrita, então ...

public void Function(string p_Parameter1, string p_Parameter2)

... seria mais legível como ...

public void Function(string parameter1, string parameter2)

... onde parâmetro1 e 2 são nomes descritivos para as variáveis ​​correspondentes.

Aqui está o link, definitivamente vale a pena dar uma olhada: Link

Luis Aguilar
fonte
-3

Acredito no sufixo de parâmetro: string s_, int i_, etc

Também acredito que os nomes dos parm devem ser curtos e genéricos quanto possível.

Agora, pelas razões:

  • Na função, você não deseja modificar o parâmetro de forma alguma, se precisar de uma versão modificada, crie uma nova variável para inseri-lo. A nomeação de parms com um sufixo garantirá que você não os atribua se estiver pagando atenção.
  • Exceções a esta regra ocorrem quando o parâmetro é ref ou out. Embora eu ainda use o sufixo neles.
  • Por que nomes genéricos curtos? Você deve documentar sua função para saber o que realmente é no sentido descritivo. Portanto, com isso fora do caminho, o uso de genéricos curtos é útil quando você cria grupos de funções semelhantes ou recorta um corpo de função para transportar para outra função como ponto de partida para modificação.
  • O benefício real dos nomes genéricos é que você não precisa se lembrar do que chamou de parâmetro na maioria dos casos. Você sabe que está recebendo uma string, então é s_, etc, e não precisa se perguntar se é 'filename' ou se era 'filepath' ou se era 'fullpath', é a única string que é 's_'.

Tudo tem vantagens e desvantagens, se você usa algo ou não, dependerá muito de como ele se encaixa no seu estilo atual.

Marca
fonte
6
-1: a) Você está prefixando, não sufixando; b) é a notação húngara e deve seguir o caminho do fazer .
Peter K.
1
O tipo de C # não é seguro?
pyvi 13/07/11
1
@ Peter K. - Parece-me com o se isão nomes curtos, porque este é apenas um exemplo. Não acho que seja húngaro - acho que você está interpretando mal um nome abreviado, que é apenas o clássico string sou int inão consigo pensar em um nome melhor, mas com sublinhados colados no .
Steve314
@ Steve314: Ah, você pode estar certo! Vamos ver se Mark responde.
Peter K.
O s_ é eu acho que um HG anônimo, e não é devido ao exemplo.
Mark