范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

快速云需求决定设计面向对象最大的设计陷阱

  通过面向对象的思路,我们可以把任何事物都看成一个对象然后单独处理,从理想的角度,任何一个微小的单元都可以以一个对象的形式表示。比如我们可以用如下代码表示一个人以及它的姓名:
  1.不分离姓名
  class 人 {
  public string 姓名;
  }
  但是这个世界是很复杂的,姓名本身是由姓和名组成的。如果我们需要需要单独处理姓和名时,要怎么办?于是我们可以这么拆分:
  2.直接分离姓名
  class 人 {
  public string 姓;
  public string 名;
  }
  但我们会碰到这个问题:姓和名本身是一个整体,处理姓名的逻辑不应该放在人这个类里面,而应该单独提取出来。于是代码改为:
  3. 提取姓名为单独一个类,然后单独处理
  class 人 {
  public 姓名 姓名;
  }
  class 姓名 {
  public string 姓;
  public string 名;
  }
  这是一个非常理想的状态:任何事物都被表示成了一个独立的对象。但其实作者都是懒的,没人会愿意为姓名单独写一个类然后单独处理它。除非逻辑非常复杂需要单独处理时,才会选择把它提取出来。
  同样一个人,把它写成面向对象的代码之后,却有3种不同的写法(1. 不分离姓名。 2. 直接分离姓名。 3.提取姓名为单独一个类,然后单独处理)。而决定我们用哪个写法的是最需求。需求是软件开发中最不稳定的因素,因此面向对象的代码经常需要重构和重写。这就是面向对象中的一个设计陷阱。
  再来看一个例子:
  abstract class 鱼 {private int 价格;
  private int 口感;public int get价格(){ return 价格; }
  public int get口感(){ return 口感; }
  public abstract string get名字();
  }
  class 鲤鱼: 鱼 {
  public override string get名字() {
  return "鲤鱼";
  }
  }
  class 桂鱼: 鱼 {
  public override string get名字() {
  return "桂鱼";
  }
  }
  这是一个最普通的面向对象的代码了。从上面看似乎完美到没有任何问题:通过鱼这个类以及它的多态特性,我们可以很轻松地处理所有鱼。
  但是这时加了一个需求,我们需要处理金鱼,于是写了这么一行代码:
  class 金鱼: 鱼 {
  public override string get名字() {
  return "金鱼";
  }
  }
  看上去依然完美,但问题是:金鱼是不能吃的,获取它的口感是没有任何意义的!但是通过继承,我们的金鱼也是可以有口感的。同时,还浪费了一个内存用来存储这个没有意义的口感字段。
  现实中,很多人都忽视了这个问题:反正没意义,这个函数不要调用就行了。对的,但如果一个继承了一个父类之后,5个函数是有意义的,20个函数是没有意义的,这时我想作者该犯洁癖了吧。问题主要是在于继承一个类之后,有一些成员是不必要或者无意的,有2个改法:
  1. 让金鱼不继承于鱼:这不科学,金鱼本来就是鱼,除了口感,其它的继承都是有意义并且需要使用的。
  2. 提取一个公共父类:
  abstract class 鱼 {
  private int 价格;
  public int get价格(){ return 价格; }
  public virtual int get口感() { throw new Exception("无意义") }
  public abstract string get名字();
  }
  abstract class 可以吃的鱼 : 鱼 {
  private int 口感;
  public override int get口感() { return 口感; }
  }
  class 鲤鱼: 可以吃的鱼 {
  public override string get名字() {
  return "鲤鱼";
  }
  }
  class 桂鱼: 可以吃的鱼 {
  public override string get名字() {
  return "桂鱼";
  }
  }
  class 金鱼: 鱼 {
  public override string get名字() {
  return "金鱼";
  }
  }
  仔细研究,你会发现网上很多代码,它定义了一个抽象类,并且名字是 XXXBase, XXXCore 或者一个类XXX还定义了一个类叫 XXXImpl 。这些抽象类就像上例中可以吃的鱼这个类一样,都是为了继承而存在的。这里,我们同样有这个问题:
  父类的设计会因为需求和子类的增加和不得不作一些修改(如提取另外一个公共父类)。因此面向对象的代码经常需要重构和重写。这就是面向对象中的又一个设计陷阱。
  总结一下上面的2个例子,就是:需求增加,代码就要重构。所以很多人认为这是一个只能靠经验才能解决的问题,只要写的代码够多了,就能预感到未来的需求并减少重构量。就像上例中,我们有经验就会先写好一个可以吃的鱼这个类。但这终究是一个幻想,没有谁能真正预知到未来的需求。很多作者都喜欢预留一个XXX接口,然后写了一个XXXImpl的实现类,认为以后只写另外一个XXXImpl2类,就可以重用处理XXX接口时的所有代码。其实以后需要写另外一个XXXImpl2类的概率几乎为0 。这样反而让修改XXX接口的成本上升不少。
  需求决定设计,需求变化会导致不断重新设计。这就是面向对象的最大设计陷阱。

