Il significato di un diagramma di classe dipende dal livello di astrazione a cui stai modellando.
Ad esempio, puoi creare un diagramma di classe del mondo reale . In tal caso, la classe 'Squalo' ovviamente non ha un 'id', perché gli squali non hanno id in natura. Potrebbe avere attributo 'lunghezza' e operazione 'eatFish'.
Ma forse stai creando un diagramma di classe per definire lo schema di un database relazionale contenente una tabella Shark, in cui ogni squalo ha un ID univoco. In tal caso, devi mostrare 'id' come attributo della classe 'Squalo'. Forse vuoi modellare le sue stored procedure come operazioni della classe.
Tra questi due estremi, potresti voler modellare su un livello intermedio di astrazione. Ad esempio, potresti creare un modello di dati concettuali per un gioco di squalo, ovvero un modello di dati che definisce il modo in cui l'utente percepisce i dati dell'applicazione. In tal caso, se l'applicazione espone gli ID all'utente, è necessario modellarlo come attributo di classe Shark. Ma se l'applicazione usa id solo internamente, allora non lo fai.
Un ultimo esempio: potresti voler modellare il tuo codice sorgente , scritto in un linguaggio orientato agli oggetti. In tal caso, se 'id' è un membro della classe 'Shark' nel codice sorgente, allora 'id' è un attributo nel tuo diagramma e altrimenti non lo è.
Per riassumere, se si crea un diagramma di classe, è necessario definire a quale livello di astrazione si sta modellando e cosa intendi con il concetto di "classe". Questo ti fornirà indicazioni su quali attributi dovrebbe avere.