• Unity 游戏框架搭建 2017 (二十三) 重构小工具 Platform


    在日常开发中,我们经常遇到或者写出这样的代码

    var sTrAngeNamingVariable = "a variable";
    
    #if UNITY_IOS || UNITY_ANDROID || UNITY_EDITOR
    		sTrAngeNamingVariable = "a!value";
    #else
    		sTrAngeNamingVariable = "other value";
    #endif
    

    宏本身没有什么问题。但是 MonoDevelop IDE 上,只要写了宏判断,后边的代码的排版就会出问题。这是第一点。

    第二点是,当我们发现 sTrAngeNamingVariable 的命名很不规范的时候,要对此变量进行重命名。一般的 IDE 都会支持变量/类/方法的重命名。

    借助 IDE 的重命名功能,代码会变成如下:

    var strangeVariableName = "a variable";
    
    #if UNITY_IOS || UNITY_ANDROID || UNITY_EDITOR
    	strangeVariableName = "a!value";
    #else
    	sTrAngeNamingVariable = "other value";
    #endif
    

    else 代码块里的变量重命名没有成功。当宏判断散落在各处时,很难发现这种错误。直到打包/AssetBundle/切换平台时,问题才会暴露(笔者也是被坑了很多次T.T)。

    从这里得出的结论 : 当进行重构时,宏相关的代码会对重构造成风险,也不利于维护。在这里笔者设计出了 Platform。首先看下怎么使用:

    var strangeVariableName = "a variable";
    
    if (Platform.IsiOS || Platform.IsAndroid || Platform.IsEditor)
    {
    	sTrAngeNamingVariable = "a!value";
    }
    else
    {
    	sTrAngeNamingVariable = "other value";
    }
    

    代码很简单,就是把 宏 换成了 Platform 而已。
    这时候我们再进行下重命名。重命名后代码如下:

    if (Platform.IsiOS || Platform.IsAndroid || Platform.IsEditor)
    {
    	strangeNamingVariable = "a!value";
    }
    else
    {
    	strangeNamingVariable = "other value";
    }
    

    重命名问题解决了。
    Platform 的代码很简单,贴出简单看下就可以了。

    namespace QFramework
    {
    	public class Platform
    	{
    		public static bool IsAndroid
    		{
    			get
    			{
    				bool retValue = false;
    #if UNITY_ANDROID
    				retValue = true;    
    #endif
    				return retValue;
    			}
    		}
    		 
    		public static bool IsEditor
    		{
    			get
    			{
    				bool retValue = false;
    #if UNITY_EDITOR
    				retValue = true;    
    #endif
    				return retValue;
    			}
    		}
    		
    		public static bool IsiOS
    		{
    			get
    			{
    				bool retValue = false;
    #if UNITY_IOS
    				retValue = true;    
    #endif
    				return retValue;
    			}
    		}
    	}
    }
    

    只是简单的把宏封装了一下。

    但是 Platform 不是万能的,有一些事项还是要注意一下。

    • 在有 Platform 的条件语句块里,不能使用平台特有的 API ,如果要使用这种 API 还是建议封装一下,平台特有的 API 或者 宏 最好不要出现在 UI 或者 逻辑层代码中。
    • Platform.cs 这个类不能打成 dll。
    • 其他的大家来补充:),目前上线了几个项目,都没什么问题。

    当笔者在接手一个项目的时候,优先会把所有宏相关的判断,能换的全换成 Platform ,不能换的,比如使用了平台特有 API 的都会简单封装下,然后再进行一些小部分的重命名,以熟悉一些代码的逻辑。

    有一些宏判断比较棘手,比如:

    if ("1" == "2" || "2" == "3")
    {
    	// do sth
    #if UNITY_EDITOR
    }
    else
    {
    	// do sth	
    #else
    	// do sth
    #endif
    }
    

    如果遇到这种代码,
    首先先揍一顿写这种代码的人吧。哈哈,开玩笑的。
    体谅一下吧,也许是版本太急了,谁都不想写出这样的代码,都有苦衷,都不容易,最起码是没有 bug 的。

    解决办法是有的,就是复制一遍代码。第一份代码删掉 # if 代码块的代码,把宏换成对应的 Platform API,第二份代码删掉 # else 代码块的代码,然后一样把宏换成对应的 Platform API。 剩下的就容易解决了。

    17 年年底的时候看了 《重构》 这本书,这里还是推荐大家看一下吧,有点枯燥,但是收获很多。

    Hard Code 是难免的,追求代码质量的道路是没有终点的,让代码产生价值才是我们游戏开发者要做的。

    今天就到这里。

    转载请注明地址:凉鞋的笔记:liangxiegame.com

    更多内容

  • 相关阅读:
    【矩阵乘】【DP】【codevs 1305】Freda的道路
    Giraph源代码分析(九)—— Aggregators 原理解析
    Dubbo框架应用之(三)--Zookeeper注冊中心、管理控制台的安装及解说
    Oracle中对数字加汉字的排序(完好)
    PKU-2104-K-th Number
    IE下推断IE版本号的语句
    自己定义View时,用到Paint Canvas的一些温故,简单的帧动画(动画一 ,"掏粪男孩Gif"顺便再提提onWindowFocusChanged)
    <html>
    测试一个网段主机在线情况,禁ping的情况除外
    glance image-create --name "wj_js_company_img" --file a0e1c7fa-d6d3-410f-9bb5-e699e342db91 --disk-format qcow2 --container-format bare --progress --visibility public
  • 原文地址:https://www.cnblogs.com/liangxiegame/p/9139277.html
Copyright © 2020-2023  润新知