понедельник, 14 марта 2011 г.

с. 161 Создание типа показателя "gender"


Так как класс 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; } }