澳门1495

是的的编程姿势。如此清楚面向对象编程。

十月 9th, 2018  |  澳门新葡亰

众言语都产生 union 的变体,现代语言中的泛型就是 union
的等同种植语法糖,但是你频繁忘记了这种组织的着实价值以及作用。仔细回味下这个新的设计:

17         }

本人自搜到了一如既往万分堆 Linus 排斥面向对象和 C++ Java
的语句,从感觉上,这些虽是自个儿面临设计困难时候的感到。我既无数软这样解决本身的次设计。

优先押这篇教程是怎来叙述OOP的。它先为了脚是问题,这个问题用输出一段有关操作系统的契:假设Unix很科学,Windows很不同。

而,这个绘图项目实在非常复杂,涉及了重重之多态和干。比如,在一个添加之列表中存储种类不同的图纸,这些图片存储的绘图数据和有关消息还不可同日而语,我待把这些数量视做同一种植档次,然后迭代它们,选出需要的一个还要采取它们的系消息。所以,我尝试使用学术界的设计模式来化解中的题目。

11         {

下一场,使用一个链表或者屡屡组,把这 union
装进去,遍历,cast,然后以你需要之特定数据。

07         {

本条类别以开之处已违反了自家的片感觉,对于程序设计之感觉到。从自身本着数据库和服务器的多年更,使用基于数据表和多少说明的虚幻结构,你说到底能够取最好简单易行好用而扩大的软件结构。

13         }
enum ShapeKind {
  skLINE, skPORT, skBOARD
}

class Shape {
  kind: ShapeKind   
  value: Line | Port | Board
  contains(x: number, y: number): boolean
}

class ShapeContainer {
  shapes: Array<Shape>
  search(x: number, y: number): [ShapeKind, Shape]
}

type
  ShapeKind = enum
    skLINE, skPORT, skBOARD

  Shape = ref object
    case kind: ShapeKind
    of skLINE:
      line: Line
    of skPORT:
      port: Port
    of skBOARD:
      board: Board
    contains: (x: number, y: number): bool

  ShapeContainer = object
    shapes: seq[Shape]

proc search(c: ShapeContainer, x: number, y: number): tuple[kind: ShapeKind, shape: Shape]
09         }

幽默之是,这里发生相同首另外一员长辈的坏早的文字,推在 Google+ 上,来自 Unix
核心创建者之一 Rob Pike:

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     }
7 }

OSDiscriminator.java

 

 

01 public class OSDiscriminator // Factory Pattern
02 {
03     private static java.util.HashMap storage = new java.util.HashMap() ;
04   
05     public static BoxSpecifier getBoxSpecifier()
06     {
07         BoxSpecifier value = (BoxSpecifier)storage.get(System.getProperty("os.name")) ;
08         if (value == null)
09             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     }
22 }

BoxSpecifier.java

 

 

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

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     }
9 }

UNIXBox.java

 

 

01 public class UNIXBox implements BoxSpecifier // Singleton Pattern
02 {
03     public static final UNIXBox value = new UNIXBox() ;
04     private UNIXBox() { }
05     public  String getStatement()
06     {
07         return "This is a UNIX box and therefore good." ;
08     }
09     public static final void register()
10     {
11         OSDiscriminator.register("SunOS", value) ;
12         OSDiscriminator.register("Linux", value) ;
13     }
14 }

WindowsBox.java

 

 

01 public class WindowsBox implements BoxSpecifier  // Singleton Pattern
02 {
03     public  static final WindowsBox value = new WindowsBox() ;
04     private WindowsBox() { }
05     public String getStatement()
06     {
07         return "This is a Windows box and therefore bad." ;
08     }
09     public static final void register()
10     {
11         OSDiscriminator.register("Windows NT", value) ;
12         OSDiscriminator.register("Windows 95", value) ;
13     }
14 }

MacBox.java

 

 

01 public class MacBox implements BoxSpecifier // Singleton Pattern
02 {
03     public static final MacBox value = new MacBox() ;
04     private MacBox() { }
05     public  String getStatement()
06     {
07         return "This is a Macintosh box and therefore far superior." ;
08     }
09     public static final void register()
10     {
11         OSDiscriminator.register("Mac OS", value) ;
12     }
13 }

作者还坏的意地说,他加了一个“Mac
OS”的物。安贫乐道说,当我瞅最后就段OO大师为出来的代码,我快要吐了。我瞬间想到了区区码事:一个是以前酷壳上的《面向对象是只圈套》和
《各种流行的编程方式》中说的“设计模式驱动编程”,另一个自家想到了那些让快速洗了心血的程序员和咨询师,也是这种德行。

于是自己去看了瞬间率先作者Joseph
Bergin的主页,这个Ph.D是果刚刚落成了平等按照有关敏捷和模式的书。

