Модуль планирования разработки ПО

Не реализовано

Перечисление FeatureStatus

enum FeatureStatus
{
    FEATURE_IDEA,
    FEATURE_PROTOTYPE,
    FEATURE_SCHEDULED,
    FEATURE_DONE,
    FEATURE_REJECTED
};

Статус задачи/идеи

  1. Идея (idea, младенчество) - "а давай сделаем ... ?!"
    Любая мысль, любое предложение должно записываться, чтобы не упустить какую-нибудь хорошую идею. Однако, если идея записана, то это ещё не значит, что её обязательно надо реализовать. Отбираться и реализовываться будут только лучшие идеи, которые действительно улучшат программу и побьют конкурентов.
  2. Прототип (prototype, юность) - "это может выглядеть так: ..."
    Прототип конкретизирует идею, как в конечном итоге может выглядеть предлагаемое свойство/функция: эскизы диалоговых окон/форм, наброски структуры таблиц (БД), описание методики взаимодействия Программа <-> Пользователь или Клиент <-> Сервер и т.п. Прототип позволяет нащупать будущее свойство/функцию, но тоже ещё не является побуждением к реализации - это всего лишь более детальное рассмотрение задачи.
  3. Запланировано (scheduled, зрелость) - "это можно сделать так ... и в такой срок ..."
    Задача ясна и разбита на небольшие подзадачи, для каждой подзадачи известна оценка времени. Суммарная оценка всех подзадач - есть оценка времени задачи. Для таких задач мы знаем как конкретно она должна быть реализована. Решение, возможно, не идеальное, но оно есть и может быть реализовано в обозначенный срок. А это лучше чем какое-то идеальное решение, которое мы не знаем и не можем сказать сколько времени на него потребуется. Плохое решение можно улучшить - идеальное невозможно реализовать.
  4. Реализовано (done, старость) - "задача поставлена - задача решена!"
    Задача решена, когда выполнены все подзадачи, включая отладку.
  5. Отклонено (rejected, смерть) - "в другой версии или в даже в другой жизни"
    Это корзина, в которую мы складываем задачи, от которых мы решили отказаться по тем или иным причинам. Большинство таких задач не заслуживает внимания, но их жалко выкинуть. Мы будем складывать их в корзину с глаз долой, чтобы не отвлекали. Если по прошествии времени изменятся условия и какая-то отвергнутая задача станет актуальной, то её можно восстановить из корзины.

Перечисление ScheduleAction

enum ScheduleAction
{
    SCHEDULE_NOP,
    SCHEDULE_ADD,
    SCHEDULE_EDIT,
    SCHEDULE_REMOVE,
    SCHEDULE_CLOSE
};

Действие с элементом расписания

Структура FeatureInfo

struct FeatureInfo
{
    integer id;
    string project;
    string developer;
    string title;
    string description;
    FeatureStatus status;
    integer position;
    integer ctime;
    integer mtime;
};

Описание идеи/свойства

Структура FeatureLogChunk

struct FeatureLogChunk
{
    integer Remain;
    integer NextTime;
    FeatureLog Records;
};

Порция журнала изменений свойств

Структура FeatureLogRecord

struct FeatureLogRecord
{
    integer id;
    integer FeatureId;
    string FeatureTitle;
    integer time;
    string actor;
    string comment;
    string changes;
};

Описание записи в журнале изменений свойств

Структура ScheduleItem

struct ScheduleItem
{
    integer id;
    string developer;
    ScheduleAction action;
    string problem;
    string subproblem;
    integer first;
    integer current;
    integer past;
    datetime ctime;
    datetime mtime;
};

Описание задачи (элемента расписания)

Список FeatureLog

Список элементов FeatureLogRecord

Список записей журнала изменений свойств

Список Schedule

Список элементов ScheduleItem

Расписание (список задач)

Функция AddFeature

integer AddFeature(string project, FeatureInfo AFeatureInfo)

Добавить описание свойства/идеи

Параметры

Возвращает: integer - ID добавленного свойства

Функция CommitSchedule

void CommitSchedule(string project, Schedule schedule)

Сохранить изменения в расписании

Не реализовано

Параметры

