Per prima cosa, lascia che ti mostri un esempio (scritto 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...
}
Sto avendo questo dibattito con un collega per quanto riguarda i precedenti parametri "null" (fondamentalmente facoltativi).
Per me, ha senso risolvere automaticamente quei due parametri ( pAtlas e pGameData ) in una sorta di risorsa centrale (in questo caso, l'Atlante primario e Dati utilizzati nel gioco). Questo GameBaseClass
va di pari passo con GameObject
, quindi non vedo alcun danno nel riferirmi alle sue proprietà di istanza di singleton. Lo sviluppatore ha ancora la possibilità di fornire il proprio Atlas e dati.
MA, il mio collega crede che questo leghi le classi troppo insieme - non è abbastanza sciolto.
Posso capire il suo punto se si riferisse effettivamente alle classi derivate usate nel gioco (cioè: AwesomeGame.INSTANCE.currentAtlas
, dove AwesomeGame estende GameBaseClass ). Ma non lo è! Dal suo punto di vista, lo sviluppatore dovrebbe essere costretto a inserire ogni singolo parametro, nulla di opzionale (in questa particolare situazione).
C'è un modo per avere il meglio di entrambi i mondi?
L'unico altro modo in cui posso pensare è solo scrivere due metodi separati (uno con il 2 ° e il 3 ° argomento e uno senza), ma che comunque non risolve il problema con la dipendenza GameBaseClass.
Qualche idea?
EDIT:
Nell'esempio precedente, ho utilizzato ActionScript 3.0 che non supporta l'assegnazione di variabili non costanti. In altre parole, consente numeri hardcoded, stringhe (anche vuote), booleane e costanti (anche se non penso che funzionerebbe con costanti non primitive, potrebbe comunque essere sbagliato). Poiché GameBaseClass.INSTANCE.currentAtlas
è una proprietà che potrebbe cambiare nel corso della durata dell'applicazione in esecuzione, non può essere indicata come valore di default 'compile-time'.
Spero che abbia più senso!