Commit 31bafd

2026-06-08 11:43:19 lisa: C05: rebuild Data Dictionary page; fix class-diagram notation table - Rename 'Data Dictionary - Format is not Type' → 'Data Dictionary' (now a full page): when-to-use (data sources), 7 headings, worked student example, three videos (Kalodikis), Wikipedia data/metadata image (CC0), student-example activity, ScotRail extension; keeps the format-vs-type section. Updated 4 inbound links. - Class-diagram page: fix broken 'notation' table — the `<|--` cell contained a pipe that corrupted the markdown table; moved inheritance into prose. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
sd/C05/C05-home.md ..
@@ 12,7 12,7 @@
- [C04 → C05 — Choose, then Detail](/sd/C05/C04%20to%20C05%20-%20Choose%20then%20Detail) — how C05 (detail the chosen idea) differs from C04 (choose *which* idea); why C05 means "buildable", not "prettier"
- [Sketch vs Mock-up](/sd/C05/Sketch%20vs%20Mock-up) — why a rough sketch is not a mock-up, and what "annotated" actually means (the 3–4 / 5–6 boundary)
-- [Data Dictionary — Format is not Type](/sd/C05/Data%20Dictionary%20-%20Format%20is%20not%20Type) — the most common data-dictionary error: the Format column is a storage/display pattern, not a synonym for data type
+- [Data Dictionary](/sd/C05/Data%20Dictionary) — when to use it, the headings to include, a worked example, and why "format" is not "type"
- [IPO Charts — Process Means Steps](/sd/C05/IPO%20Charts%20-%20Process%20Means%20Steps) — why the Process column must be numbered algorithm steps, not a label for the output
- [VCAA Pseudocode — Not Python](/sd/C05/VCAA%20Pseudocode%20Not%20Python) — write language-independent Structured English (`←`, `<>`, `ENDIF`), not Python-flavoured pseudocode
- [Object Descriptions and Class Diagrams](/sd/C05/Object%20Descriptions%20and%20Class%20Diagrams) — the fifth design tool for OOP projects: a class's properties, methods and events, and how to read a class diagram (Level 7–9)
sd/C05/Data Dictionary - Format is not Type.md .. /dev/null
@@ 1,156 0,0 @@
-> **DRAFT** — under teacher review.
-
-# Data Dictionary — "Format" Is Not "Type"
-
-The Hamilton and Alexandra College · Year 12 · 2026
-
-The single most common data-dictionary error is writing a data **type** in the **Format** column. They are not the same thing. This page explains the difference, shows you what correct entries look like, and maps to the VCAA band descriptors.
-
----
-
-## The core distinction
-
-**Type** is the *kind* of data — what category it belongs to.
-
-**Format** is the *storage or display pattern* — the exact shape the value takes.
-
-These are different answers to different questions:
-
-| Question | Column | Example answer |
-|---|---|---|
-| What kind of data is this? | **Type** | `Integer` |
-| What does a valid value look like? | **Format** | `999999` (fixed 6 digits) |
-
-If you write `Integer` in the Format column, you have answered the wrong question. A marker sees that and knows you have conflated two concepts.
-
----
-
-## Format notation key
-
-The format strings use a small set of symbols — memorise these:
-
-| Symbol | Meaning |
-|---|---|
-| `9` or `N` | One digit (0–9) |
-| `X` | One uppercase letter |
-| `x` | One lowercase letter |
-| `YYYY` | Four-digit year |
-| `MM` | Two-digit month |
-| `DD` | Two-digit day |
-| Separator (`,` `.` `-`) | Literal separator character |
-
-So `999999` means "exactly six digits". `Xxxxxxxxxxxxxxx` means "one uppercase letter followed by lowercase letters — the number of `x` characters shows the maximum length".
-
----
-
-## Worked example — a complete data dictionary
-
-These rows come from a client-management system. Read across each row and notice that Type and Format sit in separate columns and say different things.
-
-| Field | Type | Size | Format | Example |
-|---|---|---|---|---|
-| `id` | Integer | 6 | `999999` | 201940 |
-| `firstName` | Text | 50 | `Xxxxxxxxxxxxxxx` | Jane |
-| `lastName` | Text | 50 | `Xxxxxxxxxxxxxxx` | Smith |
-| `DOB` | Date/time | 8 | `YYYY-MM-DD` | 2001-07-19 |
-| `clubMember` | Boolean | 1 | `true/false` | true |
-| `memberYears` | Integer | 2 | `NN` | 6 |
-| `sales` | FloatingPoint | 8 | `NN,NNN.NN` | 12,543.76 |
-
-Notice what each Format entry tells you that the Type alone does not:
-
-- `id` is an Integer — but the Format `999999` tells you it is always **6 digits**, not 1 or 2.
-- `firstName` is Text — but `Xxxxxxxxxxxxxxx` tells you it starts with a **capital** and the rest are lowercase.
-- `DOB` is Date/time — but `YYYY-MM-DD` fixes it to **ISO format**, not DD/MM/YYYY or MM-DD-YYYY.
-- `sales` is FloatingPoint — but `NN,NNN.NN` specifies a **thousands separator** and exactly **2 decimal places**.
-
----
-
-## Why Format matters
-
-Format entries do three jobs in your design documentation:
-
-- **Data consistency** — every value entered follows the same shape, so comparisons and sorting work correctly.
-- **Validation** — your software can reject an entry that does not match the pattern (e.g., a date typed as `19-07-01` instead of `2001-07-19`).
-- **Readability** — another developer reading your data dictionary can reproduce the exact storage structure without guessing.
-
-A Format column filled with type names (`Integer`, `String`, `Boolean`) gives you none of these benefits — it duplicates the Type column and adds no information.
-
----
-
-## VCAA band levels — what's required at each step
-
-VCAA defines a data dictionary as specifying variables, arrays, and GUI objects with reference to data types, data structures, and data sources. The level descriptors build upward:
-
-| Level | What you must include |
-|---|---|
-| **Level 3** | Reference to **data types** (Integer, Text, Boolean, Date/time, FloatingPoint) |
-| **Level 5** | Data types **and data structures** (arrays, records — not just scalar variables) |
-| **Level 7** | Data types, data structures **and data sources** (where does each value come from — user input, database, calculation?) |
-
-You cannot skip levels. If your dictionary has no data structures, you cannot claim Level 5 or above.
-
----
-
-## Common mistakes
-
-### Mistake 1: Format = Type
-
-> ~~`Format: Integer`~~
-
-Write the pattern instead: `999999`, `NN`, etc. If you cannot write a pattern, leave a note and revisit — but do not copy the Type column.
-
-### Mistake 2: Missing data sources at Level 7
-
-> ~~(no Source column, or Source column left blank for half the rows)~~
-
-Every field at Level 7 needs a source. "User input", "calculated from `sales` total", "retrieved from customer database" — these are all valid. Blank is not.
-
-### Mistake 3: Vague sizes
-
-> ~~`Size: large`~~
-
-Size must be a number — the number of characters, bytes, or digits the field can hold. If you do not know, look at your data (the longest plausible value) and choose a round number that covers it.
-
-### Mistake 4: Only scalar variables
-
-A dictionary that lists only individual variables but no arrays or records cannot score Level 5 or above. If your design uses a list of items or a record structure, include it.
-
----
-
-## 🎬 Watch
-
-> [!NOTE]
-> Video coming soon.
-
-**🎯 Watch for:** how an experienced developer reads a Format string and immediately knows the exact shape of valid data — something the Type alone can never tell you.
-
----
-
-## Check Your Understanding
-
-1. A student writes `Text` in the Format column for a `lastName` field. What is the mistake, and what should they write instead?
-
->| ### Answer
->| `Text` is a **type**, not a format. It duplicates the Type column and adds nothing. The correct Format entry is `Xxxxxxxxxxxxxxx` — one uppercase letter followed by lowercase letters, with the number of `x` characters indicating maximum length (e.g. 15 for a 15-character maximum).
-
-2. Your data dictionary has variables and arrays but no data sources. Which VCAA level can you reach, and which is out of reach?
-
->| ### Answer
->| You can reach **Level 5** (data types and data structures). **Level 7** is out of reach because it requires data sources as well. Add a Source column and fill it in for every row to unlock Level 7.
-
-3. What does the Format string `NN,NNN.NN` tell you that the Type `FloatingPoint` does not?
-
->| ### Answer
->| It tells you the value uses a **thousands separator** (`,`) and is stored to exactly **two decimal places**. `FloatingPoint` alone does not specify either of these — you could have `12543.7` or `12,543.759` and both would be valid floats, but only `12,543.76` matches the format.
-
----
-
-## See also
-
-- [IPO Charts — Process Means Steps](/sd/C05/IPO%20Charts%20-%20Process%20Means%20Steps)
-- [Sketch vs Mock-up](/sd/C05/Sketch%20vs%20Mock-up)
-- [Ryan's Tutorials — Data Dictionary](https://ryanstutorials.net/software-design-and-development/data-dictionary.php) — AU secondary-pitched; shows a "Format for Display" column with N/X notation
-- [C05 Resources](/sd/Resources/C05-Resources)
-
-← Back to [C05 Home](/sd/C05/C05-home) · [VCE Software Development Hub](/sd/VCE%20Software%20Development%20Hub)
/dev/null .. sd/C05/Data Dictionary.md
@@ 0,0 1,187 @@
+> **DRAFT** — under teacher review.
+
+# Data Dictionary
+
+The Hamilton and Alexandra College · Year 12 · 2026
+
+A data dictionary documents **every piece of data your software stores** — what each field is called, what type it is, how big it is, and what a valid value looks like. It is the design tool that turns "we'll store some student details" into a precise specification someone could actually build a database from.
+
+---
+
+## When do you use a data dictionary?
+
+You use a data dictionary for your **data sources** — the data your software *stores and reads back*. In a real system that is almost always a **database**; in your SAT it might be a database, a file, or a structured collection in code. **If your solution stores data, it needs a data dictionary.**
+
+The picture below shows the idea. The top table is the actual **data**; the bottom table is the **data dictionary** that describes it — the name of each column, its data type, its size, and what it means.
+
+![A sample data table and the data dictionary (metadata) that describes each of its columns](Data%20Dictionary/data-dictionary-metadata.png)
+
+The data dictionary is *metadata*: data about your data.
+
+---
+
+## Video 1 — What is a data dictionary?
+
+**🎯 Watch for:** how every column in the stored data gets one row in the dictionary, and how the dictionary fixes the type and size of each field *before* any data is entered.
+
+{{Video|src=https://www.youtube.com/watch?v=kH0bcw9P2Lc}}
+
+> [!NOTE]
+> This video (and the two below) are from an AU teacher pitched at NSW HSC Software Design & Development. The concept is identical to VCE — just note the course name differs.
+
+---
+
+## The headings to include
+
+A strong data dictionary uses these columns:
+
+| Heading | What it records |
+|---|---|
+| **Field name** | the variable / column name |
+| **Data type** | Integer, Text, Boolean, Date/time, Float |
+| **Data format** | the storage/display *pattern* (e.g. `999999`, `YYYY-MM-DD`) |
+| **Size** | the maximum length |
+| **Description** | what the field is for |
+| **Example** | a sample valid value |
+| **Validation** | the rule that keeps the value valid |
+
+> [!TIP]
+> **The three you can never leave out: field name, data type, description.** Size, format, example and validation make a dictionary *strong* — but a dictionary without name, type and description is not a dictionary at all.
+
+---
+
+## A worked example
+
+Here is a data dictionary for the **student records** a school timetable app might store:
+
+| Field name | Data type | Data format | Size | Description | Example | Validation |
+|---|---|---|---|---|---|---|
+| `studentID` | Integer | `999999` | 6 | Unique ID for each student | 123456 | Required; exactly 6 digits |
+| `firstName` | Text | `Xxxxxxxxxx` | 50 | Student's given name | Jane | Required; letters only |
+| `lastName` | Text | `Xxxxxxxxxx` | 50 | Student's family name | Smith | Required; letters only |
+| `DOB` | Date/time | `YYYY-MM-DD` | 8 | Date of birth | 2009-07-19 | Required; valid date; not in the future |
+| `yearLevel` | Integer | `NN` | 2 | Current year level | 11 | Required; between 7 and 12 |
+| `email` | Text | `xxx@xxx` | 100 | School email for notifications | jsmith@hac.vic.edu.au | Required; valid email format |
+| `isBoarder` | Boolean | `true/false` | 1 | Whether the student boards | false | Required; true or false |
+
+Notice that **Data type** and **Data format** are two different columns — that is the trap in the next section.
+
+---
+
+## "Data format" is not "data type"
+
+This is the single most common data-dictionary mistake.
+
+**Data type** is the *kind* of data — Integer, Text, Boolean, Date/time, Float.
+
+**Data format** is the *storage or display pattern* — the exact shape a valid value takes.
+
+If you write `Integer` in the Format column, you have answered the wrong question. The format strings use a small set of symbols:
+
+| Symbol | Meaning |
+|---|---|
+| `9` or `N` | one digit (0–9) |
+| `X` | one uppercase letter |
+| `x` | one lowercase letter |
+| `YYYY` `MM` `DD` | four-digit year, two-digit month, two-digit day |
+
+So `studentID` has type **Integer** but format `999999` ("exactly six digits"); `DOB` has type **Date/time** but format `YYYY-MM-DD` ("ISO date, not DD/MM/YYYY"). The type tells you *what kind*; the format tells you *what a valid value looks like*.
+
+> [!TIP]
+> External reference: [Ryan's Tutorials — Data Dictionary](https://ryanstutorials.net/software-design-and-development/data-dictionary.php) shows a "Format for Display" column with this N/X notation (AU, secondary-pitched).
+
+---
+
+## Video 2 — Data dictionaries in code
+
+**🎯 Watch for:** how the same idea applies when the data lives inside a program (objects, structures), not just a database table.
+
+{{Video|src=https://www.youtube.com/watch?v=MdMsjxT-EoU}}
+
+---
+
+## The VCAA levels
+
+The level descriptors build upward:
+
+- **Level 3** — reference to **data types** (Integer, Text, Boolean, Date/time, Float).
+- **Level 5** — data types **and data structures** (arrays, records — not just single variables).
+- **Level 7** — data types, data structures **and data sources** (where does each value come from: user input, a database, a calculation?).
+
+You cannot skip levels — a dictionary with no data structures cannot reach Level 5.
+
+---
+
+## Activity — your turn
+
+1. Build a data dictionary for the **student data your own system stores**. Use all seven headings above. Aim for at least five fields.
+2. Then watch one student's attempt:
+
+**🎯 Watch for:** which fields they included, and whether their Format column is really a format — or just a repeated data type.
+
+{{Video|src=https://www.youtube.com/watch?v=xu0c1Dm9xWk}}
+
+3. Write down: **what do you agree with, and what would you change?** Be specific — name the field and the column.
+
+---
+
+## Common mistakes
+
+### Mistake 1: Format = Type
+
+> ~~`Format: Integer`~~
+
+Write the *pattern* instead: `999999`, `NN`, `YYYY-MM-DD`. If you cannot write a pattern, you have probably copied the Type column.
+
+### Mistake 2: Missing data sources at Level 7
+
+Every field at Level 7 needs a source — "user input", "calculated from `DOB`", "retrieved from the student database". Blank does not score.
+
+### Mistake 3: Vague sizes
+
+> ~~`Size: large`~~
+
+Size is a **number** — the maximum characters or digits the field can hold.
+
+---
+
+## Check Your Understanding
+
+1. What are the three headings every data dictionary must include?
+
+>| **Field name, data type, and description.** Size, format, example and validation make it stronger, but those three are the minimum that makes it a data dictionary.
+
+2. `email` has data type **Text**. What might its *format* be, and why is that different information?
+
+>| A format such as `xxx@xxx` (or `name@domain`) shows the *shape* a valid email takes — text before an `@`, a domain after it. The type "Text" only says it is characters; the format says how those characters must be arranged.
+
+3. Your dictionary lists variables and arrays but no data sources. Which VCAA level can you reach, and which is out of reach?
+
+>| You can reach **Level 5** (types and structures). **Level 7** needs data sources as well — add a source for every field to unlock it.
+
+---
+
+## Extension — a data dictionary you can play with
+
+ScotRail's station announcements are stitched together from a **database of pre-recorded phrases**. This tool lets you assemble your own announcement from those stored fragments:
+
+- [ScotRail — assemble a sentence](https://scotrail.datasette.io/scotrail/assemble_sentence?terms=i+am+sorry%2C+scotrail%2C+from%2C+bath+spa%2C+is+delayed%2C+due+to%2C+bomb)
+
+Try assembling a sentence, then think about how it works: each phrase is one **record** in a data source. If you wrote the data dictionary for that data source, what fields would it need — the phrase text? an audio-file reference? a category? That is the same design tool you just practised, behind a real system.
+
+---
+
+## Credits
+
+- Data table / data-dictionary illustration — [mrAnmol](https://commons.wikimedia.org/wiki/User:MrAnmol), via Wikimedia Commons (CC0).
+
+---
+
+## See also
+
+- [Object Descriptions and Class Diagrams](/sd/C05/Object%20Descriptions%20and%20Class%20Diagrams) — each class attribute is a data-dictionary field
+- [IPO Charts — Process Means Steps](/sd/C05/IPO%20Charts%20-%20Process%20Means%20Steps)
+- [VCAA Pseudocode — Not Python](/sd/C05/VCAA%20Pseudocode%20Not%20Python)
+- [C05 Resources](/sd/Resources/C05-Resources)
+
+← Back to [C05 Home](/sd/C05/C05-home) · [VCE Software Development Hub](/sd/VCE%20Software%20Development%20Hub)
/dev/null .. sd/C05/Data Dictionary/data-dictionary-metadata.png
sd/C05/IPO Charts - Process Means Steps.md ..
@@ 155,7 155,7 @@
## See also
- [VCAA Pseudocode — Not Python](/sd/C05/VCAA%20Pseudocode%20Not%20Python) — turn each IPO Process column into formal pseudocode
-- [Data Dictionary — Format is not Type](/sd/C05/Data%20Dictionary%20-%20Format%20is%20not%20Type)
+- [Data Dictionary](/sd/C05/Data%20Dictionary)
- [Sketch vs Mock-up](/sd/C05/Sketch%20vs%20Mock-up)
← Back to [C05 Home](/sd/C05/C05-home) · [VCE Software Development Hub](/sd/VCE%20Software%20Development%20Hub)
sd/C05/Object Descriptions and Class Diagrams.md ..
@@ 59,7 59,8 @@
| `age : int` | An **attribute** and its **data type** |
| `isMammal()` | A **method** (an action the object can perform) |
| `isUpcoming() : bool` | A method and its **return type** |
-| `Animal <|-- Duck` | **Inheritance** — "Duck *is a* Animal" |
+
+**Relationships** are shown with arrows between classes. The inheritance arrow `<|--` means *"is a kind of"* — writing `Animal <|-- Duck` says **Duck is a kind of Animal**, so Duck inherits all of Animal's attributes and methods and then adds its own. (Two others you may meet: *composition* `*--`, "is made of", and *association* `-->`, "uses".)
> [!TIP]
> Every attribute should have a **data type** and every method should show its **parameters and return type**. "`age`" alone is weak; "`+ age : int`" is design-ready. This is exactly the precision that lifts C5-1 from the middle bands into 7–9.
@@ 86,7 87,7 @@
The object description is not an island — it ties the whole detailed design together:
-- **Properties ↔ data dictionary.** Every attribute is a field. `studentID : int` becomes a data-dictionary row with a type, size and format. See [Data Dictionary — Format is not Type](/sd/C05/Data%20Dictionary%20-%20Format%20is%20not%20Type).
+- **Properties ↔ data dictionary.** Every attribute is a field. `studentID : int` becomes a data-dictionary row with a type, size and format. See [Data Dictionary](/sd/C05/Data%20Dictionary).
- **Methods ↔ pseudocode.** At Level 9 you write pseudocode for each method. The `is_passing()` example on the pseudocode page is exactly a method from a class diagram, written out. See [VCAA Pseudocode — Not Python](/sd/C05/VCAA%20Pseudocode%20Not%20Python).
- **Classes ↔ mock-ups and IPO charts.** The objects are what sit *behind* your screens and processes.
@@ 141,7 142,7 @@
## See also
- [VCAA Pseudocode — Not Python](/sd/C05/VCAA%20Pseudocode%20Not%20Python) — write the pseudocode for each method (Level 9)
-- [Data Dictionary — Format is not Type](/sd/C05/Data%20Dictionary%20-%20Format%20is%20not%20Type) — each attribute is a data-dictionary field
+- [Data Dictionary](/sd/C05/Data%20Dictionary) — each attribute is a data-dictionary field
- [Sketch vs Mock-up](/sd/C05/Sketch%20vs%20Mock-up)
- [C05 Resources](/sd/Resources/C05-Resources)
sd/C05/Sketch vs Mock-up.md ..
@@ 125,7 125,7 @@
- [Annotated Mock-up in Excalidraw](/sd/C05/Annotated%20Mock-up%20in%20Excalidraw)
- [C04 → C05 — Choose, then Detail](/sd/C05/C04%20to%20C05%20-%20Choose%20then%20Detail)
-- [Data Dictionary — Format is not Type](/sd/C05/Data%20Dictionary%20-%20Format%20is%20not%20Type)
+- [Data Dictionary](/sd/C05/Data%20Dictionary)
- [Design Principles vs UX Characteristics](/sd/C05/Design%20Principles%20vs%20UX%20Characteristics)
---
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