Программирование. Принципы и практика использования C++ Исправленное издание, стр. 135
Пятьдесят функций для класса
Datenext_Sunday()next_workday()Отметим также, что если представление изменяется, то переписать достаточно только функции, которые имеют к ней прямой доступ. Это вторая важная практическая причина для минимизации интерфейса. Разрабатывая класс
DateРассмотрим несколько примеров вспомогательных функций (helper functions).
Date next_Sunday(const Date& d){ // имеет доступ к объекту d, используя d.day(), d.month() // и d.year() // создает и возвращает новый объект класса Date}Date next_weekday(const Date& d) { /* ... */ }bool leapyear(int y) { /* ... */ }bool operator==(const Date& a, const Date& b){ return a.year()==b.year() && a.month()==b.month() && a.day()==b.day();}bool operator!=(const Date& a, const Date& b){ return !(a==b);}
leapyear()namespace Chrono {class Date { /* ... */ }; bool is_date(int y, Date::Month m, int d); // true для // корректных данных Date next_Sunday(const Date& d) { /* ... */ } Date next_weekday(const Date& d) { /* ... */ } bool leapyear(int y) { /* ... */ } // см. пример 10 bool operator==(const Date& a, const Date& b) { /* ... */ } // ...}Обратите внимание на функции
==!===!=Отметьте также, что мы ввели вспомогательную функцию
is_date()Date::check()DateDateDate9.8. Класс Date
Итак, соединим все идеи и понятия вместе и посмотрим, как будет выглядеть класс
Date...Chrono.h// файл Chrono.h#include "Chrono.h"namespace Chrono {class Date {public: enum Month { jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec };class Invalid { }; // для генерации в виде исключенияDate(int y, Month m, int d); // проверка и инициализация даты Date(); // конструктор по умолчанию // операции копирования по умолчанию // в порядке // немодифицирующие операции: int day() const { return d; } Month month() const { return m; } int year() const { return y; } // модифицирующие операции: void add_day(int n); void add_month(int n); void add_year(int n);private: int y;