f



best way of exporting classes/class design

i have some classes that i need to export into text files for transmission
between some legacy systems that i was hoping to get some advice on.

the way it works at the moment is a list of changes made to tables is 
kept in
another table in a database. the table they're stored in just contains 
the name
of table where the change was made and the primary key. there are a set of
classes that map directly to tables in the database e.g. PRODUCT => 
Product,
COMPANY => Company. periodically a class called UpdateFile is 
instantiated which
iterates through the list of changes in the database, instantiates the 
class for
which the change was made and inserts the string returned from the classes
updateRecord() function into an ofstream which is eventually written to 
disk.

in the past there has only been 1 export file format but now another 
needs to be
added in xml. i have been tasked with this and rather than adding to the
confusion i would to improve the design if i can, which is where the 
problem lies.

first of all, does it make sense to move updateRecord() and any other 
functions
used to generate an export record into it's own class (e.g. 
ProductUpdateRecord,
CompanyUpdateRecord) even if it means that class only has the 1 function?

is there any way of templatizing it so that in UpdateFile i can do

for (each change made) {
	UpdateRecord<Product> whatever;
	ofstream << whatever.text(); //or whatever.xmltext()
}

without leaving updateRecord() in the class its generating the export 
record for
(in which case there wouldn't be any use for templates anyway)?

TIA

-- 
      [ See http://www.gotw.ca/resources/clcm.htm for info about ]
      [ comp.lang.c++.moderated.    First time posters: Do this! ]

0
Mark
9/5/2007 2:58:52 AM
comp.lang.c++.moderated 10738 articles. 1 followers. allnor (8506) is leader. Post Follow

1 Replies
348 Views

Similar Articles

[PageSpeed] 35

Two notes up front:
1. Your posting seems to have been linebroken twice, with different numbers
of columns.
2. You are not using your keyboard's shift key.

Both combine to a posting where it is relatively hard to figure out where a
sentence or paragraph begins, making it overall harder to understand. I
reformatted the text partially.

Mark wrote:
> i have some classes that i need to export into text files for transmission
> between some legacy systems that i was hoping to get some advice on.

Just for your info: when talking about exporting classes, typically the
topic revolves around the problem of exporting class interfaces from
libraries. What you are describing below is exporting data to a file.

> the way it works at the moment is a list of changes made to tables is
> kept in another table in a database. the table they're stored in just
> contains the name of table where the change was made and the primary
> key. there are a set of classes that map directly to tables in the
> database e.g. PRODUCT => Product, COMPANY => Company. periodically a
> class called UpdateFile is instantiated which iterates through the list
> of changes in the database, instantiates the class for which the change
> was made and inserts the string returned from the classes updateRecord()
> function into an ofstream which is eventually written to disk.
> 
> in the past there has only been 1 export file format but now another
> needs to be added in xml. i have been tasked with this and rather than
> adding to the confusion i would to improve the design if i can, which
> is where the problem lies.
> 
> first of all, does it make sense to move updateRecord() and any other
> functions used to generate an export record into it's own class (e.g.
> ProductUpdateRecord, CompanyUpdateRecord) even if it means that class
> only has the 1 function? 

I don't see why you have to use a class at all. Sometimes, a plain function
would work just as well. Further, I would suggest that you split the code
to iterate the database or changes in the database, i.e. write custom
iterators for that. Take a look at Boost, it has some template classes that
help creating iterators.

> is there any way of templatizing it so that in UpdateFile i can do
> 
> for (each change made) {
> UpdateRecord<Product> whatever;
> ofstream << whatever.text(); //or whatever.xmltext()
> }
> 
> without leaving updateRecord() in the class its generating the export
> record for (in which case there wouldn't be any use for templates
> anyway)?

In a second stage, you provide functions to dump the content of a record to
a stream using either file format. You can then use the two parts roughly
like this:

   for_each( database_iterator(db_handle),
             database_iterator(),
             dump_record_to_stream);


Note: an alternative way which might be easier to implement (because the
changes are less intrusive) is to provide a callback class:

   struct record_callback {
     virtual void handle( record& r) = 0;
   };

and provide a way to iterate the database as part of the database itself:

   class db {
     // will call cb.handle() for each record
     void iterate_records( record_callback const& cb);
   };

Uli

-- 
Sator Laser GmbH
Gesch�ftsf�hrer: Ronald Boers, Amtsgericht Hamburg HR B62 932


      [ See http://www.gotw.ca/resources/clcm.htm for info about ]
      [ comp.lang.c++.moderated.    First time posters: Do this! ]

0
Ulrich
9/5/2007 10:46:45 AM
Reply: