Dzzirt / OOP

0 stars 0 forks source link

Замечания по программе Shapes #17

Open alexey-malov opened 8 years ago

alexey-malov commented 8 years ago

Избавляйтесь от длинных цепочек вызовов

Не компилируется сравнение line segment-ов

alexey-malov commented 8 years ago

Используй заголовочные файлы с forward declaration классов и интерфейсов

alexey-malov commented 8 years ago

http://stackoverflow.com/questions/2832714/header-files-inclusion-forward-declaration

alexey-malov commented 8 years ago

Рисование лучше запускать внутри методов Visit, либо обеспечить механизм "накопления" информации о посещении. Это сделает возможным введение групповых фигур, которые внутри себя содержат вложенные фигуры

alexey-malov commented 8 years ago

подсказка по 5 лабе:

void ExpectStringContent(const CMyString& str, const char * arr,])
{
    BOOST_REQUIRE_EQUAL(str.GetLength(), len - 1);
    BOOST_CHECK_EQUAL(memcmp(str.GetData(), arr, len), 0);
}

template <size_t len>
void ExpectStringContent(const CMyString& str, const char (&arr)[len])
{
    ExpectStringContent(str, arr, len);
}
...

ExpectStringContent(myStr, "Hello\0world");
alexey-malov commented 8 years ago

В CShapeManager::CreateShape слишком много кода. И он будет увеличиваться при введении доп. фигур Разбить на подфункции, сделать возможность легкого добавления новых типов фигур.

typedef function<unique_ptr<IShape>(const vector<string> & params)> ShapeCreator;
map<string, ShapeCreator> m_shapeCreators;

ShapeCreator MakeCreator(<Указатель на метод класса CShapeManager> p)
{
    return bind(p, this, std::placeholders::_1);
}

m_shapeCreator["circle"] = MakeCreator(&CShapeManager::CreateCircle);
m_shapeCreator["rectangle"] = bind(&CShapeManager::CreateCircle, this, _1);
alexey-malov commented 8 years ago

range-based for компактнее чем for_each

alexey-malov commented 8 years ago
string ShapeToString(const shared_ptr<IShape> & shape)
{
    return shape->ToString();
}

// Вывод фигур в cout через \n
boost::transform(shapes, ostream_iterator<cout>("\n"), ShapeToString);