Estou confuso sobre a escolha de nomes para minhas funções em Python . Às vezes, as funções internas do Python são imperativas , como: print
function e método de string find
. Às vezes, eles não são assim: len
seu nome não é imperativo como calculate_len
, por exemplo, e type
não é find_type
.
Eu posso entender que print
retorna um valor que não usamos (ou seja None
) e faz alguma coisa (ou seja, mostra uma string na tela), por isso seu nome é imperativo.
Mas len
retorna um valor que usamos e faz alguma coisa (ou seja, calcular quantos itens existem em uma sequência ou um mapeamento.) E seu nome não é obrigatório . Por outro lado, o find
método string (as len
) retorna um valor que usamos e fazemos algo, e seu nome é imperativo .
O que fez essa pergunta é que eu coloquei um script que criptografa e descriptografa a string usando a cifra de César para ser revisado. O revisor disse que:
Apenas um pressentimento: funções fazem coisas. Portanto, um bom nome para uma função é um imperativo: eu usaria em
rotate_letter
vez derotated_letter
.
rotated_letter
retorna uma sequência de uma letra representando uma letra girada por um número. Eu não sei o que é melhor, usei rotated_letter
como ele retorna um valor, como randint
função no módulo aleatório , não é generate_randint
.
Portanto, neste caso, como devo nomear uma função que retorna um valor a ser usado? Devo tornar o nome imperativo ou apenas um substantivo . Em outros casos, é óbvio como fazê-lo, como funções booleanas , como is_even
e is_palindrome
apenas fazemos uma pergunta sim / não , e também funções que apenas fazem e retornam valores não utilizados (ou seja None
), como print
método list sort
.
fonte
len
, por exemplo, é melhor pensado como "comprimento de" - você está obtendo uma descrição em nível meta do argumento.Respostas:
Use verbos, quando razoáveis, substantivos, se forem mais curtos e inequívocos
Na maioria das vezes, as funções devem ser verbos (imperativos) e as classes, variáveis e parâmetros devem ser substantivos. Os atributos também devem ser substantivos, incluindo aqueles criados usando
@property
. Esse é especialmente o caso de funções com efeitos colaterais. [1] Se uma função retornar algo, você deve avaliar se o verbo adiciona algo ou é apenas "ruído":make_list(foo)
vslist(foo)
.: O substantivo é mais fácil de ler que o verbo. Além disso,list
é realmente uma classe, e as classes devem ser substantivos.open(foo)
vsfile(foo)
.: o verbo é mais fácil de ler do que o substantivo, e faz mais sentido dar "opções" a um verbo do que a um substantivo; portanto, o substantivo foi removido no Python 3.open()
permanece o único caminho "padrão" [2] para criar objetos de arquivo no Python 3.foo.get_bar()
vs.foo.bar()
vs.foo.bar
(assumafoo
ebar
são ambos substantivos): A primeira opção está correta, porque o "get" não adiciona nada que ainda não conhecíamos. O segundo é apropriado se tirar umabar
folgafoo
é uma operação potencialmente cara e / ou traz efeitos colaterais (você também pode considerarBar(foo)
seBar
for uma classe). O terceiro é apropriado se for uma operação barata, sem efeitos colaterais, e é improvável que implementações alternativas a tornem cara .xs.sort()
vs.sorted(xs)
ifxs
é uma lista: o primeiro é imperativo: classifique a lista. Ele modifica a lista no local e não retorna nada. O segundo é declarativo: uma lista que é ordenada, e é exatamente isso que ela retorna. Ambos são verbos.[1]: Normalmente, retornar um valor e ter efeitos colaterais são mutuamente exclusivos, a menos que você tenha algum motivo atraente de design para combiná-los. Portanto, uma função que tenha efeitos colaterais provavelmente não deve retornar nada e, portanto, torná-la um substantivo faria muito pouco sentido.
[2]: Existem algumas operações de nível moderadamente mais baixo no
io
módulo que podem ser usadas para adicionar ou remover buffer de arquivo, en / decodificação automática de texto, etc., e estes são principalmente substantivos porque são classes orientadas a objetos. A maioria dos usuários não precisa jogar diretamente com essas coisas; em vez disso,open()
escolhe uma classe apropriada e a instancia automaticamente.fonte
foo.get_bar()
vs.` foo.bar ()` vs.foo.bar
" qual é a diferença entre o segundo e o terceiro ?rotated_letter
imperativo e mantê-lo declarativo, certo?letter
está implícito no contexto.list
é uma classerotated_letter
não parece um método. Parece uma propriedade. O que significa que a primeira ideia é fazer:esperando
letter
conter um valor do tipo string, não uma função. A partir daí, você escolheu um nome diferente, como:ou você usa uma propriedade:
len
etype
são nomeados assim porque qualquer outro nome seria longo para digitar. Eles são muito usados e têm um status especial das principais funções do Python que todo programador de Python aprenderá de qualquer maneira, tornando seus nomes muito mais irrelevantes do que os nomes de bibliotecas de terceiros.len
, especialmente, é um bom exemplo do que você não deve fazer no seu código: espera-se que você use nomes completos comolength
(a menos que o formato abreviado seja muito popular, comomax
) e use um verbo, comocompute_length
. Ou poderia ser uma propriedade:len([1, 5, 6])
torna - se[1, 5, 6].length
. Por exemplo, em C #, a forma mais tarde é utilizada:new [] { ... }.Length
.Observe que também pode haver motivos históricos para
len
: outros idiomas, como C #, preferidosCount
, que geralmente são um método (embora o comportamento seja infelizmente inconsistente no .NET Framework).Count
é um verbo, de maneira intuitiva, você costuma invocá-lo como método.Retornando valores ou executando uma ação
Espera-se sempre que uma função execute uma ação. Se ele mal retornar um valor, deve ser uma propriedade. Você tem uma dica de que a função deve ser transformada em uma propriedade quando:
A função mal contém uma
return ...
declaração,O nome da função que vem naturalmente à sua mente é
get_something
, como emproduct.get_price()
.Agora, se você tiver uma função, ela poderá ser um dos quatro tipos:
Pode ser puro, ou seja, retornar um valor sem afetar o meio ambiente. Exemplo:
road.measure_distance()
.Pode afetar o ambiente sem retornar nada. Exemplo:
product_database.remove_record(1234)
.Isso pode afetar o ambiente e retornar um valor. Exemplo:
value.increment()
usado comovalue++
.Não pode fazer nada e retornar nada. Exemplo:
time.sleep(1)
.Existem poucos casos em que o nome pode dar uma dica forte sobre o tipo da função, mas em muitos casos, você não poderá conhecer o tipo apenas pelo nome.
fonte
getSomething
esetSomething
são os nomes comuns usados em vez de propriedades.