美文网首页
一次正交设计之旅

一次正交设计之旅

作者: _张鹏鹏_ | 来源:发表于2021-10-05 15:50 被阅读0次

    文章来自于刘光聪,实践了一把,觉得在代码设计上自己有如下收益:

    1. 多级容器封装;
    2. 分离变化方向;
    3. 依赖于稳定;
    4. C++私有继承堪称C++的必杀技之一。

    原文章里面代码有编译错误,这里重新整理了一下,方便大家看。重构的思路可以看原文章:一次正交设计之旅

    重构前的代码:

    static vector<vector<int>> getFlaggedCells(vector<vector<int>>& board)
    {
        vector<vector<int>> result;
        for (auto x : board)
        {
            if (x[0] == 4)
            {
                result.push_back(x);
            }
        }
        return result;
    }
    
    int countFlaggedCells(vector<vector<int>>& board)
    {
        vector<vector<int>> result = getFlaggedCells(board);
        return result.size();
    }
    
    static vector<vector<int>> getUnflaggedCells(vector<vector<int>>& board)
    {
        vector<vector<int>> result;
        for (auto x : board)
        {
            if (x[0] == 3)
            {
                result.push_back(x);
            }
        }
        return result;
    }
    
    int countUnflaggedCells(vector<vector<int>>& board)
    {
        vector<vector<int>> result = getUnflaggedCells(board);
        return result.size();
    }
    
    static vector<vector<int>> getAliveCells(vector<vector<int>>& board)
    {
        vector<vector<int>> result;
        for (auto x : board)
        {
            if (x[0] == 2)
            {
                result.push_back(x);
            }
        }
        return result;
    }
    
    int countAliveCells(vector<vector<int>>& board)
    {
        vector<vector<int>> result = getAliveCells(board);
        return result.size();
    }
    
    // global variable
    vector<vector<int>> store;
    
    void saveAliveCells(vector<vector<int>>& board)
    {
        store = getAliveCells(board);
    }
    

    重构后的代码:

    enum State
    { INIT,SELECTED,ALIVE,FLAGGED };
    
    struct Cell
    {
        bool flagged() const
        {
            return master() == FLAGGED;
        }
    
        bool alive() const
        {
            return master() == ALIVE;
        }
    private:
        State master() const
        {
            return states.front();
        }
    private:
        vector<State> states;
    };
    
    struct CellCollector
    {
        virtual void add(const Cell& cell) = 0;
        virtual ~CellCollector()
        {
        }
    };
    
    // 公有继承
    template<typename Pred>
    struct CellCounter :CellCollector
    {
        CellCounter(Pred pred) :num(0), pred(pred)
        {
        }
        int get() const
        {
            return num;
        }
    private:
        void add(const Cell& cell)
        {
            if (pred(cell))
                ++num;
        }
    private:
        int num;
        Pred pred;
    };
    
    struct GameBoard
    {
        int countFlaggedCells() const
        {
            return count([](const Cell& cell){
                return cell.flagged();
            });
        }
    
        int countUnflaggedCells() const
        {
            return count([](const Cell& cell){
                return !cell.flagged();
            });
        }
    
        int countAliveCells() const
        {
            return count([](const Cell& cell){
                return cell.alive();
            });
        }
    
        void List(CellCollector& col) const
        {
            for (auto &cell : cells)
            {
                col.add(cell);
            }
        }
    private:
        template<typename Pred>
        int count(Pred pred) const
        {
            CellCounter<Pred> counter(pred);
            List(counter);
            return counter.get();
        }
    private:
        vector<Cell> cells;
    };
    
    // 私有继承 
    struct CellStore :private CellCollector
    {
        void save(const GameBoard& board)
        {
            board.List(*this);
        }
    private:
        void add(const Cell& cell)
        {
            if (cell.alive())
                cache.push_back(cell);
        }
    private:
        vector<Cell> cache;
    };
    
    

    参考文献:

    1. 一次正交设计之旅
    2. C++ 私有继承
    3. 容器与封装 - 简书 (jianshu.com)

    相关文章

      网友评论

          本文标题:一次正交设计之旅

          本文链接:https://www.haomeiwen.com/subject/ymjgnltx.html