Ik heb momenteel een discussie met collega's over het volgende:
In onze codebase hebben we een Model class, deze implementeert een ModelInterface.
Het object is vooral een propertybag met getters en setters, onder andere getId() en setId($id),
deze getters en setters staan ook in de interface.
Er zijn functies die enkel de id van het model nodig hebben, echter enkel een int of string aan de functie meegeven is niet zo fraai, dus wordt altijd het gehele model object meegegeven, maar soms hoeft deze helemaal niet ingeladen te worden omdat je enkel in het id geïnteresseerd bent en het model object is vrij zwaar.
Daarom is er een ModelReference object in het leven geroepen. Deze implementeert de ModelInterface, maar bij alle functies behalve de get en set id wordt een NotImplementedException gegooid.
Een functie die enkel een id nodig heeft vraagt om een ModelInterface dus je kan er zo een volledig model ingooien als je die toch al hebt, maar ook enkel een reference.
Dit vind ik een monsterlijke oplossing omdat het een leugen is, je zegt dat je een interface implementeert, maar doet dat eigenlijk niet. En in de declaratie van de functie is niet duidelijk of je aan een reference genoeg hebt, zo kan je per ongeluk een reference meegeven aan een functie die andere functionaliteit van de model wil gebruiken en als je het niet zeker weet geef je maar het volledige model mee voor de zekerheid en ga je die alsnog inladen terwijl je die misschien niet eens nodig hebt.
Ik heb voorgesteld om de ModelReference te deprecaten en het id veld in een model te wrappen in een ModelId value object zodat we die voortaan aan een functie mee kunnen geven die enkel de ID nodig heeft.
Mijn collega's zijn echter nog niet overtuigd, ze vinden een wrapper-class overkill en onnodig veel code en vinden het idee van een gedeelde interface van een model en een modelreference een groot goed. Een idee zou bijvoorbeeld kunnen zijn om een ModelReferenceInterface in het leven te roepen. De ModelReference implementeert dan nog enkel deze interface en de ModelInterface kan deze extenden. Echter dan moet op alle plekken waar nu een ModelInterface gevraagd wordt en een ModelReference gegeven wordt de signature van de functie worden aangepast.
Een andere optie die voorbij kwam was om een proxy te gebruiken. We gebruiken al een proxy voor de Model class en we zouden de class zo kunnen inrichten dat enkel de id direct wordt ingeladen en alle andere properties via de proxy. Ik heb daar zelf geen goed gevoel bij, maar ik heb eigenlijk niet de argumenten waarom niet.
Graag hoor ik hoe jullie dit op zouden lossen en natuurlijk vooral ook waarom.
In onze codebase hebben we een Model class, deze implementeert een ModelInterface.
Het object is vooral een propertybag met getters en setters, onder andere getId() en setId($id),
deze getters en setters staan ook in de interface.
Er zijn functies die enkel de id van het model nodig hebben, echter enkel een int of string aan de functie meegeven is niet zo fraai, dus wordt altijd het gehele model object meegegeven, maar soms hoeft deze helemaal niet ingeladen te worden omdat je enkel in het id geïnteresseerd bent en het model object is vrij zwaar.
Daarom is er een ModelReference object in het leven geroepen. Deze implementeert de ModelInterface, maar bij alle functies behalve de get en set id wordt een NotImplementedException gegooid.
Een functie die enkel een id nodig heeft vraagt om een ModelInterface dus je kan er zo een volledig model ingooien als je die toch al hebt, maar ook enkel een reference.
Dit vind ik een monsterlijke oplossing omdat het een leugen is, je zegt dat je een interface implementeert, maar doet dat eigenlijk niet. En in de declaratie van de functie is niet duidelijk of je aan een reference genoeg hebt, zo kan je per ongeluk een reference meegeven aan een functie die andere functionaliteit van de model wil gebruiken en als je het niet zeker weet geef je maar het volledige model mee voor de zekerheid en ga je die alsnog inladen terwijl je die misschien niet eens nodig hebt.
Ik heb voorgesteld om de ModelReference te deprecaten en het id veld in een model te wrappen in een ModelId value object zodat we die voortaan aan een functie mee kunnen geven die enkel de ID nodig heeft.
Mijn collega's zijn echter nog niet overtuigd, ze vinden een wrapper-class overkill en onnodig veel code en vinden het idee van een gedeelde interface van een model en een modelreference een groot goed. Een idee zou bijvoorbeeld kunnen zijn om een ModelReferenceInterface in het leven te roepen. De ModelReference implementeert dan nog enkel deze interface en de ModelInterface kan deze extenden. Echter dan moet op alle plekken waar nu een ModelInterface gevraagd wordt en een ModelReference gegeven wordt de signature van de functie worden aangepast.
Een andere optie die voorbij kwam was om een proxy te gebruiken. We gebruiken al een proxy voor de Model class en we zouden de class zo kunnen inrichten dat enkel de id direct wordt ingeladen en alle andere properties via de proxy. Ik heb daar zelf geen goed gevoel bij, maar ik heb eigenlijk niet de argumenten waarom niet.
Graag hoor ik hoe jullie dit op zouden lossen en natuurlijk vooral ook waarom.