一言以蔽之,就算设计模式避免了类似继承的爆裂,但是也避免不了抽象层级的繁杂。

10         else if (osName.equals("Windows NT") || osName.equals("Windows 95"))

是的,我们要之尽管是数据的抽象和数据的解释器。用表来存储你需要之逐条数据,对于多态,C
语言中简单直接干净:union。使用这样一个简的构造,你会储存各种不同的类别,而且若一味待仓储他们的指针,这意味你不会见浪费多少内存,同时您会获得一致内存段但是数量不同之纸上谈兵。

天真的面向对象编程

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 }

OSDiscriminator.java

 

 

01 public class OSDiscriminator // Factory Pattern
02 {
03     private static BoxSpecifier theBoxSpecifier = null ;
04     public static BoxSpecifier getBoxSpecifier()
05     {
06         if (theBoxSpecifier == null)
07         {
08             String osName = System.getProperty("os.name") ;
09             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 }

BoxSpecifier.java

 

 

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

DefaultBox.java

 

 

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

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     }
7 }

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     }
7 }

他俩以为上面立段代码没有排除if语句,他们说立刻让代码的“logic
bottleneck”(逻辑瓶颈),因为要您而加一个操作系统的判定的话,你不光要加个类,还要反那段if-else的语。

用,他们整出一个叫Sophisticated的面向对象的缓解方案。

当型转移得不行巨大的时,我发觉及设计模式屁都未是。诸如桥接、装饰器以及另,都是白手起家以同栽要,假要你的父组件和子组件总是好忽略对方的底细,而得以统一的拍卖它们。比如,面包来奶油味、抹茶味、水果味,面包又产生起码材料、高档材料,那么您可拿味道和资料分为两单不同之接口,然后分别抽象,并且做这简单独接口生成更增长的面包,比如低档材料的删除茶味面包。但是,真实的编程世界面临,这样的可以状态十分少。在真实的编程世界中,面包还眷恋只要再次多的东西,比如奶油味的来甜味,抹茶味的尚未糖,有甜的面包放在左边柜台及,没有糖的面包放在右边柜台上。看到了咔嚓,复杂度升级了,柜台及面包来无起糖是绑定的。这意味,如果您想像前那么抽象两单接口—味道和材料,那您本得考虑柜台。因为低档材料的删减茶味面包是从未糖的,放在右边柜台。现在,你只能抽象出味道和柜台的涉。在方的接口之上再搭一重合。每当你的急需复杂一点,这种层即见面提升。比如,红糖面包与白糖面包。

05         String osName = System.getProperty("os.name") ;

用,我道自己又不会见编程了。于是,我尽量的再思考这些规划,并且还以网络直达摸索曾经支持自的计划论调:面向数据结构编程而休是目标。如果无是为这绘图项目,我绝对免会见铤而走险再同糟以设计模式和面向对象。

