网站建设使用的什么软件有哪些方面,网络游戏新规,wordpress flash,广东东莞厚街买婬女菜菜哥#xff0c;出大事啦怎么了#xff0c;你和男票分手了#xff1f;很正常#xff0c;谁让你男票是产经经理呢不是啦#xff0c;是我做的一个小游戏#xff0c;需求又变了#xff0c;程序我快改不动了说来让我欢乐一下#xff1f;菜菜哥#xff0c;咱两还能不能好… 菜菜哥出大事啦怎么了你和男票分手了很正常谁让你男票是产经经理呢不是啦是我做的一个小游戏需求又变了程序我快改不动了说来让我欢乐一下菜菜哥咱两还能不能好好相处了玩笑 玩笑show time妹子开始抱怨起来01业务背景妹子的游戏是个对战类的游戏其中有一个玩家的概念玩家可以攻击这个业务正是妹子开始挠头的起点02第一次需求玩家有很多属性例如身高性别 blalalala ,玩家可以攻击其他玩家。产品狗YY妹子写程序也是很利索一天就把程序搞定了而且还抽象出一个palyer的基类出来堪称高级程序员必备技能//玩家的基础抽象类 abstract class Player { public string Name { get; set; } //. //. //. //玩家的攻击 public abstract void Attack(); } //真实玩家 class PersonPlayer : Player { public override void Attack() { //to do something return; } }01第二次需求游戏里要增加机器人玩家来增加在线的人数属性和真实玩家一样但是攻击不太一样产品狗这个需求修改还是难不住YY妹子没过几天代码改好了增加了一个机器人玩家的类用到了OO的继承。在这里为玩家抽象类点赞class RobotPlayer : Player { public override void Attack() { //修改攻击内容等 to do something return; } }02第三次需求我要创建一批怪物没有真实玩家的那些属性但是和真实玩家一样有攻击行为产品狗这个时候YY妹子终于意识到攻击是一种行为了需要抽象出接口来了。//攻击接口 interface IAttack { void Attack(); } //玩家的基础抽象类 abstract class Player { //其他属性代码省略一万字 } //真实玩家 class PersonPlayer :Player, IAttack { public void Attack() { //to do something return; } } //机器人玩家 class RobotPlayer :Player, IAttack { public void Attack() { // to do something return; } } //怪物玩家 class MonsterPlayer : IAttack { public void Attack() { // to do something return; } }到了这里我们遇到了大家耳熟能详的面向接口编程没错这个做法是对的。这也是设计的一大原则程序依赖接口不依赖具体实现。这里要为YY继续点赞。顺便说一下在多数情况下很多同学就到此为止了01第四次需求我要设计玩家的攻击方式了目前有远程攻击近程攻击贴身攻击这三类其他需求 blalalalala。产品狗据说此刻YY妹子的心里是一万头羊驼飘过的状态。这次要怎么设计呢这也是菜菜要说的重点部分。现在我们需要静下心来思考一番了为什么我们使用了面向接口编程遇到这次需求程序还是需要修改很多东西呢设计原则找出应用中将来可能变化的地方把他们独立出来不需要和那些不变的代码混在一起。这样的概念很简单确是每个设计模式背后的灵魂所在。到目前为止设计中不断在变的是Attack这个接口更准确的应该是Attack这个行为。面向接口这个概念没有问题是大多数人把语言层面和设计层面的接口含义没搞明白真正的面向接口编程更偏向于面向架构中行为的编程另外一个角度也可以看做是利用OO的多态原则。说到这里我们可以更系统的给Attack行为定义成一类行为而具体的行为实现可以描述为一簇算法。想想看Attack行为其实不止作用于player的类型改日产品经理新加一个XX对象也具有攻击行为理想的情况是我只需要让这个xx对象有Attack行为即可而不需要改动以前的任何代码。你现在是不是对这个行为的定义理解的更深刻一些。另外一点到目前为止YY妹子的代码中一直是以继承的方式来实现行为这会有什么问题呢假如要想在程序运行时动态修改player的Attack行为会显得力不从心了。谈到这里又引入了其他一个设计理念一般情况下有一个可能比是一个更好。具体概念为多用组合少用继承。继承通常情况下适用于事物本身的一些特性比如玩家基类具有姓名这个属性继承类完全可以继承这个属性不会发生任何问题。而组合多用于行为的设计方面因为这个行为类型我可能会在多个事物中出现用组合能实现更大的弹性设计02面向行为编程千言万语不如10行代码封装行为一簇//攻击行为接口 interface IAttack { void Attack(); } class RemoteAttack : IAttack { public void Attack() { //远程攻击 } } class ShortAttack : IAttack { public void Attack() { //近程攻击 } }事物包含行为组合//玩家的基础抽象类 abstract class Player { //其他属性代码省略一万字 } //真实玩家 class PersonPlayer : Player { //玩家可以有攻击的行为 IAttack attack; public PersonPlayer(IAttack _attack) { attack _attack; } public void Attack() { //调用行为一簇算法的实现 attack.Attack(); return; } //玩家可以运行时修改攻击行为 public void ChangeAttack(IAttack _attack) { attack _attack; } } 写在最后接口是一种规范和约束更高层的抽象更像是一类行为面向接口编程只是代码层体现的一种格式体现而已真正的面向接口设计更贴近面向行为编程●程序员修神之路--高并发下为什么更喜欢进程内缓存●程序员修神之路--高并发优雅的做限流有福利●程序员过关斩将--快速迁移10亿级数据●程序员修神之路--分布式缓存的一条明路附代码●程序员修仙之路--把用户访问记录优化到极致互联网之路菜菜与君一同成长长按识别二维码关注