Think about how client code will call your class.
first approach is not so good:
- client class know a lot about internals
- every client class would need to write or copy\paste the same code
again and again.
- if method signatures will change, every usage would need to be updated.
- it is easy for you, or even another team member to pass incorrect arguments to public methods
- public methods could change or even break internal state so that class will not be usable anymore
Not good:
public static void Main()
{
var processor = new SuperDataProcessor();
processor.Initialize();
var parameters = processor.GetParametersFromDatabase(connectionString);
var data1 = processor.GetDataFromFirstDb(parameters.FirstDatabase /* what if we pass incorect value here? i. e. SecondDatabase instead of first?*/);
var data2 = processor.GetDataFromSecondDb(parameters.SecondDatabase);
var finalResult = processor.MergeDataOnWebService(parameters.WebUrl, data1, data2);
Console.WriteLine(finalResult);
}
this one is better:
// lets simplify job for someone who will use this processor. No internal details exposed.
public static void Main()
{
var processor = new SuperDataProcessor(string connectionString);
var result = processor.GetParametersFromDatabaseAndMergeOnWebService();
Console.WriteLine(result);
}
Streamlined class:
public class SuperDataProcessor
{
public SuperDataProcessor(string connectionString)
{
_connectionString = connectionString;
}
public MyData GetParametersFromDatabaseAndMergeOnWebService()
{
// now we have smarter initialization and place for potential error handling - all in one place.
if (!_initialized) {
processor.Initialize();
}
var parameters = GetParametersFromDatabase(_connectionString);
var data1 = GetDataFromFirstDb(parameters.FirstDatabase);
var data2 = GetDataFromSecondDb(parameters.SecondDatabase);
var finalResult = MergeDataOnWebService(parameters.WebUrl, data1, data2);
return finalResult;
}
private Parameters GetParametersFromDatabase(string connectionString)
{
}
private MyData1 GetDataFromSecondDb(string secondDatabase)
{
// only get data from second db
}
private MyData2 GetDataFromFirstDb(string firstDatabase)
{
// only get data from first db
}
private void MergeDataOnWebService(string webUrl, MyData1 data1, MyData2 data2)
{
// only merge and return merged results
}
}