4 ms·
This blog reminds me of one of the most frustrating naming patterns I see among coworkers, former students I TA'd, and open-source code: reversing the adjective
by jzoch 6y ago
This blog reminds me of one of the most frustrating naming patterns I see among coworkers, former students I TA'd, and open-source code: reversing the adjective or adverb with the noun. I attribute it to language barriers but seeing, in this blog, "VerseFake" instead of "FakeVerse" peeves me.
Its a VERSE class, not a FAKE class. It just so happens the class is described as a "fake" so...FakeVerse. Its like saying "Hey look a person tall!". While it sounds silly in english its incredibly pervasive in programming.
Another common pattern that drives me nuts is when people prefer nouns over strong verbs in functions. doDatabaseRestore instead of restoreDatabase.
- ofrzeta 6y agoIt just makes sense, because you have the "parent class" in front and can order classes in docs etc. "AnimalLand", "AnimalWater", "AnimalAir" instead of "LandAnimal", "WaterAnimal" and "AirAnimal". In fact I would probably prefer databaseRestore to restoreDatabase for the same reason because it would allow to cognitively group database methods in your flat namespace instead of grouping restore methods.
- acidbaseextract 6y agoCompletely agree. The same thing pops up with filenames, as well as many automation tools where functions end up being commands. Python's fabric for example has a help function that dumps out possible commands in alphabetical order... the "restore_database" convention ends up being painful to sort out visually.
- segfaultbuserr 6y ago> In fact I would probably prefer databaseRestore to restoreDatabase for the same reason because it would allow to cognitively group database methods in your flat namespace instead of grouping restore methods. This is especially important in pure C. If OOP-style programming is adopted, databaseRestore() can be strictly interpreted as a method of the Database class without ambiguity, and its first parameter is the object the operation is applied onto. In a sense, even old C & POSIX functions such as fopen(), fclose(), fseek() can be seen as a rudimentary form of OOP. On the other hand, restoreDatabase() may perform other operations that change the state outside of the database object.
- heavenlyblue 6y ago> restoreDatabase It may do anything because it was probably written by an intern
- viraptor 6y agoThat also reflects on the ordering of files for navigation. I'd rather see files `VerseFake.source`, `VerseReal.source`, `VerseOther.source` next to each other. (Unless there's a way to extend the namespace and just have `Verse/Fake.source`, ...)
- bcrosby95 6y agoI think it depends upon your project. E.g. how far do you plan to take this - would you call it an AnimalCheetah or a Cheetah? If the latter, I would err on the side of "LandAnimal". Also, if your project is 100% about animals I would probably prefer "LandAnimal" too - otherwise you're likely to end up with a bunch of classes starting with AnimalXYZ and all you're doing is adding noise to your project when everything in it starts with Animal.
- caylus 6y ago> would you call it an AnimalCheetah or a Cheetah? Depends on whether you're Hungarian :P In all seriousness, I'd go with the prefix if these are part of a large flat namespace, but if there were a lot, then they should move to their own package and become `animal.Cheetah`.
- caylus 6y ago+1. It took a while for me to get on board with this at my company but I'm now a huge fan. We name our APIs "FooCreate", "FooUpdate", "FooDelete", "BarCreate", ... for nicer sorting and grouping, even though it's the opposite of how you'd say it in common English.
- dcuthbertson 6y agoPutting the common word first also helps IDEs with search and tab-completion. Type "Animal" and you get a list of Animal-things (classes, functions, variables, or whatever) that apply to the context you're in. (Edited for clarification)
- jzoch 6y agoIf you are choosing a less understandable name just so your docs are sorted we have bigger problems :). It’s a strictly worse name - one tells you what happens when you call it while the other sounds like a variable name and it isn’t clear it does something
- hydroxonium 6y agoMany languages (other than English) are happy having adjectives behind. As other commenters have observed, plenty of great reasons for doing so.
- mjburgess 6y agoIs this is just a more mathematical convention? You write a_b where in english you'd say "b a". eg. Graph_users -- the user graph. In mathematics the data element (noun) comes first and is differentiated by some property (graph_user, graph_product, etc.). For the sake of easily tracking what's going on. So it makes complete sense to have VerseFake, VerseReal, etc.
- jhanschoo 6y agoIdk what you mean by mathematics since mathematics rarely deals with elements from different levels in a hierarchy without renaming. Important influences probably include - Lexicographic ordering, (programming) method access, directory path (which influences package namespaces) - Romance languages put qualifiers after the bare noun by default. You have vestiges in English in titles like Secretary-General, via Norman.
- mjburgess 6y agoEg., in english, "consider two kinds of graph: unweighted and weighted. Call them G_u and G_w..." In mathematics your notation corresponds to Noun_adjective, pretty universally. I have never seen the converse. "Consider a statistical model trained on UK data and a comparable one trained on US. Call them f_UK(x) and f_US(x)..." "Compare a voltage applied across a resister, V_r with a voltage across a diode, V_d..." "Consider the population growth of rabits (dP_r/dt) vs the population growth of foxes (dP_f/dt)..." A notational description of a problem, using mathematics, always leads with the noun. I have always considered the same phrasing in programming to just be this same mathematical convention. "FalseVerse, RealVerse, ComplexVerse" reads weirdly to me. My strong preferece, as a physics grad cum data scientist, is VerseFalse, VerseReal, VerseComplex... V_f, V_r, V_c The particular variation follows the general structure, in notation.
- jhanschoo 6y agoYou're tunneling in on subscript notation. Consider also max f, diam C, edge(G). In programming you also have contrary examples, e.g. FooObserver vs. BarObserver, especially when FooObserver's implementation and BarObserver's implementation are little alike they have very different roles in the application.
- chrismcb 6y agoHas nothing to do with language barriers. And more to do with style. I woukd say the VerseFake is how most people would name it.
- heavenlyblue 6y agoYou’re not programming in natural language and you’re trying to bring some natural language semantics into programming. Please don’t. VerseFake is because the natural sorting will sort VerseFake together with Verse. You, on the other hand - seem to have never worked with codebases that are large enough to find anything in them. Good luck finding the right function when you call everything starting with a verb. In programming you start with an Entity and are given a set of Verbs that are applicable to that entity, not vice versa. You obviously studied philosophy and not engineering if you are asking questions like that.
- jzoch 6y agoPretty silly reply. No need to attack. I’m fairly certain code bases can’t get much bigger than the ones I’m working on. If you abandon the idea that names should be read in a natural manner why use words at all? What a silly notion. Many different languages style guides actually prefer verbs for functions as it makes it clearer an action is taken. Finding function names is very easy with either approach. You have bigger problems and don’t know what you are looking for if you can’t find FakeVerse instead of VerseFake. Why is LandAnimal acceptable over AnimalLand? Why choose AnimalFast over FastAnimal? There is no reason those should be chosen: sorting is a poor argument as the loss in clarity is too great.
- heavenlyblue 6y agoBecause all namespaces in all routinely used languages are com.land.animal and not animal.land.com So there’s no reason in naming functions any differently when Entity within the name is just another namespace. Also I don’t really understand why have the function name “restoreDatabase” when you could just put that function as “restore” within a module called “database”. So you’re kind of missing the whole point of where the prefixes rather than suffixes come from.