모던 c++ 디자인 패턴 을 읽고 인상 깊었던 내용을 정리합니다.
enum class Color { Red, Green, Blue };
enum class Size { Small, Medium, Large};
struct Product
{
string name;
Color color;
Size size;
};
struct ProductFilter
{
typedef vector<Product*> Items;
Items by_color(Items items, Color color);
};
ProductFilter::Items ProductFilter::by_color(Items items, Color color)
{
Items result;
for (auto& i : items)
{
if (i->color == color)
{
result.push_back(i);
}
}
return result;
}
ProductFilter::Items ProductFilter::by_color_and_size(Items items, Size size, Color color)
{
Items result;
for (auto& i : items)
{
if (i->size == size && i->color == color)
{
result.push_back(i);
}
}
return result;
}
필터링 절차를 두 개의 부분으로 나눈다. (필터와 명세)
template <typename T>
struct Specification
{
virtual bool is_satisfied(T* item) = 0;
};
template <typename T>
struct Filter
{
virtual vector<T*> filter(
vector<T*> items,
Specification<T>& spec) = 0;
};
struct BetterFilter : Filter<Product>
{
vector<Product*> filter(
vector<Product*> items,
Specification<Product>& spec) override
{
vector<Product*> result;
for (auto& p : items)
{
if (spec.is_satisfied(p))
{
result.push_back(p);
}
}
return result;
}
};
해당 코드를 사용하는 클라이언트 입장에서 충분히 예측 가능한 처리를 하도록 코드를 작성해야 한다.
당연한 소리지만 코드를 짤 때 잊게 되는 것 같다.
struct IMachine
{
virtual void print(vector<Document*> docs) = 0;
virtual void fax(vector<Document*> docs) = 0;
virtual void scan(vector<Document*> docs) = 0;
}