Нормализуйте свои входные символы в порядковые значения, начинающиеся с нуля, и все станет намного проще.Начните с нескольких объявлений типов:
type
TActionCode = (acA, acN);
TReportType = (rtI, rtF);
TStatus = (sP, sI, sF);
Затем вы можете определить массив, используя эти типы со всеми возможными значениями состояния.Замените sX
на то, какое значение состояния находится в каждом месте.
const
NextStatus: array[TActionCode, TReportType, TStatus] of TStatus = (
{acA} (// sP, sI, sF
{rtI} ( sX, sX, sX),
{rtF} ( sX, sX, sX)
),
{acN} (
{rtI} ( sX, sX, sX),
{rtF} ( sX, sX, sX)
)
);
Тогда ваша функция выглядит просто так:
function CalcNewStatus(const actionCode, reportType, currentStatus: string): string;
var
ac: TActionCode;
rt: TReportType;
s: TStatus;
const
StateChars: array[TState] of Char = ('P', 'I', 'F');
begin
Assert(actionCode <> ''); Assert(reportType <> ''); Assert(currentStatus <> '');
Assert(actionCode[1] in ['A', 'N']);
Assert(reportType[1] in ['I', 'F']);
Assert(currentStatus[1] in ['P', 'I', 'F']);
if actionCode[1] = 'A' then ac := acA else ac := acN;
if reportType[1] = 'I' then rt := rtI else rt := rtF;
if currentStatus[1] = 'P' then s := sP
else if currentStatus[1] = 'I' then s := sI
else s := sF;
Result := StateChars[NextStatus[ac, rt, s]];
end;
Как видите, большая часть этого кода расходуется на преобразованиемежду строками и типами перечислений.Если можете, избегайте строк в этом случае.Переключайтесь на типы enum как можно раньше в своей программе и конвертируйте обратно в строки или символы только тогда, когда это абсолютно необходимо.Строки могут иметь произвольную длину, с которой вам действительно не нужно иметь дело, и строки могут также иметь значения вне заданного вами диапазона.Enums не может, если вы не делаете что-то странное.Кроме того, компилятор не позволит вам случайно использовать значение TState там, где ожидается TReportType, что поможет вам перепутать ваши I и F.