Domanda

Saluti,

Ho un oggetto particolare che può essere costruito da un file, come tale:

public class ConfigObj
{
     public ConfigObj(string loadPath)
     {
          //load object using .Net's supplied Serialization library
          //resulting in a ConfigObj object
          ConfigObj deserializedObj = VoodooLoadFunction(loadpath); 

          //the line below won't compile
          this = thisIsMyObj; 
     }
}

Voglio dire, in sostanza, "ok, e ora questo oggetto che abbiamo appena deserializzato, questo è l'oggetto che in realtà siamo." Ci sono alcuni modi per farlo, e mi chiedo quale sia considerata una buona pratica. Le mie idee sono:

  • Crea una funzione copia-in-me che copia l'oggetto campo per campo. Questa è l'implementazione attuale e sono abbastanza sicuro che sia un'idea orribile dal momento che ogni volta che un nuovo membro viene aggiunto all'oggetto, devo anche ricordare di aggiungerlo alla funzione 'copia-in-me', e non c'è modo che sia mantenibile .
  • Crea un metodo statico per la classe ConfigObj che funge da costruttore di fatto per il caricamento dell'oggetto. Sembra molto meglio ma non molto best-practice-y.

Non sono del tutto felice con nessuno dei due, però. Qual è la migliore pratica riconosciuta qui?

È stato utile?

Soluzione

La tua seconda opzione è quella che viene chiamata metodo di fabbrica ed è una tecnica di progettazione comune. Se si utilizza questa tecnica, è possibile che sia necessario conoscere il tipo di classe che verrà caricato prima di caricare effettivamente la classe. Se ti imbatti in questa situazione, puoi utilizzare un tipo di factory di livello superiore che guarda lo stream e chiama il metodo factory per il tipo di classe appropriato.

Altri suggerimenti

Non c'è niente di sbagliato nell'avere un metodo statico invece di un costruttore. In effetti, ha un un numero di vantaggi .

Vado sempre con il metodo statico. Di solito è una specie di gerarchia che viene caricata, e quindi solo l'oggetto root necessita del metodo. E non è davvero un approccio insolito nel framework .NET (ad esempio Graphics.FromImage), quindi dovrebbe andare bene con gli utenti della tua classe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top