国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如此理解面向?qū)ο缶幊?/h1>

開(kāi)發(fā) 后端
我以前給一些公司講一些設(shè)計(jì)模式的培訓(xùn)課,我一再提到,那23個(gè)經(jīng)典的設(shè)計(jì)模式和OO半毛錢(qián)關(guān)系沒(méi)有,只不過(guò)人家用OO來(lái)實(shí)現(xiàn)罷了。

從Rob Pike 的 Google+上的一個(gè)推看到了一篇叫《Understanding Object Oriented Programming》的文章,我先把這篇文章簡(jiǎn)述一下,然后再說(shuō)說(shuō)老牌黑客Rob Pike的評(píng)論。

先看這篇教程是怎么來(lái)講述OOP的。它先給了下面這個(gè)問(wèn)題,這個(gè)問(wèn)題需要輸出一段關(guān)于操作系統(tǒng)的文字:假設(shè)Unix很不錯(cuò),Windows很差。

這個(gè)把下面這段代碼描述成是Hacker Solution。(這幫人覺(jué)得下面這叫黑客?我估計(jì)這幫人真是沒(méi)看過(guò)C語(yǔ)言的代碼)

  1. public class PrintOS   
  2. {   
  3.     public static void main(final String[] args)   
  4.     {   
  5.         String osName = System.getProperty("os.name") ;   
  6.         if (osName.equals("SunOS") || osName.equals("Linux"))   
  7.         {   
  8.             System.out.println("This is a UNIX box and therefore good.") ;   
  9.         }   
  10.         else if (osName.equals("Windows NT") || osName.equals("Windows 95"))   
  11.         {   
  12.             System.out.println("This is a Windows box and therefore bad.") ;   
  13.         }   
  14.         else 
  15.         {   
  16.             System.out.println("This is not a box.") ;   
  17.         }   
  18.     }   

然后開(kāi)始用面向?qū)ο蟮木幊谭绞揭徊揭徊降剡M(jìn)化這個(gè)代碼。

先是以過(guò)程化的思路來(lái)重構(gòu)之。

過(guò)程化的方案

  1. public class PrintOS   
  2. {   
  3.     private static String unixBox()   
  4.     {   
  5.         return "This is a UNIX box and therefore good." ;   
  6.     }   
  7.     private static String windowsBox()   
  8.     {   
  9.         return "This is a Windows box and therefore bad." ;   
  10.     }   
  11.     private static String defaultBox()   
  12.     {   
  13.         return "This is not a box." ;   
  14.     }   
  15.     private static String getTheString(final String osName)   
  16.     {   
  17.         if (osName.equals("SunOS") || osName.equals("Linux"))   
  18.         {   
  19.             return unixBox() ;   
  20.         }   
  21.         else if (osName.equals("Windows NT") ||osName.equals("Windows 95"))   
  22.         {   
  23.             return windowsBox() ;   
  24.         }   
  25.         else 
  26.         {   
  27.             return defaultBox() ;   
  28.         }   
  29.     }   
  30.     public static void main(final String[] args)   
  31.     {   
  32.         System.out.println(getTheString(System.getProperty("os.name"))) ;   
  33.     }   

然后是一個(gè)幼稚的面向?qū)ο蟮乃悸贰?/p>

幼稚的面向?qū)ο缶幊?nbsp;

