Frameworks Aren't Magic, They Just Save You Typing
What a framework actually buys you when you start coding a design, and why the fields every entity needs live on one shared base type instead of being repeated.
Turning a class diagram into actual code starts with a question worth answering honestly first: what is a framework even doing for you?
What a Framework Actually Buys You
A framework doesn't introduce a new capability. It removes work you'd otherwise have to do by hand. Wiring dependencies together, connecting to a database, writing accessor methods, logging, all of that is code you could write yourself.
A framework just generates or automates it, so you don't have to.
That's worth sitting with, because it's easy to start treating a framework's conveniences as if they're doing something fundamentally different from what you'd write manually. They aren't. If a framework's shortcut ever gets in the way of something specific you need, the underlying mechanism is still just code, and you can still reach past the shortcut and do it by hand.
This is exactly why wiring dependencies together manually, with plain constructors, earned its place earlier in this series instead of reaching for a dependency-injection container. Not because containers are bad, but because doing the wiring by hand is what actually demonstrates the skill an LLD round is testing. A framework becomes worth reaching for once you already understand what it's saving you from typing, not before.
Configuration Belongs Outside Your Code, Whatever the Stack
One convenience worth calling out on its own: real applications never hardcode things like a database URL, an API key, or which port to run on directly into application code. Those live in a separate configuration source, read in at startup.
Every ecosystem names this differently, a properties file, a YAML file, an environment file, but the discipline underneath is identical everywhere. It's the same reason this project's own setup keeps that information in its own .env file instead of writing it into the code directly.
A Shared Base Type for the Fields Every Entity Needs
Every single entity in this design needs an ID. Many need timestamps for when a record was created or last touched. Repeating those fields on every class is the same mistake as repeating a relationship that's already reachable somewhere else.
The fix is a shared base type that every entity extends, holding exactly those common fields once. City, Show, Ticket, and everything else in this design inherit an ID from one place instead of redefining it over and over. It's the same discipline that's shown up throughout this series in different clothes: whatever can live in one shared place instead of being copied everywhere, should.
Keep reading