亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 4609 | 回復(fù): 13
打印 上一主題 下一主題

[其他] 【轉(zhuǎn)自酷殼】如此理解面向?qū)ο缶幊?/a> [復(fù)制鏈接]

論壇徽章:
8
CU大;照
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大;照
日期:2013-04-17 11:02:36CU大;照
日期:2013-04-17 11:02:58技術(shù)圖書徽章
日期:2013-12-04 10:48:50酉雞
日期:2014-01-03 10:32:30辰龍
日期:2014-03-06 15:04:07
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-12-13 16:40 |只看該作者 |倒序?yàn)g覽
如此理解面向?qū)ο缶幊?br />
2012年12月13日陳皓發(fā)表評論閱讀評論 6,157 人閱讀   

從Rob Pike 的 Google+上的一個推看到了一篇叫《Understanding Object Oriented Programming》的文章,我先把這篇文章簡述一下,然后再說說老牌黑客Rob Pike的評論。

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

這個把下面這段代碼描述成是Hacker Solution。(這幫人覺得下面這叫黑客?我估計(jì)這幫人真是沒看過C語言的代碼)

  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.     }
  19. }
復(fù)制代碼
然后開始用面向?qū)ο蟮木幊谭绞揭徊揭徊降剡M(jìn)化這個代碼。

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


過程化的方案

  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.     }
  34. }
復(fù)制代碼
然后是一個幼稚的面向?qū)ο蟮乃悸贰?br />
幼稚的面向?qū)ο缶幊?/font>

PrintOS.java

  1. public class PrintOS
  2. {
  3.     public static void main(final String[] args)
  4.     {
  5.         System.out.println(OSDiscriminator.getBoxSpecifier().getStatement()) ;
  6.     }
  7. }
復(fù)制代碼
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.     }
  24. }


  25. BoxSpecifier.java

  26. public interface BoxSpecifier
  27. {
  28.     String getStatement() ;
  29. }


  30. DefaultBox.java

  31. public class DefaultBox implements BoxSpecifier
  32. {
  33.     public String getStatement()
  34.     {
  35.         return "This is not a box." ;
  36.     }
  37. }


  38. UNIXBox.java

  39. public class UNIXBox implements BoxSpecifier
  40. {
  41.     public String getStatement()
  42.     {
  43.         return "This is a UNIX box and therefore good." ;
  44.     }
  45. }


  46. WindowsBox.java

  47. public class WindowsBox implements BoxSpecifier
  48. {
  49.     public String getStatement()
  50.     {
  51.         return "This is a Windows box and therefore bad." ;
  52.     }
  53. }
復(fù)制代碼
他們覺得上面這段代碼沒有消除if語句,他們說這叫代碼的“l(fā)ogic bottleneck”(邏輯瓶頸),因?yàn)槿绻阋黾右粋操作系統(tǒng)的判斷的話,你不但要加個類,還要改那段if-else的語句。

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

OO大師的方案

注意其中的Design Pattern

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

  10. public class OSDiscriminator // Factory Pattern
  11. {
  12.     private static java.util.HashMap storage = new java.util.HashMap() ;

  13.     public static BoxSpecifier getBoxSpecifier()
  14.     {
  15.         BoxSpecifier value = (BoxSpecifier)storage.get(System.getProperty("os.name")) ;
  16.         if (value == null)
  17.             return DefaultBox.value ;
  18.         return value ;
  19.     }
  20.     public static void register(final String key, final BoxSpecifier value)
  21.     {
  22.         storage.put(key, value) ; // Should guard against null keys, actually.
  23.     }
  24.     static
  25.     {
  26.         WindowsBox.register() ;
  27.         UNIXBox.register() ;
  28.         MacBox.register() ;
  29.     }
  30. }
  31. BoxSpecifier.java

  32. public interface BoxSpecifier
  33. {
  34.     String getStatement() ;
  35. }
  36. DefaultBox.java

  37. public class DefaultBox implements BoxSpecifier // Singleton Pattern
  38. {
  39.     public static final DefaultBox value = new DefaultBox () ;
  40.     private DefaultBox() { }
  41.     public String getStatement()
  42.     {
  43.         return "This is not a box." ;
  44.     }
  45. }
  46. UNIXBox.java

  47. public class UNIXBox implements BoxSpecifier // Singleton Pattern
  48. {
  49.     public static final UNIXBox value = new UNIXBox() ;
  50.     private UNIXBox() { }
  51.     public  String getStatement()
  52.     {
  53.         return "This is a UNIX box and therefore good." ;
  54.     }
  55.     public static final void register()
  56.     {
  57.         OSDiscriminator.register("SunOS", value) ;
  58.         OSDiscriminator.register("Linux", value) ;
  59.     }
  60. }
  61. WindowsBox.java

  62. public class WindowsBox implements BoxSpecifier  // Singleton Pattern
  63. {
  64.     public  static final WindowsBox value = new WindowsBox() ;
  65.     private WindowsBox() { }
  66.     public String getStatement()
  67.     {
  68.         return "This is a Windows box and therefore bad." ;
  69.     }
  70.     public static final void register()
  71.     {
  72.         OSDiscriminator.register("Windows NT", value) ;
  73.         OSDiscriminator.register("Windows 95", value) ;
  74.     }
  75. }
  76. MacBox.java

  77. public class MacBox implements BoxSpecifier // Singleton Pattern
  78. {
  79.     public static final MacBox value = new MacBox() ;
  80.     private MacBox() { }
  81.     public  String getStatement()
  82.     {
  83.         return "This is a Macintosh box and therefore far superior." ;
  84.     }
  85.     public static final void register()
  86.     {
  87.         OSDiscriminator.register("Mac OS", value) ;
  88.     }
  89. }
