Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, np9mi7, Вы писали:
N>>Согласен, например в месте в котором могут быть получены невалидные данные. Так или иначе, метод или функция выполняющая эту проверку завязана на логику point, а значит входит в её интерфейс — это и хотел показать.
К>А вот входит ли валидация в интерфейс — и как она туда входит — это большой вопрос.
К>В ряде случаев разумнее сделать внешнюю функцию (или даже набор функций), нежели раздувать интерфейс класса.
К>К>struct point { int x, y; };
К>struct rect { point tl, br; };
К>////////////////////////////////////////////////////////////////////
К>bool is_valid_rect(const rect& rt) { return rt.tl.x<=rt.br.x && rt.tl.y<=rt.br.y; }
К>bool is_null_rect(const rect& rt) { return rt.tl.x==rt.br.x && rt.tl.y==rt.br.y; }
К>bool in_rect (point pt, const rect& rt) { return rt.tl.x<=pt.x && pt.x< rt.br.x && rt.tl.y<=pt.y && pt.x< rt.br.x; }
К>bool in_rect_plus(point pt, const rect& rt) { return rt.tl.x<=pt.x && pt.x<=rt.br.x && rt.tl.y<=pt.y && pt.x<=rt.br.x; }
К>bool in_rect(const rect& rti, const rect& rto) { return in_rect_plus(rti.tl, rto) && in_rect_plus(rti.br, rto); }
К>const rect meaningful_rect = { { SHORT_MIN, SHORT_MIN }, { SHORT_MAX, SHORT_MAX } };
К>bool is_meaningful(point pt) { return in_rect(pt, meaningful_rect); }
К>bool is_meaningful(const rect& rt) { return is_valid_rect(rt) && in_rect(rt, meaningful_rect); }
К>
ИМХО, лучше как-то так
struct point { int x, y; };
struct point_hlp // or namespace
{
static point transform(const point& pt, int k, int b);
// other static specific functions and static consts
};
struct Point : point
{
void transform(int k, int b) { *this = point_hlp::transform(*this, k, b); }
// other specific functions
};
struct PointRef // optional
{
PointRef(point& pt) : m_pt(pt) {}
void transform(int k, int b) { m_pt = point_hlp::transform(m_pt, k, b); }
// other specific functions
private:
point& m_pt;
};
Дальше плодятся классы (или расширяется namespace point_hlp в том месте где нужно) для конкретной задачи (своя валидация, свои специфические ф-ии). Таким образом, интерфес не раздувается, а расширяется в соответствии с потребностями.