PrintOS.java

  1. public class PrintOS   
  2. {   
  3.     public static void main(final String[] args)   
  4.     {   
  5.         System.out.println(OSDiscriminator.getBoxSpecifier().getStatement()) ;   
  6.     }   

OSDiscriminator.java

  1. public class OSDiscriminator // Factory Pattern   
  2. {   
  3.     private static BoxSpecifier theBoxSpecifier = null ;   
  4.     public static BoxSpecifier getBoxSpecifier()   
  5.     {   
  6.         if (theBoxSpecifier == null)   
  7.         {   
  8.             String osName = System.getProperty("os.name") ;   
  9.             if (osName.equals("SunOS") || osName.equals("Linux"))   
  10.             {   
  11.                 theBoxSpecifier = new UNIXBox() ;   
  12.             }   
  13.             else if (osName.equals("Windows NT") || osName.equals("Windows 95"))   
  14.             {   
  15.                 theBoxSpecifier = new WindowsBox() ;   
  16.             }   
  17.             else 
  18.             {   
  19.                 theBoxSpecifier = new DefaultBox () ;   
  20.             }   
  21.         }   
  22.         return theBoxSpecifier ;   
  23.     }   

BoxSpecifier.java

  1. public interface BoxSpecifier   
  2. {   
  3.     String getStatement() ;   

DefaultBox.java

  1. public class DefaultBox implements BoxSpecifier   
  2. {   
  3.     public String getStatement()   
  4.     {   
  5.         return "This is not a box." ;   
  6.     }   

UNIXBox.java

  1. public class UNIXBox implements BoxSpecifier   
  2. {   
  3.     public String getStatement()   
  4.     {   
  5.         return "This is a UNIX box and therefore good." ;   
  6.     }   

WindowsBox.java

  1. public class WindowsBox implements BoxSpecifier   
  2. {   
  3.     public String getStatement()   
  4.     {   
  5.         return "This is a Windows box and therefore bad." ;   
  6.     }   

他們覺(jué)得上面這段代碼沒(méi)有消除if語(yǔ)句,他們說(shuō)這叫代碼的“logic bottleneck”(邏輯瓶頸),因?yàn)槿绻阋黾右粋€(gè)操作系統(tǒng)的判斷的話(huà),你不但要加個(gè)類(lèi),還要改那段if-else的語(yǔ)句。

所以,他們整出一個(gè)叫Sophisticated的面向?qū)ο蟮慕鉀Q方案。

OO大師的方案

注意其中的Design Pattern

PrintOS.java

  1. public class PrintOS   
  2. {   
  3.     public static void main(final String[] args)   
  4.     {   
  5.         System.out.println(OSDiscriminator.getBoxSpecifier().getStatement()) ;   
  6.     }   

OSDiscriminator.java

  1. public class OSDiscriminator // Factory Pattern   
  2. {   
  3.     private static java.util.HashMap storage = new java.util.HashMap() ;   
  4.     
  5.     public static BoxSpecifier getBoxSpecifier()   
  6.     {   
  7.         BoxSpecifier value = (BoxSpecifier)storage.get(System.getProperty("os.name")) ;   
  8.         if (value == null)   
  9.             return DefaultBox.value ;   
  10.         return value ;   
  11.     }   
  12.     public static void register(final String key, final BoxSpecifier value)   
  13.     {   
  14.         storage.put(key, value) ; // Should guard against null keys, actually.   
  15.     }   
  16.     static 
  17.     {   
  18.         WindowsBox.register() ;   
  19.         UNIXBox.register() ;   
  20.         MacBox.register() ;   
  21.     }   

BoxSpecifier.java

  1. public interface BoxSpecifier   
  2. {   
  3.     String getStatement() ;   

DefaultBox.java

  1. public class DefaultBox implements BoxSpecifier // Singleton Pattern   
  2. {   
  3.     public static final DefaultBox value = new DefaultBox () ;   
  4.     private DefaultBox() { }   
  5.     public String getStatement()   
  6.     {   
  7.         return "This is not a box." ;   
  8.     }   

UNIXBox.java

  1. public class UNIXBox implements BoxSpecifier // Singleton Pattern   
  2. {   
  3.     public static final UNIXBox value = new UNIXBox() ;   
  4.     private UNIXBox() { }   
  5.     public  String getStatement()   
  6.     {   
  7.         return "This is a UNIX box and therefore good." ;   
  8.     }   
  9.     public static final void register()   
  10.     {   
  11.         OSDiscriminator.register("SunOS", value) ;   
  12.         OSDiscriminator.register("Linux", value) ;   
  13.     }   

WindowsBox.java

  1. public class WindowsBox implements BoxSpecifier  // Singleton Pattern   
  2. {   
  3.     public  static final WindowsBox value = new WindowsBox() ;   
  4.     private WindowsBox() { }   
  5.     public String getStatement()   
  6.     {   
  7.         return "This is a Windows box and therefore bad." ;   
  8.     }   
  9.     public static final void register()   
  10.     {   
  11.         OSDiscriminator.register("Windows NT", value) ;   
  12.         OSDiscriminator.register("Windows 95", value) ;   
  13.     }   

MacBox.java

  1. public class MacBox implements BoxSpecifier // Singleton Pattern   
  2. {   
  3.     public static final MacBox value = new MacBox() ;   
  4.     private MacBox() { }   
  5.     public  String getStatement()   
  6.     {   
  7.         return "This is a Macintosh box and therefore far superior." ;   
  8.     }   
  9.     public static final void register()   
  10.     {   
  11.         OSDiscriminator.register("Mac OS", value) ;   
  12.     }   

作者還非常的意地說(shuō),他加了一個(gè)“Mac OS”的東西。老實(shí)說(shuō),當(dāng)我看到最后這段OO大師搞出來(lái)的代碼,我快要吐了。我瞬間想到了兩件事:一個(gè)是以前酷殼上的《面向?qū)ο笫莻€(gè)騙局》和 《各種流行的編程方式》中說(shuō)的“設(shè)計(jì)模式驅(qū)動(dòng)編程”,另一個(gè)我想到了那些被敏捷洗過(guò)腦的程序員和咨詢(xún)師,也是這種德行。

于是我去看了一下第一作者Joseph Bergin的主頁(yè),這個(gè)Ph.D是果然剛剛完成了一本關(guān)于敏捷和模式的書(shū)。

Rob Pike的評(píng)論

(Rob Pike是當(dāng)年在Bell lab里和Ken一起搞Unix的主兒,后來(lái)和Ken開(kāi)發(fā)了UTF-8,現(xiàn)在還和Ken一起搞Go語(yǔ)言。注:不要以為Ken和Dennis是基友,其實(shí)他們才是真正的老基友!)

Rob Pike在他的Google+的這貼里評(píng)論到這篇文章——

他并不確認(rèn)這篇文章是不是搞笑?但是他覺(jué)得這些個(gè)寫(xiě)這篇文章是很認(rèn)真的。他說(shuō)他要評(píng)論這篇文章是因?yàn)樗麄兪且幻鸋acker,至少這個(gè)詞出現(xiàn)在這篇文章的術(shù)語(yǔ)中。

他說(shuō),這個(gè)程序根本就不需要什么Object,只需要一張小小的配置表格,里面配置了對(duì)應(yīng)的操作系統(tǒng)和你想輸出的文本。這不就完了。這么簡(jiǎn)單的設(shè)計(jì),非常容易地?cái)U(kuò)展,他們那個(gè)所謂的Hack Solution完全就是笨拙的代碼。后面那些所謂的代碼進(jìn)化相當(dāng)瘋狂和愚蠢的,這個(gè)完全誤導(dǎo)了對(duì)編程的認(rèn)知。

然后,他還說(shuō),他覺(jué)得這些OO的狂熱份子非常害怕數(shù)據(jù),他們喜歡用多層的類(lèi)的關(guān)系來(lái)完成一個(gè)本來(lái)只需要檢索三行數(shù)據(jù)表的工作。他說(shuō)他曾經(jīng)聽(tīng)說(shuō)有人在他的工作種用各種OO的東西來(lái)替換While循環(huán)。(我聽(tīng)說(shuō)中國(guó)Thoughtworks那幫搞敏捷的人的確喜歡用Object來(lái)替換所有的if-else語(yǔ)句,他們甚至還喜歡把函數(shù)的行數(shù)限制在10行以?xún)?nèi))

他還給了一個(gè)鏈接http://prog21.dadgum.com/156.html,你可以讀一讀。最后他說(shuō),OOP的本質(zhì)就是——對(duì)數(shù)據(jù)和與之關(guān)聯(lián)的行為進(jìn)行編程。便就算是這樣也不完全對(duì),因?yàn)椋?/p>

Sometimes data is just data and functions are just functions.

我的理解

我覺(jué)得,這篇文章的例子舉得太差了,差得感覺(jué)就像是OO的高級(jí)黑。面向?qū)ο缶幊套⒅氐氖牵?)數(shù)據(jù)和其行為的打包封裝,2)程序的接口和實(shí)現(xiàn)的解耦。你那怕,舉一個(gè)多個(gè)開(kāi)關(guān)和多個(gè)電器的例子,不然就像STL中,一個(gè)排序算法對(duì)多個(gè)不同容器的例子,都比這個(gè)例子要好得多得多。老實(shí)說(shuō),Java SDK里太多這樣的東西了。

我以前給一些公司講一些設(shè)計(jì)模式的培訓(xùn)課,我一再提到,那23個(gè)經(jīng)典的設(shè)計(jì)模式和OO半毛錢(qián)關(guān)系沒(méi)有,只不過(guò)人家用OO來(lái)實(shí)現(xiàn)罷了。設(shè)計(jì)模式就三個(gè)準(zhǔn)則:1)中意于組合而不是繼承,2)依賴(lài)于接口而不是實(shí)現(xiàn),3)高內(nèi)聚,低耦合。你看,這完全就是Unix的設(shè)計(jì)準(zhǔn)則。

