Учебный проект: небольшая библиотека
Спроектируем и построим с нуля одну целостную, переиспользуемую утилиту статистики
Stats<T>, который собирает числа и вычисляет по ним статистику.
- спланировать публичный API маленькой библиотеки ещё до первой строки кода,
- обернуть STL-контейнер (
std::vector<T>) так, чтобы всей памятью занимался RAII, - сделать класс шаблоном, чтобы он работал с
int,doubleи другими типами, - реализовать статистику через алгоритмы STL (
std::accumulate,std::min_element,std::sort), - применить const-корректность и передавать объекты по
const-ссылке, избегая лишних копий.
1. Сначала план: что должна делать библиотека?
Хорошая библиотека похожа на качественный мультитул. Вы не носите десять отдельных приспособлений — вы носите один предмет, каждая кнопка которого делает понятное дело. Прежде чем писать код, мы определяем публичный API — набор операций, доступных пользователю, — а всё остальное держим приватным.
Наша цель: тип Stats<T>, который пользователь наполняет числами, а затем запрашивает привычную статистику. Обещанные операции:
add(value)иoperator+=— добавить число;count(),empty()— сколько чисел уже есть;sum(),mean(),min(),max()— базовые величины;variance(),stddev(),median()— разброс.
Внутреннее хранилище (вектор, массив, файл) касается только самого класса. Это разделение — чистая поверхность над скрытой реализацией — называется инкапсуляцией и в этом весь смысл библиотеки.
mean(), вы вольны менять внутренний способ вычисления, но не вправе менять его внешний смысл.