[Nota: O abaixo é um pouco pesado em C # em sua sintaxe e convenções, como citar regras FxCop, porque esse é o meu histórico, mas o objetivo desta discussão é ser independente de idioma e os exemplos de código usados geralmente devem ser considerados como pseudo-código. - Mike]
Acho que todos concordamos que as classes geralmente devem ser projetadas para que suas instâncias de objetos sejam imutáveis sempre que possível, e os resultados de chamar membros da classe devem estar livres de efeitos colaterais, tanto quanto possível.
As convenções de nomenclatura histórica, no entanto, tendem a usar a voz ativa: 'GetSomething', 'DoSomehing' etc. etc., e isso é bom porque indica claramente que ação o aluno deve executar.
Agora estou começando a pensar, no entanto, que os membros às vezes (ou possivelmente com freqüência) se beneficiam sendo nomeados no pretérito para conotar que um valor é retornado sem afetar o objeto referenciado.
Por exemplo, para um método que transpõe uma matriz, os estilos de nomenclatura atuais provavelmente o chamariam 'Array.Transpose', mas se esse membro retornar uma nova matriz, sem transpor o objeto referenciado, acho que chamando de 'Array.Transposed 'seria mais preciso e tornaria mais claro para o programador.
Ao trabalhar com um método 'Array.Transpose ()', pode-se tentar acidentalmente usar código como o seguinte:
Array myArray = new Array();
myArray.Transpose();
Mas se o método 'Transpose' retornar uma nova matriz sem afetar o objeto referenciado, esse código não fará nada - ou seja, 'myArray' silenciosamente não seria transposto. (Suponho que, se 'Transpose' fosse uma propriedade, o compilador perceberia que o acima não é legal, mas as diretrizes da FxCop determinam que um membro que realiza uma conversão deve ser um método.)
Mas se o método fosse nomeado no passado como 'Array.Transposed', seria mais claro para o usuário que a seguinte sintaxe é necessária:
Array myArray = new Array();
Array transposedArray = myArray.Transposed();
Outros nomes que eu acho que se encaixariam nessa categoria seriam os membros denominados 'Redimensionado' vs. 'Redimensionar', 'Deslocado' vs. 'Deslocamento' etc. O tempo presente seria usado para membros que afetassem o objeto referenciado, enquanto o o pretérito seria usado para membros que retornassem um novo valor sem afetar o objeto referenciado.
Outra abordagem que é mais comum atualmente é prefixar cada nome com "Get" ou "To", mas acho que isso adiciona peso desnecessário, enquanto a alteração no pretérito comunica o significado de maneira eficaz.
Isso faz sentido para outros programadores aqui, ou essa ideia de pretérito soa estranho demais ao lê-la?
Editar:
Ótimas discussões abaixo, agradeço muito a todos. Gostaria de resumir alguns pontos com base nos seus comentários e no meu próprio pensamento revisado a seguir.
Método de encadeamento de sintaxes "fluentes"
Com base nas discussões abaixo, o uso do tempo passado é provavelmente de algum valor quando usado em uma classe mutável, a fim de deixar claro quais membros afetam, ou não, o estado interno do objeto referenciado.
No entanto, para classes imutáveis, que deveriam ser a maioria dos casos (seria de esperar), acho que o uso do tempo passado pode tornar a sintaxe desnecessariamente estranha.
Por exemplo, com "sintaxes fluentes", como as criadas pelo encadeamento de métodos, o uso do tempo passado tornaria o código menos legível. Por exemplo, ao usar o LINQ via C #, uma cadeia de métodos típica pode ter a seguinte aparência:
dataSource.Sort().Take(10).Select(x => x.ToString);
Se alterado para o passado, isso se tornaria estranho:
dataSource.Sorted().Taken(10).Selected(x => x.ToString);
Lembre-se de que dataSource.Sorted () tem um significado mais claro do que dataSource.Sort (), porque as expressões LINQ sempre criam uma nova enumeração sem afetar a fonte. No entanto, como estamos plenamente conscientes disso ao usar esse paradigma, o uso do tempo passado é redundante e torna a "fluência" de lê-lo desajeitada, sem ganho real.
Uso de propriedades vs. métodos
Um problema importante abordado abaixo diz respeito às diretrizes do FxCop para o uso dos métodos "Get" versus propriedades somente leitura. Por exemplo, regra FxCop CA1024 .
Embora não mencionado explicitamente nessa regra do FxCop, o uso dos métodos "To" também parece se aplicar a esse raciocínio, pois os métodos ToXXXXXX () são métodos de conversão. E no caso de ToArray (), o método é um método de conversão e é um método que retorna uma matriz.
Uso do pretérito para propriedades booleanas
Alguns sugeriram que o tempo passado pode conotar um valor booleano, por exemplo, uma propriedade 'Succeeded' ou 'Connected'. Acredito que as réplicas abaixo enfatizando o uso de um 'É', 'Tem' ou 'É' para propriedades e campos booleanos estão corretas. O pretérito também pode ajudar nesse sentido, mas não tanto quanto usar o prefixo 'É'. Sinta-se à vontade para usar o tempo passado para propriedades e campos booleanos, isso ajuda, mas acho que é ainda mais importante prefixar o nome com 'Is', 'Has' ou 'Are'.
Conclusões Gerais?
Para a questão de Tranpose () vs. Transposed (), acho que 'skizzy' acertou, sugerindo que deveria ser Transpose () para uma ação mutante vs. GetTransposed () para um resultado não mutante. Isso torna 100% claro. Mas, novamente, acho que isso pode se aplicar apenas a uma classe mutável, como uma matriz.
Para classes imutáveis, especialmente onde uma sintaxe fluente de encadeamento de métodos pode ser usada, acho que essa sintaxe se tornaria desnecessariamente estranha. Por exemplo, compare:
var v = myObject.Transpose().Resize(3,5).Shift(2);
para:
var v = myObject.GetTransposed().GetResized(3,5).GetShifted(2);
Hmmm ... na verdade, mesmo aqui parece deixar 100% claro que o resultado não afeta a fonte, mas não tenho certeza.
Eu acho que para um paradigma como o LINQ, onde é bem conhecido, o uso de "Get" e / ou o tempo passado não é necessário, mas para uma nova API, ela pode ter algum valor - a princípio! Se a API contiver apenas objetos imutáveis, uma vez que o usuário entenda isso, o uso de "Get" e / ou o tempo passado apenas reduzirão a legibilidade.
Então, acho que não há respostas fáceis aqui. Acho que é preciso pensar em toda a sua API e escolher com cuidado!
-- Mike