Здравствуйте, сегодня я хочу поделиться очень важным советом по проектированию API из книги Effective C++. Это выглядит следующим образом:
Сделайте интерфейсы простыми в использовании правильно и сложными в использовании неправильно.
Если вы разрабатываете библиотеку, движок и т. д., подумайте о том, какие ошибки могут совершать ваши клиенты. Например, предположим, что вы разрабатываете класс, предоставляющий доступ к датам:
class Date{ public: Date(int uMonth, int uDay, int uYear); }
Ваши пользователи могут неправильно использовать этот интерфейс, выполнив следующие действия:
Date date(5,12,2015); //Oops!!! They meant to say Dec 5, 2015
По словам Скотта Мейерса, многие ошибки клиентов можно предотвратить путем введения новых типов. В этом случае вы можете предоставить простые типы оболочек, чтобы различать дни, месяцы и годы:
struct Day{ explicit Day(int d):val(d){} int val; }; struct Month{ explicit Month(int m):val(m){} int val; }; struct Year{ explicit Year(int y):val(y){} int val; };
Теперь класс будет выглядеть так:
class Date{ public: Date(const Month& uMonth, const Day& uDay, const Year& uYear); }
Итак, теперь пользователи вашей библиотеки смогут использовать интерфейс следующим образом:
Date d(Month(12),Day(5),Year(2015));
Это предотвратит неправильное использование интерфейса. Например, если они попытаются сделать следующее, код не скомпилируется:
Date d(Day(5),Month(12),Year(2015)); //Wrong types, won't compile
Скотт Мейерс советует помнить следующее:
В идеале, если попытка использования интерфейса не даст ожидаемого клиентом результата, код не будет скомпилирован; и если код скомпилируется, он будет делать то, что хочет клиент.
Подводя итог, можно сказать, что существует несколько способов сделать интерфейс удобным для правильного использования и трудным для неправильного. Одним из таких способов является использование новых типов в качестве оболочек в вашем интерфейсе.
Надеюсь это поможет.
Получите больше советов по разработке на haroldserrano.com