云霄网站建设,wordpress静态占用内存,wordpress工具栏,主机屋网站在那注册从Rob Pike 的 Google上的一个推看到了一篇叫《Understanding Object Oriented Programming》的文章#xff0c;我先把这篇文章简述一下#xff0c;然后再说说老牌黑客Rob Pike的评论。 先看这篇教程是怎么来讲述OOP的。它先给了下面这个问题#xff0c;这个问题需要输出一段… 从Rob Pike 的 Google上的一个推看到了一篇叫《Understanding Object Oriented Programming》的文章我先把这篇文章简述一下然后再说说老牌黑客Rob Pike的评论。 先看这篇教程是怎么来讲述OOP的。它先给了下面这个问题这个问题需要输出一段关于操作系统的文字假设Unix很不错Windows很差。 这个把下面这段代码描述成是Hacker Solution。这帮人觉得下面这叫黑客我估计这帮人真是没看过C语言的代码 public class PrintOS { public static void mainfinal String[] args { String osName System.getPropertyos.name ; if osName.equalsSunOS || osName.equalsLinux { System.out.printlnThis is a UNIX box and therefore good. ; } else if osName.equalsWindows NT || osName.equalsWindows 95 { System.out.printlnThis is a Windows box and therefore bad. ; } else { System.out.printlnThis is not a box. ; } } } 然后开始用面向对象的编程方式一步一步地进化这个代码。 先是以过程化的思路来重构之。 过程化的方案 public class PrintOS { private static String unixBox { return This is a UNIX box and therefore good. ; } private static String windowsBox { return This is a Windows box and therefore bad. ; } private static String defaultBox { return This is not a box. ; } private static String getTheStringfinal String osName { if osName.equalsSunOS || osName.equalsLinux { return unixBox ; } else if osName.equalsWindows NT ||osName.equalsWindows 95 { return windowsBox ; } else { return defaultBox ; } } public static void mainfinal String[] args { System.out.printlngetTheStringSystem.getPropertyos.name ; } } 然后是一个幼稚的面向对象的思路。 幼稚的面向对象编程 PrintOS.java public class PrintOS { public static void mainfinal String[] args { System.out.printlnOSDiscriminator.getBoxSpecifier。getStatement ; } } OSDiscriminator.java public class OSDiscriminator // Factory Pattern { private static BoxSpecifier theBoxSpecifier null ; public static BoxSpecifier getBoxSpecifier { if theBoxSpecifier null { String osName System.getPropertyos.name ; if osName.equalsSunOS || osName.equalsLinux { theBoxSpecifier new UNIXBox ; } else if osName.equalsWindows NT || osName.equalsWindows 95 { theBoxSpecifier new WindowsBox ; } else { theBoxSpecifier new DefaultBox ; } } return theBoxSpecifier ; } } BoxSpecifier.java public interface BoxSpecifier { String getStatement ; } DefaultBox.java public class DefaultBox implements BoxSpecifier { public String getStatement { return This is not a box. ; } } UNIXBox.java public class UNIXBox implements BoxSpecifier { public String getStatement { return This is a UNIX box and therefore good. ; } } WindowsBox.java public class WindowsBox implements BoxSpecifier { public String getStatement { return This is a Windows box and therefore bad. ; } } 他们觉得上面这段代码没有消除if语句他们说这叫代码的“logic bottleneck”逻辑瓶颈因为如果你要增加一个操作系统的判断的话你不但要加个类还要改那段if-else的语句。 所以他们整出一个叫Sophisticated的面向对象的解决方案。 OO大师的方案 注意其中的Design Pattern PrintOS.java public class PrintOS { public static void mainfinal String[] args { System.out.printlnOSDiscriminator.getBoxSpecifier。getStatement ; } } OSDiscriminator.java public class OSDiscriminator // Factory Pattern { private static java.util.HashMap storage new java.util.HashMap ; public static BoxSpecifier getBoxSpecifier { BoxSpecifier value BoxSpecifierstorage.getSystem.getPropertyos.name ; if value null return DefaultBox.value ; return value ; } public static void registerfinal String key, final BoxSpecifier value { storage.putkey, value ; // Should guard against null keys, actually. } static { WindowsBox.register ; UNIXBox.register ; MacBox.register ; } } BoxSpecifier.java public interface BoxSpecifier { String getStatement ; } DefaultBox.java public class DefaultBox implements BoxSpecifier // Singleton Pattern { public static final DefaultBox value new DefaultBox ; private DefaultBox { } public String getStatement { return This is not a box. ; } } UNIXBox.java public class UNIXBox implements BoxSpecifier // Singleton Pattern { public static final UNIXBox value new UNIXBox ; private UNIXBox { } public String getStatement { return This is a UNIX box and therefore good. ; } public static final void register { OSDiscriminator.registerSunOS, value ; OSDiscriminator.registerLinux, value ; } } WindowsBox.java public class WindowsBox implements BoxSpecifier // Singleton Pattern { public static final WindowsBox value new WindowsBox ; private WindowsBox { } public String getStatement { return This is a Windows box and therefore bad. ; } public static final void register { OSDiscriminator.registerWindows NT, value ; OSDiscriminator.registerWindows 95, value ; } } MacBox.java public class MacBox implements BoxSpecifier // Singleton Pattern { public static final MacBox value new MacBox ; private MacBox { } public String getStatement { return This is a Macintosh box and therefore far superior. ; } public static final void register { OSDiscriminator.registerMac OS, value ; } } 作者还非常的意地说他加了一个“Mac OS”的东西。老实说当我看到最后这段OO大师搞出来的代码我快要吐了。我瞬间想到了两件事一个是以前酷壳上的《面向对象是个**》和 《各种流行的编程方式》中说的“设计模式驱动编程”另一个我想到了那些被敏捷洗过脑的程序员和咨询师也是这种德行。 于是我去看了一下第一作者Joseph Bergin的主页这个Ph.D是果然刚刚完成了一本关于敏捷和模式的书。 Rob Pike的评论 Rob Pike是当年在Bell lab里和Ken一起搞Unix的主儿后来和Ken开发了UTF-8现在还和Ken一起搞Go语言。注不要以为Ken和Dennis是基友其实他们才是真正的老基友 Rob Pike在他的Google的这贴里评论到这篇文章—— 他并不确认这篇文章是不是搞笑但是他觉得这些个写这篇文章是很认真的。他说他要评论这篇文章是因为他们是一名Hacker至少这个词出现在这篇文章的术语中。 他说这个程序根本就不需要什么Object只需要一张小小的配置表格里面配置了对应的操作系统和你想输出的文本。这不就完了。这么简单的设计非常容易地扩展他们那个所谓的Hack Solution完全就是笨拙的代码。后面那些所谓的代码进化相当疯狂和愚蠢的这个完全误导了对编程的认知。 然后他还说他觉得这些OO的狂热份子非常害怕数据他们喜欢用多层的类的关系来完成一个本来只需要检索三行数据表的工作。他说他曾经听说有人在他的工作种用各种OO的东西来替换While循环。我听说中国Thoughtworks那帮搞敏捷的人的确喜欢用Object来替换所有的if-else语句他们甚至还喜欢把函数的行数限制在10行以内 他还给了一个链接http://prog21.dadgum.com/156.html你可以读一读。最后他说OOP的本质就是——对数据和与之关联的行为进行编程。便就算是这样也不完全对因为 Sometimes data is just data and functions are just functions. 我的理解 我觉得这篇文章的例子举得太差了差得感觉就像是OO的高级黑。面向对象编程注重的是1数据和其行为的打包封装2程序的接口和实现的解耦。你那怕举一个多个开关和多个电器的例子不然就像STL中一个排序算法对多个不同容器的例子都比这个例子要好得多得多。老实说Java SDK里太多这样的东西了。 我以前给一些公司讲一些设计模式的培训课我一再提到那23个经典的设计模式和OO半毛钱关系没有只不过人家用OO来实现罢了。设计模式就三个准则1中意于组合而不是继承2依赖于接口而不是实现3高内聚低耦合。你看这完全就是Unix的设计准则。转载于:https://www.cnblogs.com/javaitpx/archive/2012/12/27/2835447.html