Как реализовать чтение настроек объекта по умолчанию из базы данных с помощью oop и soc - PullRequest
1 голос
/ 06 июля 2011

У меня есть класс, который выглядит следующим образом:

public class Location {
    private int id;
    private String name = "noname";
    ... // other properties

    public Location(int locationId) {
        this.id = locationId;
        this.name = getNameFromDatabase(locationId);
    } 

    public static Map<Integer,Location> getAllLocations() {
        // reads all locations from database and puts objects into a map
    }       

    ... // other methods

}

Свойство name можно определить одним из следующих способов, используя:

  1. значение по умолчанию, определенное разработчикомв исходном коде
  2. значение приложения по умолчанию, определенное в базе данных (переопределяет значение по умолчанию разработчика),
  3. значение, специфичное для местоположения, определенное в базе данных (переопределяет оба предыдущих значения)

В приложении объект местоположения создается с помощью Map<Integer,Location> locations = Location.getAllLocations();

Реализация 1. и 3. проста, но что является наиболее подходящим способом реализации 2. "значений по умолчанию для конкретного приложения":

  • Я могу получить значение по умолчанию в методе getNameFromDatabase, но затем я ищу значение по умолчанию в базе данных с каждым новым местоположением (так как это по умолчанию, оно должнобыть выбранным только один раз)
  • При создании экземпляра объекта местоположения я мог бы предварительно прочитать значения по умолчанию в специальном объекте местоположения, а затемпередать этот объект конструктору (но я верю, что нарушу разделение задач)
  • Я считаю, что мне нужен своего рода статический синглтон, который будет создан в классе, но я понятия не имею, как его реализовать

    РЕДАКТИРОВАТЬ

  • показанное свойство имени - это просто фрагмент всего класса (всего около 20 свойств)
  • значение приложения по умолчанию также сохраняется в базе данных;фактически он находится в той же таблице, что и другие местоположения, за исключением того, что у него есть специальный идентификатор -1;так что я сейчас делаю в методе getNameFromDatabase select * from location where location_id in (-1, &lt;locationid&gt;) order by location_id, но я считаю, что это плохой дизайн, так как я читаю значения местоположения по умолчанию для каждого местоположения, которое я установил
  • , так что я ищуis: в методе getnamefromdatabase он сначала проверяет, есть ли имя, определенное для моего идентификатора местоположения.если нет, проверьте, уже есть ли у меня globaly определенное defaultlocationname, если нет, найдите его в базе данных, а затем определите global defaultlocationname.

1 Ответ

0 голосов
/ 06 июля 2011

Это должно сделать что-то вроде следующего, если вы правильно определили методы getNameFromDatabase и getApplicationDefaultName. (метод setApplicationDefaultName также должен быть определен для установки имени приложения для данного locationId)

private int id;
private String name =- "noname"; // default in source code?

public Location(int locationId) {
    // ...
    String appName = Location.getApplicationDefaultName();
    String dbName = getNameFromDatabase(locationId);
    if(dbName != null) {
        this.name = dbName;
    } else if (appName != null) {
        this.name = appName;
    } // else name will default to initially set value.
}

Когда вы присваиваете имя с помощью оператора this.name = getNameFromDatabase(locationId), вы перезаписываете значение, ранее присвоенное this.name, поэтому ваш случай 1 не будет реализован. Ваша логика для назначения имени (или любого из ваших свойств с ожидаемым поведением, которое будет описано вашими пунктами 1,2 и 3) должна быть:

if (db has specific name)
    use db specific name              // point 3
else if (db has default name)         // point 2
    use db default name
else
    don't overwrite source code name  //point 1

Редактировать

Один из способов отделить задачу получения значения базы данных по умолчанию от практики, которую вы используете для получения этого значения (один раз на ВМ, каждый раз или просто иногда в зависимости от фазы луны), - использование Стратегия Дизайн шаблона. Интерфейс RetrievalMethod должен иметь один метод, getDefaultFromDatabase(), поведение которого может быть задано разработчиками. При этом метод getApplicationDefaultName вашего местоположения (вместе с методом настройки стратегии RetrievalMethod) будет выглядеть следующим образом:

private RetrievalMethod myLocationRetriever = GenericRetrievalMethod(/*...*/);
// ...
public void setLocationRetrievalMethod(RetrievalMethod retr) {
    myLocationRetriever = retr;
}
// ... 
private String getApplicationDefaultName() {
    myLocationRetriever.getDefaultFromDatabase();
}

В соответствии со спецификациями вашего приложения вы можете установить myLocationRetriever на соответствующее поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...