It seems like the Customers class should be extended some how to add these items [...]
Perché? Estensione / ereditarietà viene utilizzata quando si desidera centralizzare il codice comune tra oggetti simili. Questo sarebbe un ottimo modo per definire più tipi di Customers
dove potresti averne uno che ha un nome e un cognome per i clienti privati mentre potresti avere un altro con il nome di una società per le imprese. Entrambi condividono proprietà e implementazione comuni in Customer
ma sono le loro rispettive classi in BusinessCustomer
e PrivateCustomer
.
Potresti chiedere "Qual è l'indirizzo del nostro cliente, signor Smith?" Ma potresti davvero chiedere "Qual è il premio del nostro cliente, signor Smith?" - quale premio? Il costo del suo progetto? Ha vinto un premio in un torneo? Questa non è una domanda valida perché questa proprietà non è direttamente associata al cliente ma con qualcos'altro, che a sua volta potrebbe portarci al cliente.
Quindi perché vorresti che il tuo cliente avesse un premio, un caposquadra, una data di inizio, una data di scadenza, informazioni bancarie, ...?
Queste sono tutte proprietà che avresti nel tuo cliente, ma non fanno parte di ciò che rende un cliente un cliente, come nome, indirizzo, data di nascita, ...
Questo è il punto essenziale per avere classi separate.
[...] rather than hard-coded as properties
Proprietà hard-coded? Quelle sono variabili variabili con un buon contenuto variabile. Quelli non devono essere hard-coded affatto - non dovrebbero essere realmente.
Creerai e connetti nuovi oggetti in fase di runtime tramite un modulo nell'interfaccia utente.
Qui hai risposto alla tua domanda da solo:
[1] The customer can have multiple projects.
[2] For each project there will be at least one order or quote associated [...]
[3] In the software requirements it should not be possible to have a Quote or Order without it being tied to a project.
[1] Customer 1:n Projects
[2] Project 1:n Order
[2] Project 1:n Quote
[3] The constructor of your Order and Quote take a Project as parameter to which they will be bound.
Quindi definisci un cliente di classe in cui hai un elenco di progetti. Definisci un progetto di classe in cui hai un elenco di ordini e un elenco di citazioni.
Come detto prima: Ordini e Quotazioni prendono un Progetto per il costruttore e si aggiungono alla loro lista. Quindi puoi creare clienti e progetti e aggiungere i progetti all'elenco di progetti dei clienti.
Is there a design pattern I could be using, such as the decorator pattern?
Gli schemi di progettazione non rendono il tuo programma automaticamente valido ed è dovuto a persone come te, che cercano immediatamente un modello predefinito da seguire, che a molte persone non piacciono.
Inoltre non hai davvero bisogno di schemi complicati qui. Il compito più grande sarà quello di scoprire quali valori si desidera salvare, cosa fare con loro e come crearli in un'interfaccia utente significativa.