First, let me show you an example (written in ActionScript 3.0):
class GameObject {
public static function MakeFromName( pName:String,
pAtlas:TextureAtlas = null,
pGameData:Object = null ):GameObject {
// If these arguments are not passed, they default to the static INSTANCE's
// currentAtlas and currentData.
if (pAtlas == null) pAtlas = GameBaseClass.INSTANCE.currentAtlas; // <--
if (pGameData == null) pGameData = GameBaseClass.INSTANCE.currentData; // <--
var theSymbolData:Object = pGameData.symbols[pName];
var theSymbolTextures:Vector.<Texture> = pAtlas.getTextures( pName );
var newGO:GameObject = new GameObject();
newGO.MakeFromData( pName, theSymbolTextures, theSymbolData );
return newGO;
}
// MakeFromData defined somewhere down in the code...
}
I'm having this debate with a coworker regarding the above 'null' (basically optional) parameters.
To me, it makes sense to auto-resolve those two parameters (pAtlas and pGameData) to some sort of central resource (in this case, the primary Atlas and Data used in the game). This GameBaseClass
goes hand-in-hand with GameObject
, so I see no harm in referring to it's singleton-instance's properties. The developer still has the option to supply their own Atlas and Data.
BUT, my coworker believes this ties the classes together too much - it isn't loose enough.
I can understand his point if it was actually referring to the derived classes used in the game (i.e: AwesomeGame.INSTANCE.currentAtlas
, where AwesomeGame extends GameBaseClass). But it isn't! From his point of view, the developer should be forced to enter every single parameters, nothing optional (in this particular situation).
Is there any way to have the best of both worlds?
The only other way I can think of is just to write two separate methods (one with the 2nd and 3rd arguments, and one without), but that still doesn't address the issue with the GameBaseClass dependency.
Any ideas?
EDIT:
In the above example, I used ActionScript 3.0 which does not support assigning non-constant variables. In other words, it allows hardcoded Numbers, Strings (empty ones too), Booleans, and Constants (although I don't think it would work with non-primitive constants, could be wrong though). Since the GameBaseClass.INSTANCE.currentAtlas
is a property that could change in the lifetime of the running application, this cannot be inlined as a 'compile-time' default value.
Hope that makes more sense!