復(fù)制代碼
作者還非常的意地說,他加了一個“Mac OS”的東西。老實(shí)說,當(dāng)我看到最后這段OO大師搞出來的代碼,我快要吐了。我瞬間想到了兩件事:一個是以前酷殼上的《面向?qū)ο笫莻騙局》和 《各種流行的編程方式》中說的“設(shè)計(jì)模式驅(qū)動編程”,另一個我想到了那些被敏捷洗過腦的程序員和咨詢師,也是這種德行。

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

Rob Pike的評論

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

Rob Pike在他的Google+的這貼里評論到這篇文章——

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

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

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

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

我的理解

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

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

(全文完)

論壇徽章:
1
數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-06-23 06:20:00
2 [報(bào)告]
發(fā)表于 2012-12-13 16:53 |只看該作者
怎么像VB啊

論壇徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龍
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
3 [報(bào)告]
發(fā)表于 2012-12-13 17:43 |只看該作者
OO高級黑,哈哈~~~~~

論壇徽章:
27
處女座
日期:2016-04-18 14:00:4515-16賽季CBA聯(lián)賽之福建
日期:2023-03-31 15:54:2315-16賽季CBA聯(lián)賽之深圳
日期:2020-06-02 10:10:5015-16賽季CBA聯(lián)賽之廣夏
日期:2019-07-23 16:59:452016科比退役紀(jì)念章
日期:2019-06-26 16:59:1315-16賽季CBA聯(lián)賽之天津
日期:2019-05-28 14:25:1915-16賽季CBA聯(lián)賽之青島
日期:2019-05-16 10:14:082016科比退役紀(jì)念章
日期:2019-01-11 14:44:062016科比退役紀(jì)念章
日期:2018-07-18 16:17:4015-16賽季CBA聯(lián)賽之上海
日期:2017-08-22 18:18:5515-16賽季CBA聯(lián)賽之江蘇
日期:2017-08-04 17:00:4715-16賽季CBA聯(lián)賽之佛山
日期:2017-02-20 18:21:13
4 [報(bào)告]
發(fā)表于 2012-12-13 18:38 |只看該作者
蛋疼,以前就覺得JAVA這樣的分層和設(shè)計(jì)模式感覺十分不爽,現(xiàn)在搞C++ 更覺得JAVA不爽,純粹是為設(shè)計(jì)而設(shè)計(jì),比如說數(shù)據(jù)層,好像不用hibernate 就不行,說什么抽象數(shù)據(jù)層,麻痹的,有幾個項(xiàng)目會TM的用到多種數(shù)據(jù)庫啊,用JAVA來做項(xiàng)目,一個字:累 !

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2012-12-13 19:28 |只看該作者
Java的通病,殺雞用屠龍刀。

這不怪他們,因?yàn)橥例埖妒菢?biāo)準(zhǔn),他們沒的選擇。

論壇徽章:
59
2015年亞洲杯之約旦
日期:2015-01-27 21:27:392015年亞洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵節(jié)徽章
日期:2015-03-06 15:50:392015年亞洲杯之阿聯(lián)酋
日期:2015-03-19 17:39:302015年亞洲杯之中國
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03雙子座
日期:2014-12-10 21:39:16處女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
6 [報(bào)告]
發(fā)表于 2012-12-13 22:02 |只看該作者
面向?qū)ο蠛芎冒,面向過程也很好,表驅(qū)動也很好。。。

各有各的用途。

要反對的是過度設(shè)計(jì),如此而已。
(事實(shí)上,所舉OO例子在一定環(huán)境下是正確的設(shè)計(jì),而且是經(jīng)典的OO設(shè)計(jì))

論壇徽章:
59
2015年亞洲杯之約旦
日期:2015-01-27 21:27:392015年亞洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵節(jié)徽章
日期:2015-03-06 15:50:392015年亞洲杯之阿聯(lián)酋
日期:2015-03-19 17:39:302015年亞洲杯之中國
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03雙子座
日期:2014-12-10 21:39:16處女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
7 [報(bào)告]
發(fā)表于 2012-12-13 22:03 |只看該作者
Java是個S/B語言。真不理解為什么為會那么多人喜歡它。

論壇徽章:
3
15-16賽季CBA聯(lián)賽之山東
日期:2016-10-30 08:47:3015-16賽季CBA聯(lián)賽之佛山
日期:2016-12-17 00:06:31CU十四周年紀(jì)念徽章
日期:2017-12-03 01:04:02
8 [報(bào)告]
發(fā)表于 2012-12-14 01:48 |只看該作者

OO高級黑[舉的例子], 強(qiáng)烈同意,o(∩_∩)o 哈哈

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2012-12-14 07:16 |只看該作者
shan_ghost 發(fā)表于 2012-12-13 16:40
如此理解面向?qū)ο缶幊?br />
2012年12月13日陳皓發(fā)表評論閱讀評論 6,157 人閱讀   


沒有幾十個 if-else 就隨意 OO 純粹是閑得蛋疼。

論壇徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龍
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
10 [報(bào)告]
發(fā)表于 2012-12-14 09:57 |只看該作者
回復(fù) 6# folklore


    此貼必須頂,沒有最完美的設(shè)計(jì),只有最恰當(dāng)?shù)姆桨福粵]有最優(yōu)化的算法,只有最合適的選擇。

當(dāng)人們不再迷戀OO,不再迷戀模式,OO跟模式就可以上位了。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP