Question

I have:

  • Raw Object: contains raw data before importing to the system
  • Module #1: Validator which will validate Raw Objects
  • Module #2: Updater which will use validated raw data (invalid data were removed) to generate Real Objects

Module #1 has to determine whether ItemCode (just an example, the actual number of keys are dozens) exists in the database or not. Module #2 has to get the Item object by querying ItemCode in the database.

A developer wants to add an alien property .TempItem to the raw object so that the Module #1 will assign the Item object to .TempItem property (because it is super easy to do that) and Module #2 just needs to use .TempItem without querying the database second time.

My technical expert advises that it is not good.

I want to follow programming principles and best practices but have no idea how.

Any help is appreciated.

Was it helpful?

Solution

What you have with Module #1 and #2 is a pipeline process. The output of #1 passes into #2. Any information that #2 needs which #1 has already ascertained can (arguably should) be cached.

I would create an additional object to pass this state information through the pipeline (@astander suggests a dictionary, but in many cases a hard-coded object that stores precisely the data you need will be simple to write and much more usable/maintainable)

Using a "tempitem" is essentially the same mechanism, but a poor implementation of it - the idea is the same though (don't read the same information from the database multiple times)

By passing a state object through your pipeline you keep the pipeline processors loosely coupled (#2 doesn't need to know about #1, it simply acts on the state information that is passed in), which makes it easier to add new pipeline stages or refactor your modules in future. By passing the data within a separate class, it also makes it really easy to add new state data to be passed through the system.

OTHER TIPS

I dont think you need to add the temp item to the raw object.

You could use caching, and store the object in a dictionary/list and pass that along to Module2 to be used for lookup.

In Module2 then you can check if the object is in the cached dictionary/list (the dictionary should be easier as you can lookup the value based on the key) and if it is not present, then only load it from the database.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top