原文鏈接:http://coolshell.cn/articles/8745.html/comment-page-1

責(zé)任編輯:張偉 來(lái)源: 酷殼
相關(guān)推薦

2013-06-07 10:55:10

2024-01-03 13:38:00

C++面向?qū)ο缶幊?/a>OOP

2012-01-17 09:34:52

JavaScript

2017-04-21 09:07:39

JavaScript對(duì)象編程

2012-06-07 10:11:01

面向?qū)ο?/a>設(shè)計(jì)原則Java

2010-11-17 11:31:22

Scala基礎(chǔ)面向?qū)ο?/a>Scala

2022-07-30 23:41:53

面向過(guò)程面向?qū)ο?/a>面向協(xié)議編程

2012-02-27 09:30:22

JavaScript

2012-12-13 11:01:42

IBMdW

2023-10-25 13:42:19

Java面向?qū)ο?/a>

2010-07-13 13:06:41

Perl面向?qū)ο?/a>

2011-05-25 10:59:26

Javascript繼承

2011-05-25 10:21:44

Javascript

2011-06-28 11:06:16

Scala

2023-01-10 09:06:17

2010-07-16 17:23:57

Perl面向?qū)ο缶幊?/a>

2023-12-11 15:32:30

面向?qū)ο缶幊?/a>OOPpython

