Наша область знаний включает людей, которые ходят по пластине для записи давления босыми ногами. Мы выполняем распознавание изображений, в результате чего получаются объекты класса «Foot», если в данных датчика распознается нога человека.
Есть несколько расчетов, которые должны быть выполнены на данных ноги.
Теперь, какой API будет лучше:
class Foot : public RecognizedObject {
MaxPressureFrame getMaxPressureFrame();
FootAxis getFootAxis();
AnatomicalZones getAnatomicalZones();
// + similar getters for other calculations
// ...
}
Или:
class Foot : public RecognizedObject {
virtual CalculationBase getCalculation(QString aName);
// ...
}
Сейчас есть много плюсов и минусов, которые я могу придумать, но я не могу решить, какие из них наиболее важные. Обратите внимание, что это приложение для конечного пользователя, а не библиотека программного обеспечения, которую мы продаем.
Любой совет?
Некоторые про за первый подход могут быть:
- ПОЦЕЛУЙ - все очень конкретно. API, но реализация также.
- строго типизированные возвращаемые значения.
- наследование от этого класса является надежным. Ничто не может быть переопределено, только добавлено.
- API очень закрыт, ничего не входит, ничто не может быть переопределено, поэтому меньше может пойти не так.
Некоторые минусы:
- Количество получателей будет расти, так как каждый новый расчет добавляется в список
- API, скорее всего, изменится, и если будут внесены критические изменения, нам понадобится новая версия API, Foot2.
- в случае повторного использования класса в других проектах нам может не потребоваться каждый расчет
Некоторые плюсы для второго подхода:
- более гибкий
- API менее вероятно изменится (при условии, что мы получили правильную абстракцию, в противном случае изменение будет стоить дороже)
Некоторые минусы:
- слабо набранный. Необходимо использовать каждый звонок.
- строковый параметр - у меня плохое предчувствие (ветвление строковых значений ...)
- В настоящее время не существует варианта использования / требования, которое требовало бы дополнительной гибкости, но это может произойти в будущем.
- API накладывает ограничения: каждый расчет должен быть производным от базового класса. Этот метод будет вынужден выполнять вычисления, и передача дополнительных параметров будет невозможна, если мы не разработаем еще более динамичный, сверхгибкий способ передачи параметров, который еще больше увеличивает сложность.
getCalculation()
.
enum
и включить его значения. Тем не менее, я думаю, что второй вариант злой, потому что он отклоняется от KISS.