Я думаю, что тип хранилища и регулярные выражения будут наименьшей из ваших проблем при моделировании этого. По сути, вы пишете простой механизм правил для расчета зарплаты сотрудника. Выяснить, что эти правила являются наиболее важной частью этой проблемы. Обеспечение того, чтобы правила были полными, последовательными и детерминированными, является еще одной важной частью. Под детерминистическим я имею в виду, что у вас не может быть двух правил, таких как:
Default(0-100)=20
Default(50-100)=25
поскольку система не знает, как рассчитать заработную плату за 50-100 часов, поскольку существует два варианта. Под полными я подразумеваю, что правила должны быть в состоянии вычислить заработную плату, данную любому сотруднику, и количество часов, которые они отработали. Возьмите другой пример:
Default(0-100)=20
Default(125-150)=25
Если работник проработал 150 часов, система не знает заработанную заработную плату за часы 101-125. Так что неполнота - это еще одна проблема.
Предполагая, что правила являются полными и детерминированными, мы можем приступить к моделированию. Если отработанные часы могут быть дробными, то решение должно будет пропорционально разделить почасовую заработную плату. Похоже, что есть зарплата по умолчанию, а затем зарплаты, специфичные для сотрудника. Заработная плата, специфичная для работника, всегда имеет приоритет над зарплатой по умолчанию. Так что в простом псевдокоде if-else это будет выглядеть так:
get-wages (employee, hours-worked)
total-wage = 0
for each ith hour worked
hourly-wage = get-hourly-wage (employee, ith-hour)
fraction-of-hour-worked = get-fraction-of-hour-worked(ith-hour, hours-worked)
total-wage += hourly-wage * fraction-of-hour-worked
return total-wage
end
get-hourly-wage (employee, hour-number)
if employee has specific wage for hour number
return that
else if there is default wage for hour number
return that
else
throw error("no wage available for hour number [hour-number]")
end
get-fraction-of-hour-worked (hour-number, hours-worked)
difference = hours-worked - hour-number
if difference >= 1
return 1
else
return difference
end
Оформление заказа эта статья , которая дает один подход к написанию механизма правил и, что интересно, использует в качестве примера сотрудников и заработную плату, поэтому она может быть полезна
Еще несколько интересных статей о механизмах правил, которые могут оказаться полезными: