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

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

更多内容

最新文章

  1. Codeforce Round #216 Div2
  2. 某代理网站免费IP地址抓取测试
  3. 用CSV文件读写数据的两种方式(转)
  4. easyui源码翻译1.32--Menu(菜单)
  5. Codeforces 712E Memory and Casinos
  6. Python实现翻译功能
  7. 匿名内部类使用外面的类为什么要用final型
  8. 进阶开发——文档,缓存,ip限速
  9. 老男孩python学习自修第十八天【面向对象】
  10. (原创)C# 压缩解压那些事儿
  11. 学习笔记43—Linux基础集
  12. Linux 双网卡配置两个IP同时只有一个会通的原因
  13. 吴裕雄 02-mysql PHP语法
  14. C#6.0语言规范(十三) 接口
  15. 纯CSS3实现打火机火焰动画
  16. 【问题收集·中级】关于指示器自定义图片与UUID
  17. shell函数中eof报错(warning: here-document at line 9 delimited by end-of-file (wanted `EOF'))
  18. C++的iterator与const_iterator
  19. hdu2098 分拆素数和 素数筛
  20. win10下装的ubuntu14.04双系统,ubuntu系统访问win10磁盘问题

热门文章

  1. spring的aop 基于schema
  2. css3打包后自动追加前缀插件:autoprefixer
  3. 用一个小例子来谈谈javascript的运行机制
  4. sql left join 字符串
  5. CentOS 7运维管理笔记(1)----设置默认启动模式为GUI模式或命令行模式
  6. hdu 2063 过山车(模板)
  7. Quick Easy FTP Server FTP工具文件传输使用
  8. QT 定时执行某个函数,隐藏某个控件
  9. vs2013 c# 中调用 c 编写的dll出错的可能错误
  10. android之键盘转载