2010-07-13 17:18:29

Perl面向?qū)ο缶幊?/a>

2019-03-26 10:50:22

Python面向?qū)ο?/a>編程語(yǔ)言

2023-11-30 08:00:54

面向?qū)ο?/a>面向切面
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

黄色小说综合网站| 国产a视频精品免费观看| 欧美成人性战久久| 国产成人一区二区三区别| 成人在线电影在线观看视频| 国产视频精品va久久久久久| 网址你懂得在线观看| 国产馆精品极品| 国产精品视频免费一区| 欧美变态挠脚心| 在线亚洲午夜片av大片| 影音先锋在线视频| 日韩欧美在线视频观看| 久久这里只精品| thepron国产精品| 日本午夜精品一区二区三区| 日韩黄色大片| 国内精品国产三级国产在线专| 天堂中文在线播放| 欧美无砖专区一中文字| 蜜桃视频免费网站| 国产日产欧美一区二区三区| 亚洲一区二区精品在线| 性久久久久久| 国产91视觉| 天天做天天爱天天综合网| 91大神福利视频在线| 亚洲一区二区三区久久久| 日韩电影中文字幕| 伦理av在线| 日韩欧美自拍偷拍| 黄av在线播放| 欧美日韩国产成人在线91| 中文字幕在线观看| 一区二区三区波多野结衣在线观看| 中文字幕日本最新乱码视频| 美国毛片一区二区| 一区一区视频| 亚洲女同在线| 国产精品一区在线观看| 欧美成人激情| 国产精品专区h在线观看| 国产精品一区2区3区| 国产999在线| 国内在线免费视频| 国产剧情久久久久久| 欧美美女被草| 久久亚洲图片| 成人欧美在线观看| 夜夜春成人影院| 午夜精品一区二区三区av| 91精品福利观看| 久久精品99无色码中文字幕 | 中文字幕久精品免| 日韩美女网站| 欧美天堂一区二区三区| 深夜福利免费在线观看| 韩曰欧美视频免费观看| 伊人75在线| 午夜成人在线视频| 欧美女子与性| 欧美性一级生活| 欧美人与禽性xxxxx杂性| 亚洲国产成人在线视频| 成人片免费看| 日日骚久久av| 91麻豆精品国产91久久久久推荐资源| 欧美激情a在线| 美女午夜精品| 国产玖玖精品视频| 亚洲国产专区校园欧美| 少妇免费毛片久久久久久久久| 麻豆精品一区二区av白丝在线| 超碰在线免费观看97| 91免费看片在线观看| yy4480电影网| 欧美色老头old∨ideo| 国产最新在线| 一区二区三欧美| 久久久久97| 97神马电影| 麻豆久久久久久| 噼里啪啦国语在线观看免费版高清版| 国产精品网曝门| 男同在线观看| 亚洲精品一区在线观看香蕉| 日本少妇精品亚洲第一区| 国产精品小说在线| 日韩精品电影一区亚洲| 免费无码国产v片在线观看| 亚洲国产精品嫩草影院| 2024短剧网剧在线观看| 日韩中文在线视频| 婷婷成人基地| 国产成人一区二区三区别| 伊人一区二区三区| 日本高清在线观看视频| 欧美精品国产精品日韩精品| 欧美日韩mv| 国产原创中文在线观看| 日韩欧美中文字幕在线观看| 中文字幕 在线观看| 日韩男女性生活视频| 久热综合在线亚洲精品| 欧美三级午夜理伦三级富婆| 91精品福利在线一区二区三区| 日韩av综合| 欧美男人的天堂| 国产精品传媒入口麻豆| 久久99精品久久| 欧美激情一级二级| 三级一区在线视频先锋 | 欧美一区二区三区| 久久精品国产一区| 亚洲夜间福利| 黄色免费网址大全| 91麻豆精品91久久久久同性| 加勒比视频一区| 亚洲乱码一区二区三区| 亚洲欧洲中文日韩久久av乱码| heyzo高清中文字幕在线| 国产成人久久久| www.99精品| 国产精品偷拍| 成人综合色站| 亚洲影视资源网| 亚洲国产91视频| 亚洲精品一区二区三区av| 精品久久久久久久久久久久| 免费一级欧美片在线观看网站| 奇米精品在线| 一本一道综合狠狠老| 久久.com| 在线观看成年人视频| 国产精品va在线观看无码| 久久99精品久久久久久琪琪 | 成人在线精品视频| 久久久无码精品亚洲日韩按摩| 一广人看www在线观看免费视频| av在线下载| 日韩视频―中文字幕| 99精品视频网| 午夜免费性福利| 欧美日韩高清区| 国产一区久久久| 女同一区二区免费aⅴ| 国产精品成人av在线| 久久欧美中文字幕| 欧美va视频| 亚洲精品日韩精品| 91麻豆精品国产91久久久使用方法 | 亚洲国产日韩精品在线| 国产主播精品| 在线观看视频免费| 欧美亚洲视频在线看网址| 99国产一区二区三精品乱码| 国产乱码精品一区二三赶尸艳谈| 蜜桃传媒视频麻豆第一区免费观看 | 亚洲一区不卡| 在线观看免费高清完整| 91久久精品一区二区别| 亚洲一区免费视频| 国产免费av一区二区三区| 成人影院在线观看视频| 欧美韩国理论所午夜片917电影| 99riav一区二区三区| 日本国产一区| 一区二区三区韩国| 欧美在线观看视频| 亚洲激情在线激情| 国产伦精品一区二区三区视频| av在线dvd| 国产精品色婷婷视频| 天天综合网 天天综合色| 99免费精品| 国产小视频福利在线| 国产一区二区三区四区五区在线| 在线电影一区二区三区| 免费成人在线视频观看| 妞干网免费在线视频| 国产99久久九九精品无码| 97在线精品国自产拍中文| 亚洲日本青草视频在线怡红院| 欧美日韩播放| 国产精品影院在线| 亚洲精品日韩精品| 色悠悠国产精品| 久久久精品一品道一区| 天海翼精品一区二区三区| 最近2018年手机中文在线| 国产欧美日韩综合精品二区| 日韩欧美美女一区二区三区| 国产老妇另类xxxxx| 日韩在线观看一区二区三区| 全部孕妇毛片丰满孕妇孕| 97超碰人人模人人爽人人看| 日韩欧美激情在线| 成人福利视频网站| 精品国产一区二区三区噜噜噜 | www.在线观看av|