代码中,我们都会把一些可扩展的类抽象出来一层抽象类、基类、接口。子类去重写或者实现这些方法。比方不同平台连接wifi,安卓设备,苹果设备,PC...我们可能会设计一个抽象接口,IConnector,内部写个函数ConnectWifi,然后再写三个类,AndroidConnector,iOSConnector,PCConnector。这样的栗子举到胳膊断了都举不完,这些栗子的 共同点是,他们都是由一个可扩展的类控制。

但是我举这样一个栗子:一个游戏里我们选人物,有两种类型的装备需要选择,第一个是防具,第二个是武器,防具分为皮甲,锁甲,重甲等等,武器分为剑、刀、长矛、锤子等等....需求是:穿戴不同的防具和武器,人物的动画不同。这就是一个典型的嵌套判断问题,也就是说一个事物需要两个类去判断,而且这两个类还可扩展。

==============================

解决这类问题,我目前只能想到以下几种方法,第一章节我想先写一些需要条件判断的,也就是需要if,else,switch的

1.第一种方法是直接在武器类(或者防具类)里通过if、else if、else、switch去判断另一个类型,并实现动作。

interface IWeapon
{void playAnimation();
}public class Sword : IWeapon
{public void PlayAnimation(){if(皮甲){//敲代码 动画}else if(锁甲){//不要怂 动画}else if(重甲){    //就是干 动画}...}
}

这种代码,如果对于我上面的要求,可能显得很搞笑。但是,并不是每一个需要扩展的类都像栗子这样如此的扩展性强。如果其中一个类相对来说扩展性低且数目少,这个做法是绝对可行的,因为只需要在相对扩展性高的那个类里去把另一个扩展性低的类情况列出来即可。

==============================

2.第二种方法是防具类和武器类合二为一,排列组合组成一个更细的类。外层通过if,else if,switch去控制具体使用哪个类。

interface IEquipment    //装备接口,不区分防具和武器
{void PlayAnimation();
}public class LeatherSwordEquipment : IEquipment   //皮甲+剑
{public void PlayAnimation(){//播放动画}
}public class AnimationPlayController
{private int armorType;private int weaponType;private IEquipment equipment;public void PlayAnimation(){if(armorType == 皮甲 && weapontype == 剑){equipment = new LeatherSwordEquipment();}...equipment.PlayAnimation();}
}

这种写法的话,假如防具有x种,武器有y种,增加一种防具,增加y个类,增加一种武器,增加x个类,同时还要增加条件判断,反正就是跟各种设计原则都不符。但是如果x和y都相对较少,这种设计方法不失为一种选择,而且这种方法如果出问题,很容易定位。但是相对的,除了需要创建大量的类,更致命的是,毕竟防具和武器都有自己独有的属性,合并在一起仅仅为了动画这一个需求明显不合适。

=============================

3.第三种设计可以说是第一种和第二种设计的结合,首先需要两层的抽象,第一层就是抽象出来装备接口IEquip,第二层是再抽象防具接口和武器接口去继承装备接口,IArmor:IEquip,IWeapon:IEquip。然后,越靠后面出现的装备,就越需要做更多的适配。毕竟我们写装备的类是一个一个写的,那么当前设计的武器,只需要去根据当前已有的防具去播放相应的动作。也就是说,越晚出现的装备,就要去适配更多已有的装备。武器和防具都有播放人物动画的控制权,但是,如果不认识对方,就需要将动画的控制权交给对方。直接上代码

interface IEquipment
{void PlayAnimation();
}public interface IArmor : IEquipment
{//Something for Armor
}public interface IWeapon : IEquipment
{//Something for Weapon
}public class Leather : IArmor
{IWeapon currentWeapon;    //此时需要获取到对方的引用public void PlayAnimation() //皮甲只认识刀{if(刀){//播放动画}else{currentWeapon.PlayAnimation();    //这个武器我不认识,动画控制权转交过去}}
}public class Sword : IWeapon
{IArmor currentArmor;public void PlayAnimation(){if(皮甲)    //由于我比皮甲晚出现,那么我一定认识皮甲{//播放动画}else if(锁甲){//播放动画}else{currentArmor.PlayAnimation();    //我做不到的就留给后人去做了...}}
}

虽然随着装备的增多,装备的判断会可能会越来越多,但是他居然符合开闭原则,因为我们每一个写好的类,他们都不需要因为新出现的类而做任何的更改。原因就是因为这个else判断,他把控制权转交给自己的子孙。而且,这个设计方式最优秀的地方是,他可以不受维度的限制,比如说,我又多了一个鞋子装备,一个角色带不同的武器,防具,鞋子,播不同的动画。这个设计方式他也能满足要求,因为只要鞋子也继承自IEquipment,那么他们都属于装备这一维度。

==============================

先写这么多吧,欢迎讨论

[Unity 代码写法整理]嵌套判断问题(一)相关推荐

  1. dll放在unity哪个文件夹下_程序丨如何将你的Unity代码整理到一个DLL中?

    原标题:程序丨如何将你的Unity代码整理到一个DLL中? 翻译:林政(玄猫大人) 审校:沈晓霖 代码复用的重要性 这里有一则故事也是你听过类似的: 你下载好Unity,看完Youtube上的一些教程 ...

  2. 项目中遇到一些实用/优秀的代码写法(杂烩)

    2019独角兽企业重金招聘Python工程师标准>>> 实用/优秀的代码写法 es6 数组Array支持链式编程,例子身份证中间几位用'*'代替,替代了我组长说的substr的基础写 ...

  3. Vanishing Point Detection 消影点/消失点/灭点检测代码学习整理笔记

    VanishingPointDetection 代码学习整理 main.cpp VPDetection.h VPDetection.cpp run() getVPHypVia2Lines getSph ...

  4. 单元测试系列之九:Sonar 常用代码规则整理(一)

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 摘要:公司部署了一套sonar,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分 ...

  5. Unity代码添加设置Tag或Layer

    Unity代码设置Tag或Layer 描述 代码 注意 描述 Unity中设置Tag和Layer的方法,大家都知道,步骤较为繁琐.有时将一些代码复用到其他项目时,经常会出现Tag或Layer,不存在或 ...

  6. 程序员的你,有哪些炫技的代码写法?

    很高兴参加这次分享活动,以下是我对程序员炫技代码写法的一些见解和经验分享: 一.代码美感-灵动转换 美感是良好的编码风格的核心,代码美感平衡了可读性和编写效率,让我们的代码具有更好的可理解和可维护性. ...

  7. 比较炫技的Java代码写法

    作为一名程序员,我们经常会遇到需要写出高效.简洁.易读的代码的情况.在这里,我分享一些我认为比较炫技的Java代码写法,包括一些算法示例,希望能够大家带来一些启发. Lambda表达式 Lambda表 ...

  8. 分享Java代码中一些常见的炫技代码写法,请各位点赞、收藏

    以下是一些常见的例子.请记住,这些写法通常是为了展示技术的巧妙和灵活性,但并不一定适用于所有情况.在实际项目中,可读性和可维护性应始终是首要考虑因素. 流式操作(Stream API): List&l ...

  9. 【C 语言】C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )

    文章目录 一.C 项目开发代码规范 一.C 项目开发代码规范 上一篇博客 [C 语言]字符串模型 ( 键值对模型 ) 中 , 完成了字符串的 键值对 查找功能 , 代码不太规范 ; C 项目开发代码规 ...

最新文章

  1. 关于Yii2中CSS,JS文件的引入心得
  2. NOIP2011 提高组 Day1
  3. DDD理论学习系列(1)-- 通用语言
  4. webview与android java交互
  5. Laravel 启动流程分析 (代码全流程)
  6. JMeter如何和Charles进行接口测试
  7. C++ Template 使用简介
  8. BZOJ.4650.[NOI2016]优秀的拆分(后缀数组 思路)
  9. 【证明】【一题多解】布尔不等式(union bound)的证明
  10. WebService与RestAPI 、SoapAPI
  11. Flexsim 强化学习
  12. 多种矿石混合的抗干扰矿石对讲机
  13. 【存档】双向可控硅的工作原理
  14. SpringBoot+Layui就业信息管理系统
  15. 京东Cookie抓取
  16. 【原创】自定义分页控件WPF
  17. android x86 cm14,cm14.1下载|cm14.1(cyanogenmod) 官方版 - 软件下载 - 绿茶软件园|33LC.com...
  18. C语言数组知识点总结
  19. 27习题幼儿园买玩具
  20. 港口起重机PLC远程监控.PLC远程编程.PLC数据采集管理系统

热门文章

  1. Android系统默认Home应用程序 Launcher 的启动过程源代码分析
  2. python字符串问题—文件排版
  3. Android LiveData初识
  4. ISO14229之概述
  5. 元学习之《On First-Order Meta-Learning Algorithms》论文详细解读
  6. 加息+四巫日铁矿石大跌,棕榈油认沽最高30倍,豆一09-01继续反套2022.6.15
  7. 会议记录管理系统(6) - 查找会议记录模块设计
  8. 我对大学的憧憬||每个人都有自己的罗马
  9. IOS 文件读写操作详解及简单实例
  10. WordPress编辑器支持pdf上传