游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

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

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

特别报道百年瞬间中央人民政府调整全国行政区划中央广播电视总台中国之声联合全国广播电台共同推出特别报道《中国共产党百年瞬间》中国行政区划地图(19491953年)1954年6月20日,《中央人……钱学森背后的女人,蒋英年轻时到底有多美?这组老照片惊艳了时光她的父亲蒋百里是著名的军事家,著名讨袁护法运动、北伐战争和抗日战争他都不曾缺席。创作的《军事常识》《国防论》巨大地推动中国近代军事理论的发展。她的表哥是近代著名浪漫诗人徐……歌手胡云鹏最新单曲回不去的时光首发近日,歌手胡云鹏最新单曲《回不去的时光》首发,这首歌作词:吴战峰,作曲:刘允昌,歌词朴实,朗朗上口,曲调感人肺腑,歌曲一经发行就受到了听众的喜爱。《回不去的时光》词的灵感……24节气健康指南顺应清明巧养生清明,二十四节气之一,春季的第五个节气。清明节,又称踏青节、行清节、三月节、祭祖节等,节期在仲春与暮春之交。清明节源自早期人类的祖先信仰与春祭礼俗,是中华民族最隆重盛大的祭祖大……郑和下西洋时不带少女,反而带着一船老妪和接生婆,到底为何?郑和之后,再无郑和。梁启超在历史的漫漫长河中,郑和犹如一颗星星始终闪烁着不可磨灭的光辉。郑和当时七下西洋,开发先进的航海技术,他不惧风险,征服自然的决心也令人敬佩。……苏联的巅峰强大到什么程度?苏联最强大的时候,绝不是513万军队、8万辆坦克、十几万架飞机、一万多枚核弹头、46个海外军事基地的时候。当苏联选择了与美国进行帝国争霸模式之后,他的败局就已经确定了。……蔡振华乒乓球世界冠军,带出11位奥运冠军,拒绝加入意大利国籍1981年,第36届世乒赛正在南斯拉夫诺维萨德体育中心火热进行。场上观众的声音,早已经盖过了运动员的呐喊声,大厅里的电动记分牌上,也时不时闪烁着中国的英文字样。蔡振……黄标投靠日本当汉奸,生母羞愧自尽,30余年后世人才知他是大英1895年夏天,湖北省沔阳县峰口镇一户姓黄的寻常百姓家里传来了婴儿的啼哭声,随着这一啼哭声,他们家的第四个孩子来到了这个世界上,家人给他起名为黄标。看似平凡的黄标开始了自己不平……赵文卓挚爱梅艳芳去世后,低调娶张丹露为妻,从此浪子变良人4月10日,赵文卓妻子张丹露在社交平台发文称:生日快乐,我们全家知足常乐。为赵文卓庆祝50岁生日。此文一出人们才惊讶地发现昔日的功夫巨星,已经到了……八个你绝对不能错过的资源网站!!!目录分享十个珍藏已久的网站,包括壁纸,办公室资源,网站合集,游戏等等收藏起来,下次再也不用到处找资源了!1、wallroom这是一款支持1920、2560、4……西安事变中捉蒋者是谁?老农给叶剑英写信,元帅澄清43年前的谜建国之后,有很多的老兵都选择回到家乡,在家乡尽自己的一份力量,而老兵王玉瓒(zn)亦是如此,他放弃了组织给予的优待,找了一个理由回到家乡抚顺,本来应该平静地过完下半辈子,结果却……西北望长安,想起武则天武媚娘是个人物,但对于李世民来说,有点迟了,毕竟心有余而力不足了武媚娘之所以是个人物,是因为她心有不甘,这个世界不缺有才华的人,独缺有精神的人,而不甘心就是一种精神,一种……
他杀死小萝卜头,因放出19名革命者被原谅,回老家后怎么样了2002年夏,河南省漯(lu)河市源汇区大刘镇周庄村来了两个人,一位是穿着西装的成年人,还有一位是长相可爱的小女孩,他们手上还提着食用油等一些生活必需品。进入村庄后,那位成年人……陈云学习之道怎样学习重视学习、善于学习是中国共产党的优良传统。陈云一生学而不厌、诲人不倦,不尚空谈、求真务实,堪称我们党重视学习、勤于学习、善于学习的典范。陈云不仅论述了学习的重要性、研究了学习的……魏延被杀是蜀汉的巨大损失吗?魏延这个人单从演义里去评论,也可能有失公允,从他的出发点是不安现状,就是有背主求荣的劣迹,首先是曹操大军征荆州,刘表去世,刘琮授首,他确在乱军中打开城门,要投刘备,刘备自身难保……明朝皇帝英宗和代宗怎么回事?他们怎么轮流当皇帝?话说得好:天无二日,民无二主。如果不是迫不得已,谁会让出九五之尊的皇帝宝座呀!明英宗与明代宗之间的皇位更迭,完全是偶然因素造成的必然结果。话说公元1449年,大明王朝出现……巅峰时期赵云能打赢关羽吗?关羽的巅峰时期,应该是从吕布白门楼被杀以后到赤壁之战前后。刘备联合曹操打败了吕布,因为在此之前,刘备曾用计斩杀了杨奉和韩暹,曹操答应封他为左将军之职,因此刘备跟随曹操进京……河朔故事理解中晚唐河朔藩镇演变的钥匙安史之乱对唐代以至中国历史进程产生了重要影响,一个直接的后果是,叛乱结束以后,分布于今天北京、天津、河北、河南北部、山东北部和西南部的河朔藩镇(其中尤以幽州、成德、魏博三镇为典……新春致教师你推动着更广泛的文明在除夕夜晚的烟火中,新春踏着星辰而来。新岁新景,我们种下殷切的期望,和少年一起生长。在这个生机勃勃的春天里,愿我们把理想托负给生活,把美好的向往扛在肩上,成为教育远行的力……他主政河北17年,贡献非常大,却被冤枉十多年,后进入中顾委工引言革命战争年代,我党涌现出大量优秀的军事领导,他们率领部队和敌人勇敢地作斗争,从没有害怕过,把大半生都奉献给了祖国和人民。新中国成立后,为了地方建设的需要,很多人离开效……妃子怀了仇人的种,梁武帝大发善心让她产子,20年后野种果然背从古至今,不管是男人还是女人,对于戴绿帽子这种事都是很难容忍的,而且还要帮别人养孩子,那更是难上加难的事情。不过也会有一些例外,毕竟孩子是无辜的,不应该将大人的恩怨倾注在他们身……2022年建国73周年,与国共长的开国将军仅剩六位,分别有谁前言现在是2022年的开篇,新中国自成立直至现在已经走过了73年的岁月,光阴荏苒,那些为国家抛头颅洒热血的革命先烈也逐渐消失在人们的视野中,今天要为大家介绍的便是直至现在……今日中超河南嵩山龙门队河南嵩山龙门队本赛季中超联赛27战14胜5平8负,目前排在中超积分榜第七名,同时与第三名只有两分之差,对于往年年年的保级球队来说,今年成绩相当可以,完全有争一争联赛季军的可能。……成吉思汗后裔,改名换姓各自逃命,600年后靠一首暗号诗相聚四《元史演义》曾言:成吉思汗之南征,志不徒在灭夏。中华历史中,成吉思汗威名赫赫,其英勇事迹亦流传古今。时至今日,其后人仍心意相通,终创家族延续佳话。提到中国历史上最为勇猛的……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网