Use verbos com funções, substantivos com classes - e as interfaces? [fechadas]

23

Ok, eu entendo as convenções normais do uso de verbos com funções e substantivos com classes. E as interfaces? Existe alguma metodologia ao criar nomes de interface que pode não ser tão óbvio?

Só para esclarecer, não estou falando sobre colocar um "I" na frente do nome ou se usar camelCase ou PascalCase. Estou pensando no método de descobrir um nome claro e semântico para uma interface.

EDIT Estou obcecado em como nomear uma interface da maneira mais clara. Acho que ele também precisa ser um substantivo, porque quando penso em nomear classes, penso no objeto do mundo "real" mais próximo ao qual ele pode se relacionar. Suponho que interfaces do mundo real são coisas como teclado, mouse, controle remoto, tela ATM. Esses são todos os substantivos. De qualquer forma, qualquer insight adicional sobre uma boa maneira de formular nomes de interface seria apreciado.

programador
fonte
2
Hum. Com base no título, pensei que seria sobre igualar partes do discurso entre programação e inglês. Nesse caso, os madlibs parecem possíveis.
21712 Izkata
Lembre-se, quando você cria uma classe, também está criando uma interface para objetos instanciados por essa classe ... Ou, dito de outra forma, as classes são interfaces realizadas . Portanto, eles devem usar a mesma convenção de nomenclatura.
Daniel T.
Além disso, IMHO o "usar verbos com funções" é muito geral. Você deve usar verbos com comandos e substantivos com consultas .
Daniel T.

Respostas:

21

Eu diria que depende do que a interface define. Em alguns casos, quando a interface é bastante específica e detalhada, acho que um substantivo é o melhor. Exemplos são IList, ICollection.

Às vezes, embora uma interface seja mais sobre como adicionar certos recursos gerais a uma classe. Nesse caso, acho que um adjetivo é o melhor. Exemplos são IDisposable, IEnumerable, ...

Talvez outra maneira de pensar sobre isso seja quantas "habilidades" sua interface define.

Por exemplo, a IList<T>interface define essas habilidades: Adicionar, Limpar, Contém, Inserir, Remover, ... Todas essas são propriedades de uma lista, portanto, IListé um bom nome.

IDisposablepor outro lado, define apenas uma habilidade: Descarte. Portanto, é adequado para qualquer coisa descartável. Daí o nome IDisposable.

Kristof Claes
fonte
10
Eu sugiro o uso de um adjetivo "_able" se a sua interface receber o nome de coisas que podem ser feitas no seu objeto (por exemplo IEnumerable), um substantivo "_er" se a sua interface tiver o nome de coisas que o seu objeto faz com outros objetos ( por exemplo IEqualityComparer,) e um substantivo geral se a sua interface tiver o nome de um tipo de coisa cujo comportamento imita (por exemplo IList<T>).
Super8
O comentário de @supercat deve realmente ser incluído nesta resposta. Faz muito sentido.
Nikhil Vartak 28/09
Na verdade, prefixar o nome da interface Ié redundante.
user1870400 13/09
5

Uma interface descreve o comportamento para que os nomes digam isso. Não tenho certeza sobre uma regra para isso, mas você saberá o nome quando ouvir.

Alguns exemplos:

Flyable      - Can Fly
Workable     - Can work
Negotiatable - Can negotiate.

Eu acho que não é apropriado para nomear interfaces com Ie chamar Setcom ISetporque, como um desenvolvedor, você não deve estar preocupado se é uma interface ou uma classe. Vejo que essa prática não existe em Java agora.

ManuPK
fonte
+1 em "como desenvolvedor, você não deve se preocupar se é uma interface ou uma classe".
Kazark 29/01
"como desenvolvedor, você não deve se preocupar se é uma interface ou uma classe" - discorde, porque se for uma interface, você precisará saber quais membros você deve implementar.
Maximus Minimus
O prefixo @MaximusMinimus Ié redundante, independentemente. Então por que não prefixar classes abstratas com A, classes regulares com Cetc?
user1870400 13/09
@ user1870400 - é verdade, mas essa não é a parte da qual estou discordando.
Maximus Minimus 13/09
4

Como uma interface é realmente apenas uma expressão do tipo "o quê", mas não o "como", eu os nomearia da mesma maneira que você nomeia classes, pelo menos de uma parte da perspectiva da fala. A única coisa que posso acrescentar é que eles costumam ser mais gerais do que os implementadores específicos (por exemplo, a interface "Customer" pode ter implementadores "ProspectiveCustomer" e "PayingCustomer").

Erik Dietrich
fonte
0

Uma interface é usada como uma classe. Portanto, também deve ser nomeado com um substantivo quando você nomear classes com substantivos. Prefira substantivos abstratos, por exemplo "Veículo" quando as classes forem "Carro" e "Caminhão".

thiton
fonte
0

Rápida Resposta: Interface é mais sobre adição de um SET de habilidades, características, limites comuns ou de interconexão entre entidades, classes, modelos, conceitos, etc ..

O problema de adicionar um comportamento comum a classes e entidades e, em seguida, um bom nome significativo surgirá para identificar o conjunto de recursos reais.

Nomeação de interface como: IStateMachineBuilder, IUserContextProviderBuilder, IEntityBuilderBuilder, IActiveAware, etc.provavelmente explique o conceito.

EL Yusubov
fonte
1
Sim, as interfaces representam contratos ou recursos; muito é bem conhecido. Mas como isso responde à questão de como nomeá-los? Tudo o que você está realmente dizendo a esse respeito é: "Pense nisso, e a inspiração o atingirá". Isso não dá qualquer recomendação, por exemplo, qual dos seguintes nomes deve ser escolhido, qualquer motivo: IStateMachineBuilder(substantivo), IBuildStateMachine(em homenagem a uma ação), ICanBuildStateMachine(nome de um recurso), etc.
stakx
0

Depende, se a interface contiver apenas métodos, será bom nomeá-la usando verbos como "Actions", como se representasse uma classe genérica que contenha campos estáticos e finais, então podemos usar um Substantivo genérico como "Vehicle"

Joms Antony
fonte