Функция EditFeatureInfo

void EditFeatureInfo(string project, integer id, FeatureInfo AFeatureInfo, string comment)

Отредактировать описание свойства/идеи

Параметры

Функция GetFeatureInfo

FeatureInfo GetFeatureInfo(string project, integer id)

Вернуть описание свойства/идеи

Параметры

Возвращает: FeatureInfo - Описание свойства

Функция GetFeatureLog

FeatureLogChunk GetFeatureLog(string project, integer FromTime, integer Limit)

Вернуть журнал изменений описаний свойств

Функция GetFeatureLog возвращает записи из журнала свойств, начиная с указаной даты. Параметр limit указывает ограничение. Функция возращает структуру в которой указывается число непрочтеных записей (отброшеных из-за ограничения), следующая дата, которую нужно указать для получения остатка, и массив с записями журнала. С помощью этой функции можно получать обновления с сервера.

Пример получения обновлений

Для получения обновления используется параметр FromTime, который указывает дату получения последних обновлений. Предполагается что записи до FromTime либо уже известны, либо не интересны. Функция возращает пакет записей начиная с указанной даты, но возращает не больше чем указано в ограничении (параметр Limit). Чтобы получить все записи нужно циклически вызывать функцию GetFeatureLog, передавая в качестве FromTime возращенное значение NextTime, до тех пор пока Remain (число записей не вошедших в выборку) не окажется равным нулю. После чего получение журнала можно остановить, а для получения последующих обновлений использовать дату NextTime.

Пример получения всех записей:

type
  (**
  * Функция принимающая и обрабатывающая записи журнала свойств
  * (см. функцию GetFeatureLogFull)
  * @param prj название проекта (строковый идетификатор)
  * @param LogRecord (запись журнала)
  *)
  TFeatureLogCallback = procedure (const prj: string; const LogRecord: TFeatureLogRecord);

(**
* Прочитать полный журнал
* @param prj название проекта (строковый идентификатор)
* @param BeginTime время начиная с которого надо получить записи
* @param Callback процедура принимающая записи журнала
* @param Limit число записей извлекаемых за один вызов
* @return последняя дата (время которое нужно указать для получения последующих обовлений)
*)
function GetFeatureLogFull(const prj: string; BeginTime: integer; Callback: TFeatureLogCallback; Limit: integer = 20): integer;
var
  chunk: TFeatureLogChunk;
  time: integer;
  i, len: integer;
begin
  assert(Limit > 0, 'Limit must be positive');
  time := BeginTime;
  repeat
    chunk := schedule.GetFeatureLog(prj, time, Limit);
    len := Length(chunk.Records);
    for i := 0 to len-1 do Callback(prj, chunk.Records[i]);
    time := chunk.NextTime;
  until chunk.remain <= 0;
  Result := time;
end;

(**
* Функция принимающая и обрабатывающая записи журанала
*
* Эта функция может выводить записи на экран или добавлять в базу данных
*)
procedure feature_log_callback(const prj: string; const LogRecord: TFeatureLogRecord);
begin
  with LogRecord do
  begin
    writeln('  LogID: ', Id);
    writeln('  Time: ', Time, ' (', DateTimeToStr(UnixToDateTime(Time)), ')');
    writeln('  Feature[', FeatureId, ']: ', FeatureTitle);
    writeln('  Actor: ', actor);
    writeln('  Comment: ', comment);
    writeln('  Changes: ', changes);
    writeln;
  end; // for i with LogRecord
end;

begin
  time := получить дату посленего обновления;
  time := := GetFeatureLogFull(prj_name, FromTime, feature_log_callback, 20);
  сохранить дату последнего обновления (time);
end.

Параметры

Возвращает: FeatureLogChunk - Порция данных из жунала изменений свойств

Функция GetSchedule

Schedule GetSchedule(string project, string developer)

Вернуть расписание проекта

Не реализовано

Параметры

Возвращает: Schedule - Расписание проекта

Функция GetScheduleReport

Schedule GetScheduleReport(string project, string developer, datetime startDate, datetime endDate, boolean closed)

Вернуть отчёт за период

Не реализовано

Параметры

Возвращает: Schedule -

Начало