powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / похожий код в методах
5 сообщений из 5, страница 1 из 1
похожий код в методах
    #32824703
Man555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лир. отсупление: игра домино. есть класс змейка, которой в конец или начало можно добавлять одну фишку домино.

проблема в следующем: в методах attach_head и attach_tail код, как вы, наверняка заметили очень похож. Смысл кода в этих методах таков: если фишки на концах змейки стыкуются, то присоединить новую фишку, если не стыкуются кинуть исключение.

Такая похожесть чреватата тем, что при внесении изменений , например, в метод attach_head (скажем, нужна новая проверка) жизненно необходимо в ручную менять код и в attach_tail. Вопрос: как от этого избавится, чтобы изменения касались только какой-то одной части?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
class snake {
   private:
        std::deque<card> s;
   public:
        snake() {};
        void attach_head(const card& c);
        void attach_tail(const card& c);

        const card& get_head(void) const {return s.front(); };
        const card& get_tail(void) const {return s.back(); };

        void clear() {s.clear(); };
};
//------------------------------------------------------------------------------
void snake :: attach_head(const card& c)
{
 if (s.empty() == false)
    if (c.is_attachible(s.front()) == false) throw CANNOT_ATTACH;
 s.push_front(c);
}
//------------------------------------------------------------------------------
void snake :: attach_tail(const card& c)
{
 if (s.empty() == false)
    if (c.is_attachible(s.back()) == false) throw CANNOT_ATTACH;
 s.push_back(c);
}
...
Рейтинг: 0 / 0
похожий код в методах
    #32824711
о какой части вы говорите? поменяите свойство is_attachible... кидайте разные исключения например CANNOT_ATTACH_HEAD.. итд.
да что угодно можно придумать.
Не совсем понял зачем старатся озадачить других людей такой ерундой?
//Не сочтите за оскорбление, не со зла...
...
Рейтинг: 0 / 0
похожий код в методах
    #32824770
Man555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прохожий кексо какой части вы говорите? Не совсем понял зачем старатся озадачить других людей такой ерундой?
стралася как можно яснее объяснить.. видимо не получается :-)

вот об этой спрашиваю

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
void snake :: attach_head(const card& c)
{
 if (s.empty() == false)
    if (c.is_attachible(s.front()) == false) throw CANNOT_ATTACH;
 s.push_front(c);
}
//------------------------------------------------------------------------------
void snake :: attach_tail(const card& c)
{
 if (s.empty() == false)
    if (c.is_attachible(s.back()) == false) throw CANNOT_ATTACH;
 s.push_back(c);
}

Во-первых, is_attachible вовсе не свойство. Это метод, который просто говорит можно ли состыковать две произвольные фишки, а в детали его реализации IMHO лезть вовсе не стоит.

Во-вторых, новые исключения вроде предложеных (детализация CANNOT_ATTACH) вообще ничего не даст.

/*
не со зла, но если вы не до конца поняли задачу, то эмоции можно придержать при себе. а вопрос потому, что в коде пишут именно ЧТО УГОДНО. Последствия такого кода я уже пояснял. Хорошо, когда всего два метода вот таких, а если их больше пяти??
*/
...
Рейтинг: 0 / 0
похожий код в методах
    #32824877
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cовета на все случаи жизни Вам никто не даст. А так, в данном конкретном случае добавление узла достаточно легко обобщается:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class snake 
{
....
private: // helpers

    // attach с to node i
    void attach_to(std::deque<card>::iterator i, card const &c)
    {
          if( i != s.end() )
              if( c.is_attachible(*i) == false ) 
                  throw CANNOT_ATTACH;
          s.insert(i, c);
    }
};

Реализация методов attach_head и attach_tail становится тривиальной, а вся функциональность по присоединению сосредотачивается в одном месте, а именно в attach_to:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void snake::attach_head(card const &c)
{
       attach_to(s.begin(), c);
}

void snake::attach_tail(card const &c)
{
       attach_to(s.end(), c);
}

Удачи!
...
Рейтинг: 0 / 0
похожий код в методах
    #32825251
Man555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как всё гениально и просто :-) спасибо! идею понял!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / похожий код в методах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]