Zac*_*Lee 6 c++ design-patterns
我很快为这个问题编写了下面的课程.
我正在寻找一种方式来合并addFruit()与removeFruit()减少的代码.
它们都使用相同的条件,但最后只是使用不同的函数调用.
我的代码:
#include <iostream>
#include <string>
#include <vector>
class MyClass
{
public:
    void addFruit(const std::string &str, int count)
    {
        if (str == "apples")
            addToVec(apples, count);
        else if (str == "oranges")
            addToVec(oranges, count);
        else if (str == "lemons")
            addToVec(lemons, count);
        else if (str == "melons")
            addToVec(melons, count);
        else if (str == "bananas")
            addToVec(bananas, count);
        else
            std::cout << "Unknown Fruit : " << str << '\n';
    }
    void removeFruit(const std::string &str)
    {
        if (str == "apples")
            removeFromVec(apples);
        else if (str == "oranges")
            removeFromVec(oranges);
        else if (str == "lemons")
            removeFromVec(lemons);
        else if (str == "melons")
            removeFromVec(melons);
        else if (str == "bananas")
            removeFromVec(bananas);
        else
            std::cout << "Unknown Fruit : " << str << '\n';
    }
private:
    void addToVec(std::vector<int> &vec, int count)
    {
        vec.push_back(count);
    }
    void removeFromVec(std::vector<int> &vec)
    {
        vec.pop_back();
    }
    std::vector<int> apples;
    std::vector<int> oranges;
    std::vector<int> lemons;
    std::vector<int> melons;
    std::vector<int> bananas;
};
Run Code Online (Sandbox Code Playgroud)
很好地合并这两个函数的任何聪明的方法,所以我可以减少代码?
创建一个附加功能,例如determineTargetVector(const std::string &str)返回相应的矢量,您要插入/删除元素,这样您就没有多余的条件.对每个功能只有一个单一的可靠性也很好.
例如:
std::vector<int> *determineTargetVector(const std::string &str)
{
    if (str == "apples")
        return &apples;
    else if (str == "oranges")
        return &oranges;
    else if (str == "lemons")
        .
        .
        .
    else
        //something invalid, to check for in superior function
        return nullptr;
}
Run Code Online (Sandbox Code Playgroud)