I’m senior software engineer specialized in declarative designs and S.O.L.I.D. and Agile lover.
It’s the indirection, stupid !
Object Oriented Design Tip # 1
Identifiers are (almost) never present on the real world. So why should you build your models with them ?
Objects can send messages to other objects only if they know them.
Knowledge can be accidental (temporary) or essential (strong).
Object1 knows essentially object2 and that relation must be named. And naming is very important when dealing with objects.
Role naming is extremely important.
Never qualify a relation exposing referenced object implementation.
object1 should not name the variable object2id.
Making such thing would imply a relational database implementation and thus mixing essential model specification with an accidental relational implementation.
Objects should know other objects, not ids !