04     {

git的计划其实大之简易,它的数据结构很平静,并且产生抬高的文档描述。事实上,我好的倾向应该围绕我们的数据结构来设计代码,而休是根据其它的,我当这吗是git之所以成功之案由之一。[…]
依我之视角,好程序员和烂程序员之间的差异就在于他们认为是代码更要或者数据结构更要。

每当偌大之花色遭到,人们对不是友善支付的模块并无了解,能快速了解外模块中函数的贴切含义才会增高支付效率。而C++引入的各种抽象则使代码非常靠上下文,想了解一截代码,需要看多得差不多之上下文。

面向对象语言为目标啊基本,加有并行关联的艺术,简直是呓语。重要之物应该是数据结构,对象自我来何要?真正有意思的,是于不同品类的不等对象交互而且有锁规则之上。但是,即使是此时,封装什么“对象接口”也决大错特错,因为不再是单一对象的问题了。

先是以过程化的思路来重构之。

然并卵!

过程化的方案

01 public class PrintOS
02 {
03     private static String unixBox()
04     {
05         return "This is a UNIX box and therefore good." ;
06     }
07     private static String windowsBox()
08     {
09         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 }

然后是一个童真的面向对象的思路。

 

 

近些年简单只礼拜,我以 plantuml (贝尔实验室产品了一个极品绘图工具
graphviz,
这是一个包装版)把自己之绘图项目开了同次于全面的接口和类似的可视化。使用了累累设计模式,包括:桥接、装饰器、生成器、抽象工厂。绘制了晚,图像是格外美的,接口之间的互动和参数定义清晰优雅。很理想!

03     public static void main(final String[] args)

原文链接
A few years ago I saw this page:
http://www.csis.pace.edu/~bergin/patterns/ppoop.html

Local discussion focused on figuring out whether this was a joke or
not. For a while, we felt it had to be even though we knew it wasn’t.
Today I’m willing to admit the authors believe what is written there.
They are sincere.

But… I’d call myself a hacker, at least in their terminology, yet my
solution isn’t there. Just search a small table! No objects required.
Trivial design, easy to extend, and cleaner than anything they
present. Their “hacker solution” is clumsy and verbose. Everything
else on this page seems either crazy or willfully obtuse. The lesson
drawn at the end feels like misguided epistemology, not technological
insight.

It has become clear that OO zealots are afraid of data. They prefer
statements or constructors to initialized tables. They won’t write
table-driven tests. Why is this? What mindset makes a multilevel type
hierarchy with layered abstractions better than searching a three-line
table? I once heard someone say he felt his job was to remove all
while loops from everyone’s code, replacing them with object stuff.
Wat?

But there’s good news. The era of hierarchy-driven, keyword-heavy,
colored-ribbons-in-your-textook orthodoxy seems past its peak. More
people are talking about composition being a better design principle
than inheritance. And there are even some willing to point at the
naked emperor; see
http://prog21.dadgum.com/156.html
for example. There are others. Or perhaps it’s just that the old guard
is reasserting itself.

Object-oriented programming, whose essence is nothing more than
programming using data with associated behaviors, is a powerful idea.
It truly is. But it’s not always the best idea. And it is not well
served by the epistemology heaped upon it.

Sometimes data is just data and functions are just functions.

— Rob Pike (One of the Unix creators (Ken Thompson, Dennis M.
Ritche, and Rob Pike))

几乎年前我来看了这个网页:
http://www.csis.pace.edu/~bergin/patterns/ppoop.html

自己确实不掌握这篇稿子到底是未是当搞笑。读了一晃,我虽然好想说立刻不是如出一辙首将笑的章,但是,拜托,它根本就是。让自身来和你们说说他们以打笑啊吧。

e…以他们的讲话,我应当称自己吗 hacker
(黑客),不管我无体贴这些。Hello! 你不过待一个略带之匪能够还聊的 table

根本无需什么目标。朴素平凡,容易扩展,容易清除,(比从他们之那种设计)多
TM 简单。他们的 “hacker solution”
真的凡同时蠢又笨。他们写出来的那么堆物到处透漏着疯狂和愚昧。他们缺少技术认知。

万分醒目,OO 的狂热者们心惊肉跳数据。他们喜欢用言语或者组织器来初始化 tables
。他们根本未写 table-driven 的测试。Why is this?
得有差不多大之心尖才会选取用一连串并且大多交汇的类似华而不实,而不失用一个细小三行
table ? 我就听说有人据此各种 OO 的东西替换掉 while 循环。

然而好信息是,hierarchy-driven, keyword-heavy,
colored-ribbons-in-your-textook orthodoxy
这些东东尽快绝望了。更多的人数挑选组合要无是连续。有些人早就再也开认识
OO。

面向对象编程语言,其本意是采用数据与连锁的所作所为开展编程,这是一个老大好之想法。事实真的这样。但是,这个想法并无总是顶好之
idea。 这个想法并无完全的回味编程的社会风气。

Sometimes data is just data and functions are just functions.

— Rob Pike (Unix 创建者之一的 (Ken Thompson, Dennis M. Ritche, and
Rob Pike))

18     }
02 {
14         else

 

01 public class PrintOS
06         if (osName.equals("SunOS") || osName.equals("Linux"))

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.

08             System.out.println("This is a UNIX box and therefore good.") ;

 

由Rob Pike 的 Google+上之一个推看到了千篇一律首被《Understanding Object
Oriented
Programming》的文章,我先把当时篇稿子简述一下,然后再说说老牌黑客Rob
Pike的褒贬。

这把下就段代码描述成是Hacker
Solution
。(这帮人以为下面这让黑客?我估算这支援人当成无看罢C语言的代码)

然后开为此面向对象的编程方式相同步一步地向上之代码。

我的懂得

自己看,这篇稿子的事例举得最为差了,差得发就是像是OO的高档黑。面向对象编程注重的凡:1)数据以及那个一言一行的从包封装,2)程序的接口及贯彻之解耦。你那怕,举一个差不多单开关和多只电器的事例,不然就是比如STL中,一个排序算法对多个不等容器的例证,都比较这例子要好得差不多得差不多。老实说,Java
SDK里最为多如此的事物了。

本人先叫有局说有设计模式的培训课,我数提到,那23只经的设计模式和OO半毛钱关系并未,只不过人家用OO来兑现罢了。设计模式就三个准则:1)中意为做要不是继续,2)依赖让接口而非是兑现,3)高内聚,低耦合。你看,这了就是Unix的宏图则

16             System.out.println("This is not a box.") ;
15         {
12             System.out.println("This is a Windows box and therefore bad.") ;
19 }

相关文章

标签:,

Your Comments

近期评论

    功能


    网站地图xml地图