2009-01-04 6 views
3

Lorsqu'un objet a divers formats (XML, CSV), il peut être représenté dans, où devrait-on stocker la connaissance de ces formats.Quel est le meilleur endroit pour stocker la représentation XML/CSV/autre d'un objet

L'objet doit-il avoir une connaissance de la manière dont il est représenté en XML (c'est-à-dire en laissant l'objet se convertir lui-même via une méthode sur l'objet, par exemple GetXML())? Est-ce trop de connaissances pour l'objet et devrait-il être stocké de manière externe dans un référentiel/service/autre couche?

Si elle est stockée dans un dépôt, ce qui se passe dans le cas d'utilisation où la représentation XML de l'objet doit être persisté à une base de données ainsi que d'autres informations, e.g.:-

insert into order values(1, '2004', <order><amount>2</amount><price>19.99</price></order>); ... la connaissance de la structure XML de l'objet serait dans le référentiel XML, mais le référentiel SQL aurait également besoin de cette connaissance, ce qui semble être une duplication. Je ne sais pas si la couche de service devrait contenir des représentations d'objets, car il ne semble pas que ce soit une logique métier.

Quelle est la mise en œuvre recommandée pour ce cas d'utilisation?

Répondre

5

En règle générale, vous souhaitez que le code de formatage XML (ou autre ...) de l'objet soit séparé de l'objet lui-même. La raison pratique pour cela est d'avoir plus d'une représentation XML (par exemple un résumé et une représentation détaillée). Si ces méthodes où toute une partie de l'API de l'objet alors vous commencez à avoir:

public String GetShortXml(){ ... } 
public String GetFullXml(){ ... } 
public String GetCsv(){ ... } 
public String GetJson(){ ... } 

Dans le cadre de l'API de chaque objet métier et qui devient laide rapide. En outre, cela viole le single responsibility priciple car chaque classe est responsable à la fois de ce que fait et se représente comme XML, JSON, CSV, etc.

Ainsi, il est souvent préférable d'avoir une classe qui sait comment formater les objets métier se soucient et ont une SummaryXmlFormatter, DetailedXmlFormatter, CsvFormatter, JsonFormater, etc.

Vous pouvez aller plus loin et avoir vos objets implémenter une interface IFormattable (ce qui suit est une adaptation du visitor patter qui nous donne à double bonté d'expédition):

public interface IFormattable { 
    public String Format(IFormatter formatter); 
} 

wit implémentations h comme:

public String Format(IFormatter formatter){ 
    return formatter.FormatBusinessObjectOne(this); 
} 

avec l'interface IFormatter définie ainsi:

public interface IFormatter{ 
    public String FormatBuisinessObjectOne(BusinessObjectOne boo); 
    public String FormatBuisinessObjectTwo(BusinessObjectTwo bot); 
    ... 
} 

qui permettrait la mise en forme appelle à être expédié polymorphically. En fonction de vos besoins peut ou peut ne pas être utile (avez-vous déjà une collection de différents types et donc besoin d'une distribution polymorphe ou est en surcharge suffisante?).

Vos appels au format doit ressembler à:

IFormatter formatter = new XmlFormatter(); 
BusinessObjectOne boo = new BusinessObjectOne(...); 

// With visitor like double dispatch 
String xml = boo.Format(formatter); 

// Without 
String xml = formatter.FormatBusinessObjectOne(boo); 

// With overloading 
String xml = formatter.Format(boo); 
+0

Très bonnes techniques dans cette réponse, merci d'avoir pris le temps. – rodbv

0

Qu'est-ce que vous voulez stocker dans la base de données?

insert into order 
values(1, '2004', '<order><amount>2</amount><price>19.99</price></order>'); 

ou

insert into order values(1, '2004', 2, 19.99); 

?

+0

La première: insert dans l'ordre des valeurs (1, '2004', ' 19,99'); – Laz

Questions connexes