<!-- Generated from applied-computing-au vic/unit3-4/sat/C07-2026/C07-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
# Naming Conventions — GDScript

**Skill codes on this page**

| Code | Level | Skill |
|---|---|---|
| C711 | 1–2 | identifies naming conventions |
| C721 | 3–4 | applies naming to variables |
| C731 | 5–6 | applies naming to interface controls |
| C741 | 7–8 | applies naming to code structures |
| C751 | 9–10 | applies naming to ALL solution elements |

**Definition.** A *naming convention* is an agreed set of rules by which to name source code elements such as variables, functions, classes, methods and objects. (*Camel case:* each word after the first starts with a capital. *Snake case:* words joined with underscores. *Hungarian notation:* the name encodes purpose and type.)

C7-1 is one ladder: each level applies the convention to **more kinds of element**. In the validation Part B naming audit you state your convention, then fix non-compliant names live.

## The Godot house convention

| Element | Convention | Example |
|---|---|---|
| Variables | `snake_case`, descriptive | `pairs_to_find`, `is_concession` |
| Constants | `UPPER_SNAKE_CASE` | `DAILY_CAP` |
| Functions | action-verb `snake_case` | `calculate_fare()` |
| Classes (`class_name`) | `PascalCase` | `MykiCard` |
| Nodes / interface controls | `PascalCase`, purpose + control type | `AddButton`, `BalanceLabel` |
| Signals | `snake_case`, past tense | `fare_calculated` |
| Files and scenes | `snake_case` | `team_row.gd`, `card.tscn` |

This is the convention every studied project uses — and the one Godot's own style guide recommends.

## C711 — Identify your convention

Level 1–2 is **stating** the rules, in internal documentation, before applying them:

```gdscript
# C711 — naming conventions in this project:
# variables and functions snake_case; constants UPPER_SNAKE_CASE;
# classes and nodes PascalCase; signals snake_case, past tense
```

**Earns the tick:** the convention written down where the marker can find it. In the naming audit, this is the sentence you open with.

## C721 — Variables

Bad names hide meaning; the fix is descriptive `snake_case`:

```gdscript
# ✗ before — earns no C721: the names hide the meaning
var b := 20.00      # what is b?
var f := 5.30       # what is f?
```

```gdscript
var balance: float = 20.00   # C721 — descriptive snake_case
var fare: float = 5.30       # C721
var is_concession := false   # C721 — booleans read as yes/no questions
```

**In the studied projects:** `pairs_to_find`, `is_busy`, `flip_back_delay` (tile-matching-game); `points_for_win`, `team_name` (club-ladder). Every boolean starts `is_` — the name reads as the question the code asks.

**Magic numbers are a naming problem too.** A bare `0.5` says nothing; a named constant says everything:

```gdscript
# ✗ before — magic number, earns no C721
fare = FARE_TABLE[zone] * 0.5              # what is 0.5?
```

```gdscript
const CONCESSION_DISCOUNT := 0.5           # C721 — the rule now has a name
fare = FARE_TABLE[zone] * CONCESSION_DISCOUNT
```

**Earns the tick:** no single-letter names (a loop `i` is fine), booleans as `is_`/`has_` questions, magic numbers replaced by named constants.

## C731 — Interface controls

Name every Control node **purpose + control type**, in `PascalCase`:

```text
NameField    (LineEdit)     ← what it holds + what it is
AddButton    (Button)
TitleLabel   (Label)
WarningLabel (Label)
```

Those four are club-ladder's real scene — the name tells you what the control does before you click it. The anti-pattern is Godot's defaults left in place: `Button1`, `LineEdit`, `Label2`.

```gdscript
# C731 — controls named purpose + type, so the code reads in English
%AddButton.pressed.connect(_on_add_pressed)
name_field.text = ""
```

**Earns the tick:** every control in the picked feature's scene named this way — the audit will open your scene tree and look.

## C741 — Code structures

Functions get **action verbs**; classes get **PascalCase nouns**:

```gdscript
# ✗ before — earns no C741: the name says nothing
func f(x):            # what does f do?
```

```gdscript
func calculate_fare(zone: int) -> float:   # C741 — verb says what it does
```

```gdscript
class_name MykiCard   # C741 — PascalCase noun, a clear concept
```

**In the studied projects:** `load_csv()`, `mark_matched()`, `start_new_game()` (tile-matching-game); `class_name Team`, `Season`, `Ladder` (club-ladder) — every function name is a verb phrase, every class a noun.

## C751 — All solution elements

Level 9–10 extends the convention to **everything that has a name**: signals, scenes, files, autoloads — consistently, throughout.

```gdscript
# club-ladder — the convention on every element kind
signal result_recorded(team: Team, result: String)   # C751 — signal: past tense
signal remove_requested(team: Team)                  # C751
# files: team_row.gd, season.gd — snake_case
# scenes: main.tscn, team_row.tscn — snake_case
```

**Earns the tick:** open any file in the project and the convention holds — variables, constants, functions, classes, nodes, signals, files. One inconsistent corner (`studentName` beside `student_id`) drops you back.

## Check Your Understanding

1. What convention does a Godot node (interface control) use, and what two things should its name say?

>| ### Answer
>| `PascalCase`, saying purpose + control type — `AddButton`, `BalanceLabel`.

2. Why is `fare * 0.5` a naming problem, and what is the fix?

>| ### Answer
>| `0.5` is a magic number — its meaning is invisible. Replace it with a named constant: `CONCESSION_DISCOUNT := 0.5`.

3. What separates C751 from C741?

>| ### Answer
>| C741 covers code structures (functions and classes). C751 extends the convention to *every* named element — signals, scenes, files, autoloads — with no inconsistent corners anywhere.
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9