第二十二节 重构代码 下

作者: 安静的程序员 | 来源:发表于2019-06-25 08:33 被阅读0次

分析了Layer类与PublicData文件,发现没有需要重构的点,下面就对剩余的两个类进行重构:

01.ScreenMain

该类看起来只有一个方法需要重构:RefreshScreen()。
很明显擦除屏幕和绘制屏幕这两部分的代码几乎相同,像这样的代码就可以使用一个方法代替,重复的代码写很多遍可能会导致出错,用方法代替最好不过了:

// 设置指定坐标点的可见性
void SetPointVisibility(MyPoint point, bool visibility)
{
    if (point._line >= 0 && point._line < 20 && point._list >= 0 && point._list < 10)
    {
        _screen[point._line, point._list].SetActive(visibility);
    }
}

然后在刷新屏幕方法中调用即可:

// 刷新屏幕
public void RefreshScreen()
{
    // 擦除屏幕
    foreach (var point in _viewData) SetPointVisibility(point, false);
    // 记得清除旧的显示数据
    _viewData.Clear();

    // 遍历图层 - 填充显示数据
    foreach (var layer in _layerList)
    {
        // 遍历该图层上的每个点并计算新点的坐标
        foreach (var point in layer.ViewData)
        {
            MyPoint newPoint = new MyPoint();
            // 新点的坐标 = 图层的坐标 + 旧点在图层上的坐标
            newPoint._line = layer.Point._line + point._line;
            newPoint._list = layer.Point._list + point._list;
            // 添入一个点至显示数据
            _viewData.Add(newPoint);
        }
    }

    // 遍历显示数据 - 绘制图形
    foreach (var point in _viewData) SetPointVisibility(point, true);
}

接着重构导演类

02.Director

在导演类中,有许多成员变量,所有的成员变量都需要初始化。除了成员需要初始化,游戏还有一些必要的初始化工作,例如主屏幕必须初始化,必须添加“方块”图层。目前这些工作都是直接写在Start()方法中的,其中有许多判断是否为空的代码。更好的做法是,将这些初始化封装为一个方法,并返回一个布尔表示是否初始化成功,如果初始化失败,就不启动游戏核心逻辑。
然后一些后面反复会用到的对象可以用成员变量代替,例如默认图层和方块图层,现在只有方块图层是成员变量。
在类中添加一个成员:

Layer _defaultLayer;        // 默认图层

再添加一个方法,初始化游戏:

// 初始化游戏
bool InitGame()
{
    // 初始化主屏幕
    _screenMain = Screen-Main.GetComponent<ScreenMain>();
    if (_screenMain == null) return false;
    _screenMain.Init();

    // 添加方块图层
    _screenMain.AddLayer("Block");
    // 获取默认图层和方块图层引用
    _defaultLayer = _screenMain.GetLayer("DefaultLayer");
    if (_defaultLayer == null) return false;
    _blockLayer = _screenMain.GetLayer("Block");
    if (_blockLayer == null) return false;

    // 添加初始方块
    _blockLayer.Point = new MyPoint(20, 4);
    EBlockType blockType = BlockCrea-tor.GetInstance().RandomBlockType();
    _blockLayer.ViewData = BlockCrea-tor.GetInstance().CreateBlock(blockType);

    // 刷新屏幕
    _screenMain.RefreshScreen();

    return true;
}

修改Start()方法:

void Start()
{
    bool initSuccess = InitGame();

    // 启动定时器,执行游戏核心逻辑
    if (initSuccess) InvokeRepeating("GameCore", 0, 1);
}

因为默认图层已经使用成员变量替代,那么CanMoveDown()方法中的获取默认图层的代码就直接使用成员变量即可:

_screenMain.GetLayer("DefaultLayer")

修改为:

_defaultLayer

再来看下落方块代码,在游戏核心流程概述中,需要判断下落是否成功来消除方块和生成新方块,但目前下落方块方法什么都不返回,所以修改如下:

// 下落方块
bool MoveDownBlock()
{
    if (CanMoveDown())
    {
        MyPoint newPoint = _blockLayer.Point;
        newPoint._line -= 1;
        _blockLayer.Point = newPoint;
        // 刷新
        _screenMain.RefreshScreen();

        return true;
    }

    return false;
}

好了,到此,重构代码就告一段落了,千万别以为重构就此结束了。随着代码量的增加,你可能每天都需要重构。

代码链接:https://pan.baidu.com/s/1OjKbaI3W-U6DGwy2ijau_w
提取码:rb0p

相关文章

  • 第二十二节 重构代码 下

    分析了Layer类与PublicData文件,发现没有需要重构的点,下面就对剩余的两个类进行重构: 01.Scre...

  • 代码重构专题(转载)

    代码重构(一):函数重构规则代码重构(二):类重构规则代码重构(三):数据重构规则代码重构(四):条件表达式重构规...

  • 《重构-改善既有代码的设计》PDF高清完整版-免费下载

    《重构-改善既有代码的设计》PDF高清完整版-免费下载 《重构-改善既有代码的设计》PDF高清完整版-免费下载 下...

  • 《重构》一书总结(二)

    《重构》一书总结(二) 重构的重点,在于对那些代码进行重构,如果重构不当,反而适得其反。 重构代码终结如下 1.D...

  • 我的重构感悟

    在三年前我就读了《重构改善既有代码的设计》,里面写了很多有关代码重构的技巧,知易行难!我整理了一下重构给我的感悟。...

  • Java代码重构

    1、什么是重构? 在不改变代码接口的情况下,对代码作出修改,以改进程序的内部结构。本质上说,重构就是在代码写好之后...

  • 为什么QA不喜欢重构?

    经常听到开发人员抱怨 “这么烂的代码,我来重构一下吧!”,“这代码怎么能这么写呢?谁来重构一下?”,“这儿有个坏味...

  • 做了就做到最好

    从今往后自己负责的功能模块都把细节做到最好。理清思路,代码能重构的都重构下。不要给别人改进你代码的机会。 ...

  • Android开源-KeepGank.IO 2.0

    几个月前重构了KeepGank的代码,没有发布,这次正式的宣传一下。 本次重构主要做了以下工作: 整体代码按模块功...

  • Mvc分页组件MvcSimplePager代码重构

    Mvc分页组件MvcSimplePager代码重构 Mvc分页组件MvcSimplePager代码重构1.1 In...

网友评论

    本文标题:第二十二节 重构代码 下

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