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 в том месте где нужно) для конкретной задачи (своя валидация, свои специфические ф-ии). Таким образом, интерфес не раздувается, а расширяется в соответствии с потребностями.
Re[3]: «Идеальный» класс
От: MBy  
Дата: 12.12.06 14:02
Оценка:
Здравствуйте, np9mi7, Вы писали:

N>Мне кажется, что это зависит от задачи.

Да, это очевидно. Но ведь и небыло конкретного вопроса. Была как бы просьба высказать рекомендации по организации (:
Re[2]: «Идеальный» класс
От: MBy  
Дата: 12.12.06 14:03
Оценка:
Здравствуйте, LaptevVV, Вы писали:

MBy>>Сообственно, мелочный вопрос. В общем случае, так ли должен выглядеть «идеальный» класс?

LVV>Слово "идеальный" тут не подходит... Коплиен давно назвал: каноническая форма класса...
Именно потому я и взял это слово в кавычки. Не подходящее, согласен. Написал, что первое в голову пришло.
Re[2]: «Идеальный» класс
От: MBy  
Дата: 12.12.06 14:07
Оценка:
Здравствуйте, superman, Вы писали:

Ты единственный, кто ответил что-то вразумительное. А то все только прикалываються по-поводу неудачного названия темы (:

S>Безотносительно рассуждений о несостоятельности слова "иделльный" — не нравиться мне ваш клас. Я бы убрал из него protected секцию а всё что в ней отпавил с private


Сообственно, я тоже так всегда делал. Но мой приятель сказал мне, что необходимо писать именно так, как указано в моем вопросе. Посему меня и посетили сомнения, посему я и задал этот вопрос.
Re[13]: «Идеальный» класс
От: Vamp Россия  
Дата: 12.12.06 15:19
Оценка:
Сдается мне, что это — горе от ума.
Да здравствует мыло душистое и веревка пушистая.
Re[14]: «Идеальный» класс
От: Максим2006 Беларусь  
Дата: 12.12.06 15:46
Оценка:
Здравствуйте, Vamp, Вы писали:

V>Сдается мне, что это — горе от ума.

в чём конкретно? чем лучше иметь кучу отвязанных функций?
Re[3]: «Идеальный» класс
От: superman  
Дата: 12.12.06 17:56
Оценка:
Здравствуйте, MBy, Вы писали:

MBy>Сообственно, я тоже так всегда делал. Но мой приятель сказал мне, что необходимо писать именно так, как указано в моем вопросе. Посему меня и посетили сомнения, посему я и задал этот вопрос.


правильно делал, я придержеваюсь следующей рекомендации: клас должен предоставлять интерфецс реализующий абстракцию и максимально скрывать совю реализацию, в том числе и от потомков, само собой "серебряной пули" не существует, но все написанные мною protected методы это всего лиш попытка решить то, чего так и не удалось решить на этапе дизайна-передезайна.
Re[4]: «Идеальный» класс
От: superman  
Дата: 12.12.06 18:04
Оценка:
Здравствуйте, remark, Вы писали:

R>Иногда идеальный вариант:

R>
R>struct point
R>{
R>  int x;
R>  int y;
R>};
R>


в текущем проэкте мы встали на подобные грабли воспользовались просто структурой, для просто физического обьединению данных для передачи, положили эти структуры в вектора... — потом когда начали юзать — таки пришли к выводу что всё таки не плохо было бы опереровать абстрактными сучностями...

R>Нет? А Вы поглядите сколько кода надо написать в таком варианте и при полной инкапсуляции. А главное, что эта инкапсуляция даст, кроме увеличения кода?


встречал рекомендацию даже в таком случае делать так... конечно о полной инкапсуляции тут речь не идёт
class point
{
  int x;
  int y;
public:
  int& get_x(){return x;}
  int& get_y(){return y;}
};
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.