Что, семантически, является Building
?
Для меня это означает, что это экземпляр структуры. В общей области бизнеса может быть много «зданий», и в любой момент времени один из них взаимодействует с одним из них.
Если это так, то мне кажется неинтересным сделать это static
. Если их несколько, это должна быть модель экземпляра. Он будет содержать атрибуты, которые описывают его, и операции, которые взаимодействуют с ним. При моделировании бизнес-домена следует управлять структурой этого объекта до того, как будет рассмотрено, как другие объекты будут взаимодействовать с ним.
Итак, давайте предположим, что мы делаем его экземпляром модели:
public class Building
{
// attributes and operations
}
Тогда, как вы спрашиваете, как другие объекты взаимодействуют с ним?
Зависит от взаимодействия.
Предположим, что объект должен «визуализировать» здание каким-то образом. Назовем это BuildingPrinter
из-за отсутствия лучшего термина. Очевидно, для «печати» требуется Building
. Поэтому для этого требуется одно:
public class BuildingPrinter
{
public void Print(Building building)
{
// implementation
}
}
Возможно, у вас есть объект, который каким-то образом «обертывает» здание. Что-то, что не может существовать без здания, независимо от выполненных операций. Я не могу придумать один для этого конкретного бизнес-домена, поэтому давайте просто назовите его BuildingWidget
. Так как она нуждается в здание, чтобы существовать, она требует одного:
public class BuildingWidget
{
private Building currentBuilding;
private BuildingWidget() { }
public BuildingWidget(Building building)
{
currentBuilding = building;
}
}
Дело в том, с точки зрения моделей, построить общий домен, если требуется что-то, то оно должно подаваться. Модели не должны выходить в какой-либо глобальный хранилище данных, тесно связанный с этим хранилищем данных, чтобы получить то, что им нужно. Это называется принципом инверсии зависимостей.
Но где будет потребительский код, который организует взаимодействие этих моделей, получает экземпляры Building
? Существует ряд потенциальных решений.
Два общих шаблона должны иметь статическую фабрику или репозиторий. Например:
public class BuildingFactory
{
public static Building FetchBuilding(int buildingId)
{
// implementation
}
}
Этот завод может иметь статический кэшируются строительный объект. Само здание не является статическим, но по соображениям производительности экземпляр его кэшируется статически, так что он не постоянно повторно загружается из хранилища данных поддержки (например, базы данных). Вы также можете добавить методы для отмены кэша и повторной выборки или инкапсулировать эту логику на завод (например, всегда повторно извлекать через 5 минут или после 10 обращений или какое-либо другое правило). (За кулисами, этот завод может даже использовать хранилище, как показано ниже, для повторного получения этого экземпляра. В этом случае, вы уже догадались, BuildingRepository
потребовалось бы на BuildingFactory
конструктора.)
Этот завод объект может также отвечают за , создавая здание, основанное на некоторых спецификациях, если, например, у вас есть причина сделать конструктор Building
закрытым.
Или, повторно выборки из данных, рассмотрим хранилищу:
public class BuildingRepository
{
public Building GetBuilding(int buildingId)
{
// fetch from database
}
public Building SaveBuilding(Building building)
{
// save to database, return updated version
}
}
Затем другой код во всей области, в том числе потребляющей кода, могут использовать эти объекты, чтобы получить/сохранить здания. Завод статичен, поэтому его можно вызвать где угодно. Репозиторий - это экземпляр, но он не должен быть глобально отличным, поэтому его можно создать где угодно (или вытащить из контейнера для инъекций зависимости).
Просто сделайте их общедоступными. Нет смысла беспокоиться о дополнительных методах получения. Если вы не хотите, чтобы он изменился за пределами класса, сделайте их свойства и сделайте 'set' частным. –
Я боюсь, что это своего рода http://en.wikipedia.org/wiki/God_object – Landeeyo
Наличие единого статического места для всех значений - это просто поместить все в глобальную область. Не совсем идеально. Что касается доступа к ним, похоже, что это уже работает. Если данные действительно * должны быть * статическими (я не знаю достаточно о том, чтобы проект был определен), то статический член с геттером точно так будет сделан. – David