p*2
3 楼
多谢大牛。那struts就没有必要学了。Spring+Hibernate才是未来的方向?不过
Srping的这些理念确实是大型的应用才有意义。小型应用真是没有必要。
【在 r*****s 的大作中提到】
: 不是,
: spring mvc是现在时,
: struts有点out了,
: 这两个也不是一回事。
: spring mvc主要是在backend serving rest/ajax calls,
: 前端用javascript framework。
: spring framework是用了di等方法,
: 以loosely coupled modules
: to provide almost all app server functions.
: 不过做点简单项目Work就好,
p*2
8 楼
关于DI
没做过大项目,对于小项目有多少可能性一个interface会有几个implementation需要
DI呢?
没做过大项目,对于小项目有多少可能性一个interface会有几个implementation需要
DI呢?
p*2
23 楼
比如做一件东西,本来就是一个class就可以了。结果做个interface出来,还做个
factory,然后再写一个class来实现这个interface。我的意思是说如果这个interface
只是有一个实现,直接写一个class就好了,干嘛搞出这么一个堆东西。你不想hard
code class,可是你还是要hard code interface呀。更可笑的是还把一个class分成了
两个class,为了看上去有两个implementation,可是里边大堆的冗余代码。看得我极
其confused。感觉就是生硬的套模式。
我很欣赏thinking in java里边说的,不要 overuse interface. 不知道是我们这边
java 程序员的问题还是java code都这么写。
【在 z*******3 的大作中提到】
: 什么叫做code的本质?
z*3
24 楼
那为什么用java呢?
public static void main(String[] args)
没觉得这里面有很多东西么?
不麻烦么?
int main()多好,多简单
interface
【在 p*****2 的大作中提到】
:
: 比如做一件东西,本来就是一个class就可以了。结果做个interface出来,还做个
: factory,然后再写一个class来实现这个interface。我的意思是说如果这个interface
: 只是有一个实现,直接写一个class就好了,干嘛搞出这么一个堆东西。你不想hard
: code class,可是你还是要hard code interface呀。更可笑的是还把一个class分成了
: 两个class,为了看上去有两个implementation,可是里边大堆的冗余代码。看得我极
: 其confused。感觉就是生硬的套模式。
: 我很欣赏thinking in java里边说的,不要 overuse interface. 不知道是我们这边
: java 程序员的问题还是java code都这么写。
public static void main(String[] args)
没觉得这里面有很多东西么?
不麻烦么?
int main()多好,多简单
interface
【在 p*****2 的大作中提到】
:
: 比如做一件东西,本来就是一个class就可以了。结果做个interface出来,还做个
: factory,然后再写一个class来实现这个interface。我的意思是说如果这个interface
: 只是有一个实现,直接写一个class就好了,干嘛搞出这么一个堆东西。你不想hard
: code class,可是你还是要hard code interface呀。更可笑的是还把一个class分成了
: 两个class,为了看上去有两个implementation,可是里边大堆的冗余代码。看得我极
: 其confused。感觉就是生硬的套模式。
: 我很欣赏thinking in java里边说的,不要 overuse interface. 不知道是我们这边
: java 程序员的问题还是java code都这么写。
z*s
36 楼
http://coolshell.cn/articles/8745.html
如此理解面向对象编程
2012年12月13日陈皓发表评论阅读评论 20,225 人阅读
从Rob Pike 的 Google+上的一个推看到了一篇叫《Understanding Object Oriented
Programming》的文章,我先把这篇文章简述一下,然后再说说老牌黑客Rob Pike的评
论。
先看这篇教程是怎么来讲述OOP的。它先给了下面这个问题,这个问题需要输出一段关
于操作系统的文字:假设Unix很不错,Windows很差。
这个把下面这段代码描述成是Hacker Solution。(这帮人觉得下面这叫黑客?我估计
这帮人真是没看过C语言的代码)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class PrintOS
{
public static void main(final String[] args)
{
String osName = System.getProperty("os.name") ;
if (osName.equals("SunOS") || osName.equals("Linux"))
{
System.out.println("This is a UNIX box and therefore good.") ;
}
else if (osName.equals("Windows NT") || osName.equals("Windows 95"))
{
System.out.println("This is a Windows box and therefore bad.") ;
}
else
{
System.out.println("This is not a box.") ;
}
}
}
然后开始用面向对象的编程方式一步一步地进化这个代码。
先是以过程化的思路来重构之。
过程化的方案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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 getTheString(final String osName)
{
if (osName.equals("SunOS") || osName.equals("Linux"))
{
return unixBox() ;
}
else if (osName.equals("Windows NT") ||osName.equals("Windows 95"))
{
return windowsBox() ;
}
else
{
return defaultBox() ;
}
}
public static void main(final String[] args)
{
System.out.println(getTheString(System.getProperty("os.name"))) ;
}
}
然后是一个幼稚的面向对象的思路。
幼稚的面向对象编程
PrintOS.java
1
2
3
4
5
6
7
public class PrintOS
{
public static void main(final String[] args)
{
System.out.println(OSDiscriminator.getBoxSpecifier().getStatement())
;
}
}
OSDiscriminator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class OSDiscriminator // Factory Pattern
{
private static BoxSpecifier theBoxSpecifier = null ;
public static BoxSpecifier getBoxSpecifier()
{
if (theBoxSpecifier == null)
{
String osName = System.getProperty("os.name") ;
if (osName.equals("SunOS") || osName.equals("Linux"))
{
theBoxSpecifier = new UNIXBox() ;
}
else if (osName.equals("Windows NT") || osName.equals("Windows
95"))
{
theBoxSpecifier = new WindowsBox() ;
}
else
{
theBoxSpecifier = new DefaultBox () ;
}
}
return theBoxSpecifier ;
}
}
BoxSpecifier.java
1
2
3
4
public interface BoxSpecifier
{
String getStatement() ;
}
DefaultBox.java
1
2
3
4
5
6
7
public class DefaultBox implements BoxSpecifier
{
public String getStatement()
{
return "This is not a box." ;
}
}
UNIXBox.java
1
2
3
4
5
6
7
public class UNIXBox implements BoxSpecifier
{
public String getStatement()
{
return "This is a UNIX box and therefore good." ;
}
}
WindowsBox.java
1
2
3
4
5
6
7
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
1
2
3
4
5
6
7
public class PrintOS
{
public static void main(final String[] args)
{
System.out.println(OSDiscriminator.getBoxSpecifier().getStatement())
;
}
}
OSDiscriminator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class OSDiscriminator // Factory Pattern
{
private static java.util.HashMap storage = new java.util.HashMap() ;
public static BoxSpecifier getBoxSpecifier()
{
BoxSpecifier value = (BoxSpecifier)storage.get(System.getProperty("
os.name")) ;
if (value == null)
return DefaultBox.value ;
return value ;
}
public static void register(final String key, final BoxSpecifier value)
{
storage.put(key, value) ; // Should guard against null keys,
actually.
}
static
{
WindowsBox.register() ;
UNIXBox.register() ;
MacBox.register() ;
}
}
BoxSpecifier.java
1
2
3
4
public interface BoxSpecifier
{
String getStatement() ;
}
DefaultBox.java
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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.register("SunOS", value) ;
OSDiscriminator.register("Linux", value) ;
}
}
WindowsBox.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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.register("Windows NT", value) ;
OSDiscriminator.register("Windows 95", value) ;
}
}
MacBox.java
1
2
3
4
5
6
7
8
9
10
11
12
13
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.register("Mac 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
的设计准则。
(全文完)
(转载本站文章请注明作者和出处 酷壳 – CoolShell.cn ,请勿用于任何商业用途)
interface
【在 p*****2 的大作中提到】
:
: 我主要不喜欢那种生硬的套模式的编程方法。我喜欢灵活性,就事论事的设计。我感觉
: 程序也并不都是松耦合。可能在internet这个世界是这样。但是很多系统都是紧耦合的
: 。
如此理解面向对象编程
2012年12月13日陈皓发表评论阅读评论 20,225 人阅读
从Rob Pike 的 Google+上的一个推看到了一篇叫《Understanding Object Oriented
Programming》的文章,我先把这篇文章简述一下,然后再说说老牌黑客Rob Pike的评
论。
先看这篇教程是怎么来讲述OOP的。它先给了下面这个问题,这个问题需要输出一段关
于操作系统的文字:假设Unix很不错,Windows很差。
这个把下面这段代码描述成是Hacker Solution。(这帮人觉得下面这叫黑客?我估计
这帮人真是没看过C语言的代码)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class PrintOS
{
public static void main(final String[] args)
{
String osName = System.getProperty("os.name") ;
if (osName.equals("SunOS") || osName.equals("Linux"))
{
System.out.println("This is a UNIX box and therefore good.") ;
}
else if (osName.equals("Windows NT") || osName.equals("Windows 95"))
{
System.out.println("This is a Windows box and therefore bad.") ;
}
else
{
System.out.println("This is not a box.") ;
}
}
}
然后开始用面向对象的编程方式一步一步地进化这个代码。
先是以过程化的思路来重构之。
过程化的方案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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 getTheString(final String osName)
{
if (osName.equals("SunOS") || osName.equals("Linux"))
{
return unixBox() ;
}
else if (osName.equals("Windows NT") ||osName.equals("Windows 95"))
{
return windowsBox() ;
}
else
{
return defaultBox() ;
}
}
public static void main(final String[] args)
{
System.out.println(getTheString(System.getProperty("os.name"))) ;
}
}
然后是一个幼稚的面向对象的思路。
幼稚的面向对象编程
PrintOS.java
1
2
3
4
5
6
7
public class PrintOS
{
public static void main(final String[] args)
{
System.out.println(OSDiscriminator.getBoxSpecifier().getStatement())
;
}
}
OSDiscriminator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class OSDiscriminator // Factory Pattern
{
private static BoxSpecifier theBoxSpecifier = null ;
public static BoxSpecifier getBoxSpecifier()
{
if (theBoxSpecifier == null)
{
String osName = System.getProperty("os.name") ;
if (osName.equals("SunOS") || osName.equals("Linux"))
{
theBoxSpecifier = new UNIXBox() ;
}
else if (osName.equals("Windows NT") || osName.equals("Windows
95"))
{
theBoxSpecifier = new WindowsBox() ;
}
else
{
theBoxSpecifier = new DefaultBox () ;
}
}
return theBoxSpecifier ;
}
}
BoxSpecifier.java
1
2
3
4
public interface BoxSpecifier
{
String getStatement() ;
}
DefaultBox.java
1
2
3
4
5
6
7
public class DefaultBox implements BoxSpecifier
{
public String getStatement()
{
return "This is not a box." ;
}
}
UNIXBox.java
1
2
3
4
5
6
7
public class UNIXBox implements BoxSpecifier
{
public String getStatement()
{
return "This is a UNIX box and therefore good." ;
}
}
WindowsBox.java
1
2
3
4
5
6
7
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
1
2
3
4
5
6
7
public class PrintOS
{
public static void main(final String[] args)
{
System.out.println(OSDiscriminator.getBoxSpecifier().getStatement())
;
}
}
OSDiscriminator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class OSDiscriminator // Factory Pattern
{
private static java.util.HashMap storage = new java.util.HashMap() ;
public static BoxSpecifier getBoxSpecifier()
{
BoxSpecifier value = (BoxSpecifier)storage.get(System.getProperty("
os.name")) ;
if (value == null)
return DefaultBox.value ;
return value ;
}
public static void register(final String key, final BoxSpecifier value)
{
storage.put(key, value) ; // Should guard against null keys,
actually.
}
static
{
WindowsBox.register() ;
UNIXBox.register() ;
MacBox.register() ;
}
}
BoxSpecifier.java
1
2
3
4
public interface BoxSpecifier
{
String getStatement() ;
}
DefaultBox.java
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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.register("SunOS", value) ;
OSDiscriminator.register("Linux", value) ;
}
}
WindowsBox.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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.register("Windows NT", value) ;
OSDiscriminator.register("Windows 95", value) ;
}
}
MacBox.java
1
2
3
4
5
6
7
8
9
10
11
12
13
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.register("Mac 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
的设计准则。
(全文完)
(转载本站文章请注明作者和出处 酷壳 – CoolShell.cn ,请勿用于任何商业用途)
interface
【在 p*****2 的大作中提到】
:
: 我主要不喜欢那种生硬的套模式的编程方法。我喜欢灵活性,就事论事的设计。我感觉
: 程序也并不都是松耦合。可能在internet这个世界是这样。但是很多系统都是紧耦合的
: 。
g*g
38 楼
Most frameworks used annotation to handle di these days.
Even if you don't use DI, it's not simpler
Compare
private OtherService otherService;
public MyService(OtherService otherSerivce) {
this.otherService = otherService;
}
to
@Autowired
private OtherService otherService;
I don't see how the former can be simpler.
hard
【在 p*****2 的大作中提到】
:
: 我主要不喜欢那种生硬的套模式的编程方法。我喜欢灵活性,就事论事的设计。我感觉
: 程序也并不都是松耦合。可能在internet这个世界是这样。但是很多系统都是紧耦合的
: 。
Even if you don't use DI, it's not simpler
Compare
private OtherService otherService;
public MyService(OtherService otherSerivce) {
this.otherService = otherService;
}
to
@Autowired
private OtherService otherService;
I don't see how the former can be simpler.
hard
【在 p*****2 的大作中提到】
:
: 我主要不喜欢那种生硬的套模式的编程方法。我喜欢灵活性,就事论事的设计。我感觉
: 程序也并不都是松耦合。可能在internet这个世界是这样。但是很多系统都是紧耦合的
: 。
相关阅读
怎么学习distributed system?leetcode longest consecutive sequence还是想不通!求个公司列表请教个ec2 + nosql 的问题分布式看什么弱问 container和paneljava str.replaceAll("\n", "") doesn't work新手求教找JAVA工作问题求教Unmodifiable List concurrent access 问题如何获得经验Generate Unique ID for an existing Oracle TableJavaServer Faces 和 Java Servlet公司面试题汇总文件的link? (转载)BIgData对job market的影响?论这两年不断突破心理底线的互联网薪水 zt问个JAVA设计多线程cache问题关于RMI的问题Java Map 存 1 million 记录find bugs是个好东西呀