My vote, based on the idea that "separation of concerns" should be made as visible as possible in every semantic choice:
namespace Company
{
public enum DataSources
{
Oracle, SqlServer, MySQL, ADO
}
public enum PrinterNames
{
LaserWriter1, DotMatrix1, Xerox1, Xerox2
}
public enum ScannerNames
{
Nikon1, Canon1
}
namespace ReaderApplication
{
namespace Controller
{
}
namespace Model
{
namespace Print
{
}
namespace Scan
{
}
}
namespace UI
{
namespace Print
{
}
namespace Scan
{
}
}
}
}
But ... do you have the time and energy for this kind of elaborate design ? Depending on the real-world constraints, architecture will vary from virtually none to highly formal.
Are you going to be "happy" requiring some external user of your classes to need to write code like this (pseudo-code):
using Company;<br />
using Company.ReaderApplication.UI.Print;
In order to make calls like this in some UI context:
PrintDispatcher.Dispatch(CurrentPrintJob, PrinterNames.DotMatrix1);