Why does Java source code contain so many single-letter variables? [closed]
https://softwareengineering.stackexchange.com/questions/341503
-
07-01-2021 - |
質問
I have been reading the source code of some Java library classes, specifically CompletableFuture
. I noticed that the authors are making extensive use of cryptic (single-letter) variables in the code, which makes the code arguably unreadable and difficult to track.
Is there a specific reason/rationale behind this approach ? (since the official Java naming conventions suggest semantically-rich variables naming, avoiding single letter variables, except in specific contexts, such as for loops)
I found this related question, but I think it's not a duplicate, since I am talking about the standard libraries of Java (not snippets or tutorials), which should ideally be optimal in terms of maintainability and readability.
I also think that answers to these questions are not highly opinion-based, because they have to be backed up with data in order to be solid. For instance, @Jorg's answer below is backed up by a very thorough explanation, showing how single-letter variables might be part of the domain model and instead be intent-revealing to experienced engineers (especially for non-public, internal components).
解決
Identifiers should describe the semantics of the things they are identifying in the domain language such that they can be easily grasped by domain experts. I am not an expert in the domain of low-level concurrent standard library API implementation on the HotSpot JVM, so I cannot say authoritatively whether or not those variable names make sense.
There are a few I can comment on, however:
fn
is a widely-used abbreviation of "function".It is common in functional programming to simply call an entity of an unknown type
x
and a collection of such entitiesxs
(i.e. "exes" with a plural-"s" to indicate a collection). If it is a value that has the type of a type variable, then it will often be named after that type variable, i.e. the two arguments of a function of type(A, B) → C
will often be calleda
andb
. You can see that in some instances here:t
is an unknown value of the unknown typeT
,u
is an unknown value of the unknown typeU
,tr
isr
casted toT
.
ex
is a standard name for anException
object in Java.e
is anExecutor
.r
is the result.- I believe
p
is a promise.
In general, coming up with names in highly abstract, general code can be challenging, because, well, it's highly abstract and general: it is supposed to work in many different contexts with many different things of many different types, completely independent of any particular domain.