Le classi dovrebbero essere nomi e i metodi dovrebbero essere verbi. Che dire di tratti Groovy ? Dovrebbero essere anche nomi? O forse dovrebbero essere parole di aggettivi / abilità?
Le classi dovrebbero essere nomi e i metodi dovrebbero essere verbi. Che dire di tratti Groovy ? Dovrebbero essere anche nomi? O forse dovrebbero essere parole di aggettivi / abilità?
Trovando ispirazione da altre lingue (C # in questo caso), le interfacce sono generalmente usate come tratti, cioè comportamenti particolari. Ad esempio, considera IDisposable
e IEnumerable
.
La stessa cosa accade nella pagina che hai collegato:
class Person implements Greetable {
String name() { 'Bob' }
}
Tuttavia, tieni presente che le interfacce possono in alcuni casi essere un nome. Ad esempio, IList
.
Puoi anche vedere la stessa cosa accadere nella pagina che hai collegato:
trait FlyingAbility {
String fly() { "I'm flying!" }
}
Quando ci pensi, un aggettivo non avrebbe funzionato qui. "Volabile" non significa "in grado di volare" (ad esempio, un uccello è in grado di volare), significa "in grado di essere volato " (ad esempio un aereo può essere pilotato da un pilota). Per evitare confusione, la forma del nome è stata una scelta migliore qui.
Cercando di distillare una descrizione di denominazione per le interfacce, l'obiettivo non è in realtà se si tratta di un sostantivo o di un aggettivo, ma piuttosto che descrive un'abilità . Questo può essere fatto in forma di nome ( FooAbility
) o in forma di aggettivo ( FooAble
), ma l'intenzione è la stessa: sottolineando la capacità di fare / essere qualcosa.
Se scegli un nome o un aggettivo dipende dalla semantica che circonda la parola (nella lingua in cui è scritto il tuo codice, che non è sempre l'inglese).
Sidenote
In codebases that use dependency injection, core classes (Foo
) get a boilerplate interface (IFoo
). This breaks the naming convention of pointing out an ability, unless you read it as meaning "able to behave as aFoo
", which I don't quite agree with. In my opinion that inverts the logic. We should instead think of it as "Foo
can behave as anIFoo
" (because ofFoo : IFoo
).Regardless, DI interfaces have a slightly different naming convention, but they are not really used as "traits" anyway, so I'm choosing to ignore them for your specific question on traits.
Modifica
A pensarci bene, la distinzione tra sostantivo / aggettivo sembra essere correlata alla voce attiva / passiva.
(aggettivo) Flammable = in grado di essere dato alle fiamme (passivo)
(sostantivo) FlyingAbility = in grado di volare (attivo)
Non sono sicuro che sia applicabile universalmente in inglese. Non sono sicuro se questo si applica ad altre lingue.
Leggi altre domande sui tag naming