Наша область знань стосується людей, які босими ногами переходять через тарілку, що записує тиск. Ми робимо розпізнавання зображень, що призводить до об'єктів класу '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);
// ...
}
Зараз є багато плюсів і проти, які я можу придумати, але я не можу реально вирішити, які є найважливіші. Зауважте, що це програма для кінцевих користувачів, а не бібліотека програмного забезпечення, яку ми продаємо.
Будь-яка порада?
Деякі профі для першого підходу можуть бути:
- KISS - все дуже конкретно. API, але також і реалізація.
- сильно набрані повернені значення.
- успадковування від цього класу є нерозумним. Нічого не можна відміняти, лише додавати.
- API дуже закритий, нічого не входить, нічого не можна відміняти, тому менше може піти не так.
Деякі конфлікти:
- Кількість отримувачів буде зростати, оскільки кожен новий розрахунок, який ми вигадуємо, додається до списку
- API швидше змінюється, і якщо будуть внесені порушення, нам потрібна нова версія API, Foot2.
- у разі повторного використання класу в інших проектах, можливо, нам не знадобиться кожен розрахунок
Деякі профі для другого підходу:
- більш гнучким
- api рідше зміниться (якщо припустити, що абстракція правильна, якщо ні, зміна обійдеться дорожче)
Деякі конфлікти:
- вільно набрано. Потреби формуються під час кожного дзвінка.
- параметр string - у мене погані почуття з цього приводу (розгалуження на значення рядків ...)
- Немає жодного випадку / вимоги використання, яка б надавала додаткову гнучкість, але це може бути в майбутньому.
- API встановлює обмеження: кожен обчислення має виходити з базового класу. Отримати обчислення буде вимушено за допомогою цього методу 1, і передача додаткових параметрів буде неможливою, якщо тільки ми не розробимо ще більш динамічний, надто гнучкий спосіб передачі параметрів, який ще більше збільшує складність.
getCalculation()
.
enum
і ввімкнути його значення. І все-таки я вважаю, що другий варіант є злим, оскільки він відхиляється від KISS.