勇掘G1伤情出炉!两队共4人入伤病报告,库里75概率出战北京时间4月16日,NBA官网发布了勇士与掘金季后赛首轮G1的伤病报告,报告显示,两队共有四名球员出现在伤病报告中,分别是贾马尔穆雷小波特和怀斯曼无法出战(out),库里有望出战(许家印怒了!1张红牌开除26岁前国脚,门将乌龙球,被日韩媒嘲讽中国男足还有救吗?中国男足该不该解散?本以为那些海参吃多了的老将,球场上面打保护性接应,玩散步式反击,输球也就罢了。谁能想到派出年轻球员出征亚冠,首轮比赛下来,两支球队都没有让球迷悲哀!当年5换1送走2米25中锋,如今內线被辽篮完爆欲哭无泪辽粤半决赛,原本以为是总决赛级别的巅峰对决,却最终打成了一边倒。如今,02落后的广东队已命悬一线,谁能想到卫冕冠军这么不扛揍?更令人匪夷所思的是,2场半决赛下来,广东队內线竟然被莫没有杨幂的扶持,刘恺威糊成路人,两人离婚后现状天差地别都说离婚后的男人跟女人差别大,男人则更居家,女人多半更在意事业。这话放在刘恺威跟杨幂身上,好像的确是那么回事!2014年,刘恺威与杨幂步入婚姻的殿堂。2016年,刘恺威夜光剧本被曝打不赢就回家!宏远G3生死战,威姆斯必定爆发,杜锋关键加码在本赛季目前的卫冕形势当中,广东男篮出现了很大的困难。在连续三年遭遇辽宁队的情况下,广东队失去了比赛先机,目前结束的两场比赛当中,广东队连续两场输球,已经处在了0比2的劣势当中,而广东男篮没有选择了,威姆斯易建联胡明轩或集体爆发,辽篮要输?最近几年还没有哪支球队把广东男篮逼到这个份上,要么留下要么回家,摆在杜锋面前的只有两条路,球队往往在这样的情况下,能够爆发出惊人的能量,即使目前周鹏,任骏飞,莱多都打不了,相信杜锋加时赛0分钟!再见易建联!广东宏远终于找到新老大广东男篮,虽败犹荣!这是在宏远被横扫出局后,一度登上微博头号热搜的词条,无疑是对他们最好的评价。可谓是拼光最后一课子弹,在没有周鹏任骏飞和莱多3名大将情况下,却依然能与武装到裤衩的陆毅,郭京飞,各人有各命,走着走着,人生渐渐有了不同2000年,21岁的郭京飞,考入上海戏剧学院,与大他3岁的同校师姐王晓男谈恋爱时,肯定不会料到月老早已给他牵好了红线。可惜,玉人不是王晓男,而是王晓男的好同学兼好朋友,鲍蕾的亲妹妹王晓晨两次给她人做了嫁衣,被传出和他的绯闻?34岁至今单身云海尘清,山河影满,桂冷吹香雪。怡燃对王晓晨真的很喜欢,她就是典型的戏红人不红,我很多次替她鸣不平,但后面细细地想来想去,王晓晨这样也许是好的事,一步一个脚印,踏踏实实的走着演戏道杨颖的中年危机有多可怕?看似欣欣向荣,背后却是一片狼藉这段时间,要说娱乐圈的明星,谁的日子是最舒服的,不好意思,这个可真的不好说,但要说,谁的日子是最难受的,想必我说的是杨颖,没什么人会怀疑吧,近些日子来,杨颖的事业似乎是迎来了一波不新赛季T0预测!李白韩信再次强势!蔡文姬吃满红利!射手出现黑马体验服改动S27赛季各路T0英雄预测解析发育路李元芳游走位蔡文姬对抗路夏洛特1hr发育路个人认为,此次改动最明显的发育路中,受益最大的英雄是李元芳。视野机制改动因为视野机制的改动需
中超最新积分榜武汉三镇11连胜4分领跑,国安1球小胜攀升第6今天晚上,中超联赛第14轮再战2场,武汉三镇客场21击败梅州客家,取得联赛11连胜,继续以4分优势领跑积分榜,马尔康和谢鹏飞分别破门,帮助球队上演逆转好戏北京国安主场10击败广州城李明带得这么好,还要啥斯坦利?转正得了赢了球以后,国安一下子又回到了积分榜前列,从三连败到两连胜,脱胎换骨了,这是。当李明已经不需要把手伸到主教练裤裆里,而是伸到自己裤裆里的时候,国安节节胜利。以前伤好不了的人,比如侯王者归来!内马尔4场比赛打出7球6助攻,上赛季总共只参与21球法甲第3轮,大巴黎客场71横扫里尔,内马尔2球3助攻,制造5粒进球!新赛季开始后,内马尔4场正式比赛打出7球6助攻的恐怖数据!法国超级杯,内马尔梅开二度法甲首轮,内马尔上演了1球3保卫萝卜糖果赛高分攻略其实技巧很少。集团的输出包括风扇火箭飞机。这些是最好的,但是弓箭和手电筒也可以。如果地图上有很多角落,冰球也很不错。冰球的缺点是太贵了。飞碟吹几个浪,我心都碎了。我根本不知道没有鱼传世怀旧元神手游经典怀旧传世元神手游,多少80,90的回忆怀旧的本质仍是一种尝新半山文集日子过得太快,总经不得消磨,手腕上的表已经渐渐磨损,光阴的钟摆滴滴答答着就要带走四季和时间,遗失掉了太多,有快乐,有不安,有感动,有泪水。经历过太多,深度对森林狼新赛季可能性的预测作为一支被球迷长期以来称为鱼腩球队的森林狼队,上赛季算是完成了转变,自从球队选中了状元爱德华兹后,围绕其建队,他们打入了季后赛。因此,在上赛季重返季后赛后,他们希望全力以赴地实现自8月这波新机,实在太狠了短短一个半月过去,这波骁龙8的新机,就已经发了123456好吧机哥也数不清到底有多少台了。虽然也有一些小迭代机型机子看起来,和上半年发布的变化并不是很大。比如小米12SPro,甚至TCLT7G真高刷电视II为什么强调自己是真高刷?TCL本周推出的新品T7G,相信关注电视新品的同学都已经get到这个信息了,也在它的宣传里面反复get到了真高刷这个词。T7G其实所谓的高刷,就是指刷新率,目前一般把刷新率达到12三星GalaxyS22评测从4999元跌至3999元,还值不值得买?有很多用户都说,三星手机在国内市场已经沦为Others了,这其实并不假,国内市场的大部分份额已经被苹果OPPO小米vivo等品牌占据,不过仍然有很多用户喜欢着三星,三星Galaxy黄山四绝都看过?那么见过峨眉四大胜景没?哪一样都不输黄山峨眉山,中国四大佛教名山之一。是由一位僧人修建的普贤寺,供奉着普贤菩萨,峨眉山是普贤菩萨的道场便由此而来。普贤菩萨塑像巍峨耸立,坐骑大象,面朝四方。每年在春节正月,会有很多众生前来四川六个天下第一名胜古迹,你去过几个?旅游特色,看四海风光,领略人间美景。四川简称蜀。自古以来,蜀都独具特色。依山傍水,易守难攻。又肥沃又野性,桑树遍地栽种。过去汉高祖刘备都以此为根基,尤其是成都平原。富饶之地。那么,