Здравствуйте, сегодня я хочу поделиться очень важным советом по проектированию 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