Пятьдесят функций для класса Date
next_Sunday
, next_workday
и т.д. Пятьдесят — это совсем не невероятное число для класса, разработанного для удобства пользователей, а не для удобства его проектирования, реализации и сопровождения.Отметим также, что если представление изменяется, то переписать достаточно только функции, которые имеют к ней прямой доступ. Это вторая важная практическая причина для минимизации интерфейса. Разрабатывая класс Date
Рассмотрим несколько примеров
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
. Часто для идентификации вспомогательных функций используются пространства имен (см. раздел 8.7).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
, поскольку проверка корректности даты во многом не зависит от представления класса Date
. Например, нам не нужно знать, как представлены объекты класса Date
для того, чтобы узнать, что дата “30 января 2008 года” является корректной, а “30 февраля 2008 года” — нет. Возможно, существуют аспекты даты, которые зависят от ее представления (например, корректна ли дата “30 января 1066 года”), но (при необходимости) конструктор Date
может позаботиться и об этом.9.8. Класс Date
Итак, соединим все идеи и понятия вместе и посмотрим, как будет выглядеть класс Date
...
, фактическая реализация слишком сложна (пожалуйста, не пытайтесь пока ее написать). Сначала разместим объявления в заголовочном файле Chrono.h
.// файл Chrono.h