Обычно существует один глобальный объект App, который содержит глобальные свойства, поэтому низкоуровневые классы могут получить доступ ко всему, что им нужно из этой единственной точки. Если проект не очень сложный, это решение вполне управляемо.
В качестве варианта у вас может быть глобальный объект приложения, реализующий интерфейсы, в которых низкоуровневые классы заинтересованы и внедряют его во время построения. Нравится (C #):
interface ITextFileProperties
{
string Encoding;
}
interface IGraphicsFileProperties
{
int Resolution;
}
interface IFileProperties : ITextFileProperties, IGraphicsFileProperties
{
}
static class App : IFileProperties
{
public string Encoding = "UTF-8"; // ITextFileProperties
public int Resolution = 1024; // IGraphicsFileProperties
}
class TextFile
{
public TextFile(ITextFileProperties data)
{
_globalEncoding = data.Encoding;
}
}
class GraphicsFile
{
IGraphicsFileProperties properties;
public GraphicsFile(IGraphicsFileProperties data)
{
properties = data; // in case we'll need it later, if it can change at run time, etc.
}
}
class SomeObjectUsingFiles
{
public SomeObjectUsingFiles(IFileProperties properties)
{
_globalProperties = properties;
}
public void ProcessText()
{
var textFile = new TextFile(_globalProperties);
}
public void ProcessGraphics()
{
var grFile = new GraphicsFile(_globalProperties);
}
}
Передать объекту только минимальную информацию, в которой он нуждается. Таким образом, вы можете сохранить ваши конкретные «рабочие лошадки» (файлы) простыми и слабо связанными, а затем, при необходимости, иметь дело с передачей параметров.