Problem/Motivation
When short class names stand alone (within namespaces), it can lead to confusion.
Proposed resolution
Change class naming standards so that all class names can stand alone without ambiguity. Proposed standard is in comment #48 below.
Remaining tasks
1. Agree on standard.
2. Update coding standards document.
3. Review classes in D8 core and update names where they don't conform to the new standard.
User interface changes
None.
API changes
Some class names will change.
Original report by Crell
Currently, our coding standards are very strict on namespace usage. 1) Always "use" a class. 2) Never reference a class except by its short-name (except in a hook type hint, sometimes); 3) Never alias a class unless there would be a syntax error otherwise, and then there's a very strict rule for how you form the alias.
That's good in that there's really no room for bikeshedding. It is what it is, and there's always one canonically right way to name a class.
That's bad in that sometimes the shortname is not entirely self-evident. cf: #1323124: Convert file transfer system to PSR-0 and #1477446: Move lock backend to PSR-0 code.
With a bit more experience now, we should discuss if we want to loosen the naming conventions and if so how. I see a couple of options:
1) Do nothing. Better to avoid the bikeshed potential.
2) Allow/encourage shortnames to be redundant with the namespace so that they can be more self-evident.
3) Use aliasing more. So for instance you wouldn't say use Drupal\Core\Cache\Database and then have a class called "Database", but do something like use Drupal\Core\Cache\Database as DatabaseCache, so that the class name in the code (DatabaseCache) is self-evident.
4) Use an entire namespace at once, and then use \ in the class name. So you'd say use Drupal\Core\Cache, and then in code have $c = new Cache\Database.
Symfony from what I've seen does bits and pieces of 2, 3, and 4, although I don't believe there's any documented pattern to when they do one or another of those. (Any Symfonians around, any insight here would be helpful.)
Discuss. :-)
Comments
Comment #1
Crell commentedSeparating my own comments from the summary...
At this point I think we should do something, as I agree that in some cases the resulting class names are rather unhelpful. I am not particularly a fan of option 2, though, as avoding long class names is the whole point of namespaces. At the moment I'm leaning toward option 3, although I could be talked into option 4 as in a sense it ends up in the same place, just with a \.
Comment #2
catchI quite like #4, it's a bit more greppable than aliasing, and looks like in some situations it could mean less use statements overall at the beginning of files.
Comment #3
pounard1) Is a good solution, but it will lead to a non consistent codebase, and would imply we close this bug, so I will just ignore it.
2) I would not encourage class names to be always redundant with the namespace, but one word class names are often really bad.
3) Using too much aliasing would make the code harder to grep/refactor. Greping on Namespace\Classname would always gives us positive files matching the class, but wouldn't give the lines where it's being used, thus defying the purpose of grep itself.
4) Starting to use relative namespaces everywhere as a convention is a no go in my opinion. I'm quite sure it would be acceptable sometime, but only in rare cases (and I honnestly can't get my mind to find one example right one).
Aliasing is legal by the language, it's an helper to solve ambiguities, not something we must abuse of, in most cases it changes class names in the local context and make the code harder to read if used too much (once the class is named Database, another CacheDatabase, some people might even alias it as DatabaseCache) it makes "moving" class names and give some kind of random aspect to the code, which is the opposite of being explicit.
I'm not fond of repeating the full namespace into class names, but considering we did
use Drupal\Core\Cache\*;upper in the code.I would read this:
$joe = new Database();
"Joe is a new database", which for my mind would make think (even if I know it inst) that Joe is a new database connection. Even if I know by reading the use statement upper Joe is not a database, but at first sight, I don't know what Joe is and my mind would tell me instinctively the wrong thing.
Then if I read this:
$joe = new DatabaseDriver();
"Joe is a new database driver", ok, it's better, but once again, my mind is fooling me around, I would think that Joe is a database driver (is it MySQL, PostgreSQL, any other?), but once again, my mind will instictively read this wrong.
Now, if I name my class with some more redundancy, I get this:
$joe = new DatabaseCacheDriver();
"Joe is a new database cache driver", this sounds a lot more explicit, and my mind did not instictively fool me! I know it's a long class name, but it is an explicit class name, and 3 words is not too much to write, especially when you have a good IDE (and it doesn't lead to extremely long code lines either).
What I mean by that is that somehow namespaces are primarily a medium to create encapsuled packages and avoid conflicts between frameworks themselves. It's not just about making class names smaller. Anyway, we are supposed to put interfaces anyway, and interfaces names will be smaller in most cases.
Comment #4
dries commentedWe should repeat words and allow redundancy in favor of readability. It's common practice so I'm not sure there is a lot to debate here.
See also #1323124: Convert file transfer system to PSR-0 and follow-up comments. As effulgentsia pointed out in that issue, it is consistent with Symfony. For example,
Symfony\Component\HttpFoundation\SessionStorage\ArraySessionStorage. It would be confusing to useArrayinstead ofArraySessionStorage.Comment #5
jhodgdonI am a fan of #2 (less ambigous, more stand-alone class names), mostly from the point of view of searching/browsing on api.drupal.org. As Dries notes in #4, Symfony does this already...
I don't think we want a bunch of too-short-to-understand class names sitting there if we go to a page like
http://api.drupal.org/api/drupal/classes/8
or if you go over to the search box and start typing in something like Array, and there are 10 classes called just Array, it would be hard at first glance to figure out which one was wanted.
Comment #6
Crell commentedWhile option 2 (redundancy) has its benefits (mostly it's quite easy to do), it could also get ridiculous rather easily. Vis, Drupal\Core\Database\Query\Condition. "Condition" means little out of context, but with the full name it's completely obvious. But then if we start introducing redundancy for context, what does that become? Drupal\Core\Database\Query\QueryCondition? Drupal\Core\Database\Query\DatabaseQueryCondition? Drupal\Core\Database\Query\DrupalDatabaseQueryCondition? At some point the namespacing becomes rather pointless. Yes, some of those examples are clearly hyperbole. I'm just pointing out that we'd need good guidelines on what sort of redundancy to include that way.
Option 4 would give us the same clarity in code, or close to, without having to make the class name redundant. (Remember that the full string is the class name as far as any PHP internal code knows. The rest is just syntactic sugar.)
As noted, Symfony seems to do 2, 3, and 4 at various times so I don't think "Symfony does it" is a conclusive argument for any one strategy. If anything it would be a conclusive argument for "eh, do them all", but knowing Drupal we'd still want some guidelines to minimize the name bikeshedding potential.
I'm also not as concerned about what api.module shows now, since it doesn't handle namespaces at all. We can program it to do what we want. (I don't mean to be completely dismissive there, just pointing out that there has to be work done no matter what so that's not ipso facto a conclusive argument for one strategy or another anyway.)
Comment #7
jhodgdonDefinite hyperbole. :) Let's see if we can make something sensible... How about this for a standard:
---
Classes should have names that stand alone to tell what they do (without having to refer to the namespace), and are as short as possible without losing information about what they do or leading to misunderstandings.
Examples:
---
Comment #8
webchick#7 looks great.
Comment #9
Crell commentedWell, that leaves it unclear how to form that name. The first one uses the next namespace up as a prefix, the second as a suffix, and the third as an infix. :-)
Comment #10
jhodgdonRE #9 - I am not sure they all need to be uniformly prefixes/suffixes. I took those from actual examples in Core and tried to make what I thought were sensible class names in all cases, that would be what you would call them in plain English:
- QueryCondition: "This class represents a query condition"
- LocalFileTransfer: "This class takes care of local file transfers"
- DatabaseCacheDriver: "This class is a database cache driver" (at least that was my guess as to what it does from the comments above).
I don't think we need any rules on how to make up class names... "use common sense" will probably be fine. I think? But we can adopt standards for prefix vs. suffix if that makes things more uniform, and if that would be better than "use your own judgement".
Comment #11
pounard#7 seems real good to me.
@#6
The namespace is only a container for organizing your code, you don't use the namespace, you use the class name when you code.
PHP use an internal class name with the full namespace, we don't. Every other high level OOP language that runs on a VM does the same.
@#9
Thanks to namespace context encapsulation that provides for us a clean code organisation (as if it where folders), we can now afford to use native english language to form class names in order to make the names both explicit and naturally readable, that's how we can now form the names (that we couldn't do when we had no namespaces). We can basically read the class names as incomplete sentences and naturally understand their meaning even without knowing the whole design (except in some complex APIs). Of course we would never call a class "TheClassThatDoesTransferFileLocally" but "LocalFileTransfer" instead, but that's just having a bit of sense :)
Comment #12
Crell commentedPerhaps I'm just recently burned by too many bikeshedded issues, and have seen too many issues where a third of it was taken up with variable and function naming discussion. :-) I'd really like to head that off if we can, at least to some extent. I agree that the suggestions in #7 make sense, but at the same time there's no real guideline that's obvious from them for how to form the class short-name other than "something that makes sense". That's the part that worries me.
It sounds like only catch likes doing namespace includes rather than class name imports, though. Does anyone else like option 4?
Comment #13
jhodgdonI'm OK with making a standard for how to name the classes, and I agree that having a clear standard definitely shuts down bikeshedding quickly. ... Maybe a clear *guideline* with some flexibility would be best, though, in case there are exceptions that would make sense. So how about this as an alternative to the proposal I put in comment #7:
---
Classes should have names that stand alone to tell what they do (without having to refer to the namespace), and are as short as possible without losing information about what they do or leading to misunderstandings. Normally, they should be formed from the last component of the namespace, followed by a word or words that gives the specific function of the class.
Examples:
---
How's that?
Comment #14
Crell commentedI would adjust #13 to say that the namespace can be prefixed if the short name is ambiguous otherwise, but it should not always be done by default.
Comment #15
jhodgdonOK:
---
Classes should have names that stand alone to tell what they do (without having to refer to the namespace), and are as short as possible without losing information about what they do or leading to misunderstandings. Normally, they should be formed from the last component of the namespace (if needed to disambiguate), followed by a word or words that gives the specific function of the class.
---
Did I spell "disambiguate" there right? :)
Comment #16
jhodgdonAnd are there any examples of core where we wouldn't need to add the namespace to add to the examples table?
Comment #17
Crell commented"Node", "Entity", "EntityInterface", "User"... I think any of the entity-related classes are fairly self-evident.
Also within the DB, while I could see QueryCondition I am not sure that all of the query builder pieces would need it. In fact, it would make it more difficult in some cases since we already use magic naming for DB driver classes; Drupal\Core\Database\Driver\mysql\Select is really really easy to implement. Drupal\Core\Database\Driver\mysql\MySqlDatabaseSelectQuery would make the code to load it considerably more complicated.
Comment #18
jhodgdonHm. So there are several classes called just "Select"? Uck. That violates the "unambigous" idea pretty clearly. I would think MySqlSelectQuery would be a less ambigous name... but if that wouldn't work, it wouldn't work.
Agreed on "User", "Node", etc. as good examples where the namespace isn't needed.
Comment #19
pounardI'm glad that everyone seems to lean toward the same opinion here. I agree that for the database driver it might cause technical problems due to the current architecture, it's an edge case, IMO it seems that the database driver has a really weird API, we could have an interface for each driver that would implement methods such as
getSelectQuery()and the naming problem would be solved.Comment #20
Crell commentedpounard: The DB driver system is one of the few places that we use magic class naming, because it cannot rely on anything higher-level. In D7 we had to do that for autoloading purposes. That's a big less of an issue now with PSR-0, but I kept magic naming to minimize the changes in the patch. (It just now uses the namespace for magic naming rather than a _mysql suffix, which I believe is a big step up.) I also made the driver classes required, which simplified some code as well. It may be possible to allow class names to be explict definitions in the driver now, but that won't help with the driver class itself which still has to be dynamic. We should discuss that in a separate issue, though, after this is sorted out.
Comment #21
pounardYes agree, anyway the database system is an edge case and I'm not sure we should use its driver system as example for naming conventions.
Comment #22
Crell commentedOne other adendum I'll add: Never include "Drupal" in the shortname of the class. That's excessively redundant and completely unnecessary for avoiding collisions now with actual namespaces.
Comment #23
pounardAgree with that 100%.
Comment #24
jhodgdonOK, one more try at a standard:
---
Classes should have names that stand alone to tell what they do (without having to refer to the namespace), and are as short as possible without losing information about what they do or leading to misunderstandings. Normally, they should be formed from the last component of the namespace (if needed to disambiguate), followed by a word or words that gives the specific function of the class, and they should not include "Drupal" or "Class" in the name (although interfaces can include "Interface" in the name).
Examples:
---
Comment #25
jhodgdonNote: I didn't find a class named "Node" in D8, and it doesn't look like the Entity class currently has a namespace (???).
Comment #26
pounardI would go for less strict, maybe: Class name must be short, but obvious about what it does or represent. It may contain the namespace name in order to prevent any confusion when being used outside of its own namespace. If possible, make them as near as possible of spoken english. Code using them must be explicit and naturally readable if possible. along with a few but self-explenatory examples.
Comment #27
jhodgdonThe ideas in #25 vs. #26 - read the comments above. #25 has adapted to many comments that disagree with #26.
Comment #28
Crell commentedEntity classes are all in contrib and as of yet have not been PSR-0-ified. Also, not all entities are converted yet. That's a work in progress.
I think I prefer pounard's wording, with with the "no Drupal or Class" admonition from #24. However, we should probably use the formal term, Unqualified name.
Comment #29
jhodgdoncrell: You were the one who brought up many of the problems (inconsistency, etc.) with the wording I had proposed originally (see #8), and examples that didn't have the right order (see #9), right? I personally really don't care strongly, but I just want to make sure that all the good ideas other people had are represented in the standards.
Comment #30
pounard@#27 I volontarily make my text more evasive, because the more strict are the standards, the more edge cases becomes incompatible with it and become themselves new troll about standards; The more we have standards to follow the harder it becomes to simply follow them when we code or review. There is one thing that I hate in core issue queues, is that in most threads, more posts actually speaks of standards violations using Dreditor review instead of speaking of the real code and design. We should easier everyone's life with standards, we cannot anticipate all use cases in advance.
Comment #31
jhodgdonRight, I understand that pounard, but I would just point out that several people objected to my similarly vague first proposal in #7, which is how (after several iterations) we arrived that the more-specific proposal in #24.
Really, I don't care which way we go, but after having a lot of discussions and making it more specific in response to those discussions, it seems odd to suddenly say "Oh, let's go back to being vague" again. Really, the proposal in #25 has pretty much the same information as the one I suggested in #7... Read through the responses to understand why we arrived at #24...
Comment #32
pounardThe problem is that stuff like Normally, they should be formed from the last component of the namespace [...] followed by a word or words are not always true, the repeated namespace piece would be the second or the third word, in some case. I just don't want this kind of things to happen once this as been written in the standards, because if it does, it will re-open the troll once again, and ends up in a gigantic waste of time, again.
EDIT: Plus, I'm quite sure that for any core code review they will be people skilled with namespaces that will expose their thoughts and reveal the naming nonsense, it already happened more than once, and it almost always end up by good names.
Comment #33
Crell commentedSo, to clarify, the thing about #26 was that it didn't imply that "include the namespace name" was the default, with exceptions made otherwise. Rather, it felt like it was the opposite. I don't know if that was the intent or not, but I'd prefer to have the mental default be to not be redundant, but allow it where it would be necessary for clarity.
Comment #34
jhodgdonOK, let's recap, because I'm confused about who likes what version of the proposed specs....
1. I think everyone agrees on the concept that the class names should be sufficient to stand alone and describe concisely what the class does (and that some of the existing/proposed class names will therefore need to be revised).
2. I proposed a simple "use common sense" type of statement of this, with three examples that basically followed the "how would you say it" order, in comment #7. Several people said they liked it, but Crell objected in #9 that this proposal gave no guidance on how to make the names (what order), and that the three examples used three different ways of combining the namespace with the rest of the name. And added in #12 that it would be better to give some guidance in the standard to avoid bikeshedding on class name choices.
3. I proposed a new standard in #13 that gave guidance (namespace name followed by specifics), with revised examples. Crell proposed in #14 amending to say only to use the namespace name if necessary to make it unambiguous, and in #22 to say not to use "Drupal" in the name (and there was some more concurring discussion on these two points).
4. I proposed a new standard in #24 that included these ideas, and added an example showing not to use Drupal in the class name.
5. In #26, pounard proposed a "less strict" standard (basically going back to the "common sense" approach from #2, with slightly revised wording), discarding the arguments from #9/12 about the wisdom of having guidance on how to revise the name. Crell stated in #28 that he prefers #26 to #24 (with an addition to say not to use Drupal in the name), and then clarified in #33 that what he preferred was the idea that adding the namespace to the name should not be percieved as the default.
So....
Given all of that, I hereby make one more proposal, which keeps the idea of giving specific guidance, but does not imply that you should include the namespace name in most cases. How's this?
------
Classes should have names that stand alone to tell what they do without having to refer to the namespace (if it is necessary for clarity or to prevent ambiguity, prefix the class name with the last component of the namespace). Class names should be as short as possible without losing information about what they do or leading to misunderstandings, and should not include "Drupal" or "Class" in the name (although interfaces can include "Interface" in the name). Also note that due to the way database classes are loaded, even though it would prevent ambiguity, do not attempt to include the database engine name (MySQL, etc.) in engine-specific database class names.
Examples:
---
Comment #35
Crell commented1) The first parenthetical is a sentence on its own, so should begin with a capital letter and the preceding sentence end with a period.
2) "Interface" is not allowed it an interface name; it is required per current coding standards. :-)
3) I don't know that we need to mention the DB here. We can, but I don't think it's necessary.
Otherwise, #34++
Comment #36
jhodgdonI think mentioning the database stuff is necessary, because as I see it, it's a violation of the "unambiguous" part of the standard. How's this for the intro:
---
Classes and interfaces should have names that stand alone to tell what they do without having to refer to the namespace, and are as short as possible without losing functionality information or leading to ambiguity. Notes:
---
Comment #37
Crell commentedBullet points++
Throw the table into #36 and I think we're done here. Thanks, jhodgdon!
Comment #38
pounardI like #36, but I don't like If it is necessary for clarity or to prevent ambiguity, prefix the name with the last component of the namespace.:
LocalFileTransferactually use the namespace name as suffix, not prefix. It should probably be If it is necessary for clarity or to prevent ambiguity, you can repeat the last component of the namespace in the class name.Aside, the DB parenthesis may be refered as a technical exception, not as a rule, such as: Database driver classes violate this standard due to technical reasons and follow their own standard, refer to the documentation for details.
Otherwise, it seems good to me.
Comment #39
jhodgdonRE #38 - we don't want to use LocalFileTransfer. If you look at the examples table (in #34), we decided (see recap in #36) that we wanted to have consistency and use a prefix, so it's supposed to be FileTransferLocal.
Comment #40
pounardFileTransferLocalsounds less english and less naturally readable thanLocalFileTransfer, I don't understand why this has to be the prefix? I really don't agree with it, it will imply poor names in a lot cases while the whole goal is to make clear and nice class names (yes, I said nice, because it's also nicer to read and write, sounds like a real sentence):Comment #41
Crell commentedFor consistency, I'd ask here "What Would Symfony Do?" :-) I'm not certain what their pattern is off hand; I'd have to check.
I agree that the prefix sometimes reads weirdly, but it also reduces the bikeshed potential. It's a trade-off.
Comment #42
jhodgdonRE #40 - conflicts with Crell's comments in #9/#12 about having something definite to reduce bikeshedding.
My feeling is that if the file transfer classes are called FileTransferLocal, FileTransferRemote, etc., that is just as good as LocalFileTransfer, RemoteFileTransfer, etc. [I made up the "remote" one]. Also, that would have the added benefit that on api.drupal.org, they would all be near each other in the alphabetical list of classes. And I think in most cases, the "prefix with the namespace" rule makes for good reading order anyway... having a standard, and grouping classes together in alphabetical order, makes up for that small readability hit.
So we have a difference of opinion here. Any other votes/ideas?
Comment #43
jhodgdonRE #41 - Symfony appears to be all over the map as far as class names, and not to prefer a prefix. Maybe we shouldn't either.
I personally don't feel *too* strongly about it, but I think (as stated in my previous comment) that prefixes do carry some advantages (reduce bikeshedding, alphabetical grouping) at the (maybe) cost of a small amount of readability (and even that is debatable).
Comment #44
Crell commentedSo a quick glance through the Symfony code we have in /vendor/ suggests that Symfony does somewhat freeform. If anything, it uses a postfix rather than a prefix more often, and occasionally an infix. Examples:
HttpKernel\Event\FilterControllerEvent
HttpKernel\Event\FilterResponseEvent
HttpKernel\Event\KernelEvent
HttpKernel\EventListener\EsiListener
HttpKernel\EventListener\ExceptionListener
HttpKernel\EventListener\RouterListener
HttpFoundation\SessionStorage\ArraySessionStorage
HttpFoundation\SessionStorage\NativeSessionStorage
HttpFoundation\SessionStorage\PdoSessionStorage
HttpFoundation\SessionStorage\SessionStorageInterface
So it seems Symfony favors "natural English" over a formal convention, which is typical for Symfony's coding conventions from what I've seen.
Comment #45
pounardThe natural english feels right in the context where classes that belong together are in the same namespace, so reducing sort problems to small encapsulated namespaces, I am sure that in that context, making classes closer to english seems a good tradeoff.
@#43 About naming classes so they are displayed altogether seems natural when you don't have a namespace, but here we have, and I hope that api.drupal.org listings will list fully qualified names, else it will cause other problems than just sorting, potential name conflicts (even if we do this naming convention in order to avoid it, it's still possible we may end up with some, it doesn't feel always wrong).
Comment #46
Crell commentedI'm willing to go with natural English and risk the potential bikeshed discussions. I'm feeling optimistic today. Let's get this finished off before I start feeling pessimistic again. :-)
Comment #47
pounardI think that going with natural english will solve many of the potential bikesheds the we leave open by not forcing the namespace segment position, except if we leave the decisions to people that don't speak english at all :)
Comment #48
jhodgdonOK. Hopefully final proposal (and I'd like to votes from others besides Crell and poundard on this if possible)... I added "read well" to the main sentence, and took out the "prefix" namespace idea, and slightly reworded the database classes exception:
---
Classes and interfaces should have names that stand alone to tell what they do without having to refer to the namespace, read well, and are as short as possible without losing functionality information or leading to ambiguity. Notes:
Examples:
---
Note: I was going to add an example for core/lib/Drupal/Core/Database/Driver/mysql/Select, but I really think that class should be called SelectQuery (since "select" is also a type of HTML element), so I left that out rather than starting a bikeshed discussion here.
And if you want to have influence on how api.drupal.org handles namespace, discuss on this other issue in the API project:
#1507476: Support namespaces in API module
Comment #49
pounardThanks for the typo in my nickname :) Else it sounds better, it contains everything we need, I think. I'm not sure that without having to refer to the namespace is necessary because the first bullet speak for itself. Aside of that, I'm OK.
Comment #50
jhodgdonsorry for typo, can't type today...
Comment #51
pounardHehe don't worry, as I said, I could live with the actual text.
Comment #52
effulgentsia commentedI like #48.
To add to #44, while those examples all show subnamespace as postfix, an example of prefix is
Symfony\Component\HttpKernel\Controller\ControllerResolver, and an example of infix isSymfony\Component\HttpFoundation\File\MimeType\FileinfoMimeTypeGuesser. So +1 to disambiguating with as natural a name as possible, rather than being too rigid with where to incorporate the subnamespace name. If it looks like in future issues, people bikeshed over whether a prefix, infix, or suffix is more natural, we can add some additional rules (like incorporating distinctions between adjectives and nouns).I agree, but am happy to leave that discussion to a followup if it's controversial.
Comment #53
effulgentsia commentedRereading the comments here, seems like everyone's in agreement, including Dries and webchick, so RTBC. No word from catch since #2, but maybe having this in the RTBC queue will change that.
Comment #54
jhodgdonOK, let's leave this at RTBC for 3 days or so, and then edit coding standards to add #48 to it, if no one objects.
Updating title, and right after saving this comment I will update the issue summary.
Comment #55
chx commentedIf this goes in can we reverse that minor release version raise we did the other day? Please.
Comment #56
catchI've been following this and the plan seems fine to me fwiw.
Comment #57
jhodgdonI have added this information to the Naming section of http://drupal.org/node/608152
So... We now have the policy in place. Do we now need a patch, or should we mark this issue fixed and start another one for the patch (if we even need one)?
Comment #58
Crell commentedNo patch. We can open up patches elsewhere to tweak existing code as appropriate.
Comment #59
jhodgdonOK then, tentatively marking this fixed, pending anyone taking issue with how I added the info to http://drupal.org/node/608152 [not **exactly** as above, as I incorporated it into existing naming section]
Comment #60
effulgentsia commentedPlease see #1477218-34: Convert Tracker tests to PSR-0 / PSR-0 test class discovery and below for questions on how to apply this new standard to test case classes.
Comment #62
jhodgdonFor anyone still following this issue...
#1809930: [meta] Many core class names violate naming standards
Quite a few of our classes are currently violating these standards. Sigh. Some were even changed recently apparently... discuss on that issue please, this one is closed.
Comment #63
jhodgdonSince the time when this standard was officially adopted, what has actually happened is that most of D8 core has not been following it. So, a proposal is underway to revise the standard to be more in line with what we're actually doing, on:
#2027221: [policy] Revisit class naming standards
Comment #63.0
jhodgdonadd summary