Re[12]: «Идеальный» класс
От: Максим2006 Беларусь  
Дата: 12.12.06 12:32
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, 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 в том месте где нужно) для конкретной задачи (своя валидация, свои специфические ф-ии). Таким образом, интерфес не раздувается, а расширяется в соответствии с потребностями.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.