Так как класс QuantityRange до сих пор не создан, выполнение кода завершается с ошибкой "Unresolved compilation problem: QuantityRange cannot be resolved to a type". Для того, чтобы всё-таки проверить код, создаю пустышку.
Кроме этого, создал класс BigStore, который реализует интерфейс с persist() и get(). Потом посмотрим, правильно ли я интерпретировал текст.
-----
Как лихо Фаулер завернул, однако. Создал тип показателя "пол", для которого не предусмотрена количественная характеристика. А ведь на с.154 сам ввёл в рассмотрение класс Количественный Диапазон, что и отражено в диаграмме на с. 156. А сейчас у него получились показатели без диапазонов. Интересно, как он будет создавать показатели с диапазонами, если у него никак пока не прописано их использование.
И что же мне делать? Для типа показателя "пол" нужно создавать особый как бы диапазон, в котором будет только имя и никаких границ. Но какой тогда это диапазон? Просто какой-то подтип типа показателя: "пол.мужской", "пол.женский"... А какую единицу измерения использовать? Выходит, тип показателя может быть без единицы измерения. Но тогда такой тип показателя нельзя использовать в веточке для измерений. И что же? Две группы типов показателей формировать из-за этого, вводить дополнительные условия? Нут уж, некрасиво это.
-----
В связи со всем этим, пришлось переделать диаграмму. И получилось вот что...
А теперь непосредственно код.
"интерфейс" Наблюдение
package main.alexded;
import java.util.Calendar;
public interface Observation {
/** Результат наблюдения */
String getResult();
/** Название типа показателя */
String getResolutionTypeName();
/** Момент времени наблюдения */
Calendar getDateAndTime();
}
Показатель
package main.alexded;
import java.util.Calendar;
/** Показатель */
public class Resolution implements Observation {
@SuppressWarnings("unused")
private Resolution() { }
public Resolution (
ResolutionValue inputValue, Calendar inputDateAndTime) {
this.value = inputValue;
this.dateAndTime = inputDateAndTime;
}
public Calendar getDateAndTime() {
return this.dateAndTime;
}
public String getResolutionTypeName() {
return this.value.getResolutionTypeName();
}
public String getResult () {
return this.value.getResolutionName();
}
private ResolutionValue value;
/** Момент времени наблюдения */
private Calendar dateAndTime;
}
Значение
package main.alexded;
public class ResolutionValue {
private ResolutionType resolutionType;
private String name;
/** Значение показателя */
public ResolutionValue (
String inputName,
ResolutionType inputResolutionType) {
this.name = inputName;
this.resolutionType = inputResolutionType;
this.resolutionType.addResolutionValue(this);
}
/** Блокировка конструктора */
@SuppressWarnings("unused")
private ResolutionValue () {}
/** Название показателя */
public String getResolutionName () {
return this.name;
}
public String getResolutionTypeName() {
return this.resolutionType.getName();
}
}
Тип показателя
package main.alexded;
import java.util.ArrayList;
/** Неколичественный тип показателя */
public class ResolutionType {
/** Название типа показателя */
private String name;
/** Диапазоны показателей */
private ArrayList resolutionValues = new ArrayList();
@SuppressWarnings("unused")
private ResolutionType() {}
public ResolutionType(String inputName) {
this.name = inputName;
}
public void addResolutionValue (ResolutionValue inputResolutionValue) {
this.resolutionValues.add (inputResolutionValue);
}
public void addNewResolutionValue (String resolutionValueName) {
new ResolutionValue (resolutionValueName, this);
}
public void addNewResolutionValues (String[] resolutionValuesNames) {
for (int i = 0; i < resolutionValuesNames.length; i++) {
this.addNewResolutionValue(resolutionValuesNames[i]);
}
}
public String getName() {
return this.name;
}
}
Диапазон
package main.alexded;
/** Диапазон показателя */
public class ResolutionRange extends ResolutionValue {
/** Верхняя граница диапазона */
private int maxValue;
/** Нижняя граница диапазона */
private int minValue;
public ResolutionRange (
String inputName,
int inputMinValue,
int inputMaxValue,
QuantitativeResolutionType inputResolutionType) {
super(inputName, inputResolutionType);
this.minValue = inputMinValue;
this.maxValue = inputMaxValue;
}
}
Количественный тип показателя
package main.alexded;
/** Количественный тип показателя */
public class QuantitativeResolutionType extends ResolutionType {
private Unit unit;
public QuantitativeResolutionType (String typeName, Unit typeUnit ) {
super(typeName);
this.unit = typeUnit;
}
public String getResolutionRangeName (Integer resolutionResult) {
return null;
}
public void addResolutionRange (ResolutionRange inputResolutionRange) {
if (validateResolutionRange (inputResolutionRange)) {
super.addResolutionValue(inputResolutionRange);
} else {
throw new IllegalArgumentException("Not valid Resolution Range");
}
}
private boolean validateResolutionRange(ResolutionRange inputResolutionRange) {
/* TODO :
Проверить, может ли вписаться данный диапазон в коллекцию уже существующих.
Можно, конечно, предстваить себе ситуацию,
когда один диапазон охватывае несколько других,
но такие обощения пока оставим на потом */
return true;
}
}