# Qualified Name

Key: `technology.code.qualified_name`

A dotted, reverse-DNS-style fully-qualified identifier: three or more dot-separated identifier segments naming a namespaced code symbol (Java/.NET package or class, config key, module path).

Page: <https://meridian.online/docs/projects/finetype/types/technology/code/qualified_name>

Samples: `com.google.javascript.jscomp.Compiler`, `org.apache.commons.math.fraction.Fraction`, `Avalonia.UnitTests.Controls.ContentControl`

## Background

### Origin

The Java Language Specification says names in programs are either simple, consisting of a single identifier, or qualified, consisting of a sequence of identifiers separated by "." tokens.[[1]](https://docs.oracle.com/javase/specs/jls/se21/html/jls-6.html) Under the Java Language Specification, the fully qualified name of a top level class declared in a named package is the package's fully qualified name, followed by ".", followed by the class's simple name.[[1]](https://docs.oracle.com/javase/specs/jls/se21/html/jls-6.html) The Java Language Specification builds the fully qualified name of a subpackage the same way, from the containing package's fully qualified name, a "." and the subpackage's simple name.[[1]](https://docs.oracle.com/javase/specs/jls/se21/html/jls-6.html)

The Java Language Specification suggests forming a unique package name by reversing an Internet domain name, component by component, so that oracle.com becomes the prefix com.oracle.[[1]](https://docs.oracle.com/javase/specs/jls/se21/html/jls-6.html) The Java Language Specification gives com.nighthacks.scrabble.dictionary and edu.cmu.cs.bovik.cheese as examples of unique package names.[[1]](https://docs.oracle.com/javase/specs/jls/se21/html/jls-6.html) The Java Language Specification describes the reversed-domain convention as a way to piggyback package naming on an existing, widely known unique name registry instead of creating a separate registry for package names.[[1]](https://docs.oracle.com/javase/specs/jls/se21/html/jls-6.html) The Java Language Specification states that a package's name is not meant to imply where the package is stored on the Internet.[[1]](https://docs.oracle.com/javase/specs/jls/se21/html/jls-6.html) The Java Language Specification suggests converting a hyphen in a domain name into an underscore when forming a package name.[[1]](https://docs.oracle.com/javase/specs/jls/se21/html/jls-6.html)

Microsoft's Framework Design Guidelines give the template \<Company\>.(\<Product\>\|\<Technology\>)\[.\<Feature\>\]\[.\<Subnamespace\>\] for naming .NET namespaces.[[2]](https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-namespaces) Microsoft's Framework Design Guidelines advise prefixing namespace names with a company name to prevent namespaces from different companies having the same name.[[2]](https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-namespaces) Microsoft's Framework Design Guidelines advise PascalCasing, with namespace components separated by periods, as in Microsoft.Office.PowerPoint.[[2]](https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-namespaces) Python's glossary defines a qualified name as a dotted name showing the path from a module's global scope to a class, function or method defined in that module, as defined in PEP 3155.[[3]](https://docs.python.org/3/glossary.html) Python's glossary gives email.mime.text as an example of a module's fully qualified name.[[3]](https://docs.python.org/3/glossary.html)

FineType's registry describes this type as three or more dot-separated identifier segments naming a namespaced code symbol, such as a Java or .NET package or class, a config key or a module path.[[4]](https://github.com/meridian-online/finetype/blob/main/labels/definitions_technology.yaml) FineType's registry validates the type with the pattern ^\[A-Za-z\_\]\[A-Za-z0-9\_\]\*(\\.\[A-Za-z\_\]\[A-Za-z0-9\_\]\*){2,}$.[[4]](https://github.com/meridian-online/finetype/blob/main/labels/definitions_technology.yaml)

### Use

Apache Maven's naming conventions say each groupId should follow Java's package name rules, starting with a reversed domain name you control.[[5]](https://maven.apache.org/guides/mini/guide-naming-conventions.html) Apache Maven's naming conventions give org.apache.maven, org.apache.commons and com.google.guava as example groupIds.[[5]](https://maven.apache.org/guides/mini/guide-naming-conventions.html) Apache Maven's naming conventions note that many legacy projects use single-word group IDs instead.[[5]](https://maven.apache.org/guides/mini/guide-naming-conventions.html)

The Java Language Specification says the binary name of a member class consists of the binary name of its enclosing class, followed by $, followed by the member's simple name.[[6]](https://docs.oracle.com/javase/specs/jls/se21/html/jls-13.html) The Java Language Specification says the binary name of an anonymous class is its enclosing class's binary name followed by $ and a non-empty sequence of digits.[[6]](https://docs.oracle.com/javase/specs/jls/se21/html/jls-13.html)

Microsoft's documentation for Type.FullName says the fully qualified name includes the type's namespace but not its assembly.[[7]](https://learn.microsoft.com/en-us/dotnet/api/system.type.fullname)

## Sources

1. [Chapter 6. Names](https://docs.oracle.com/javase/specs/jls/se21/html/jls-6.html) — standard
2. [Names of Namespaces - Framework Design Guidelines](https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-namespaces) — documentation
3. [Glossary](https://docs.python.org/3/glossary.html) — documentation
4. [definitions\_technology.yaml](https://github.com/meridian-online/finetype/blob/main/labels/definitions_technology.yaml) — FineType
5. [Naming conventions of Maven coordinates (groupId, artifactId, and version)](https://maven.apache.org/guides/mini/guide-naming-conventions.html) — documentation
6. [Chapter 13. Binary Compatibility](https://docs.oracle.com/javase/specs/jls/se21/html/jls-13.html) — standard
7. [Type.FullName Property (System)](https://learn.microsoft.com/en-us/dotnet/api/system.type.fullname) — documentation
