Hello World
Spiga

Why Java Sucks and C# Rocks(补2):标准事件模型

2010-07-13 01:17 by 老赵, 1927 visits

这又是一篇“补”,本来并不想写这方面的内容,因为这并非完全是“语言”相关。打个比方,如果您觉得.NET中的事件模型不友好,那么就按Java的做法去做咯(反之就做不到了)。不过既然正好看到有些涉及到这方面的讨论,那么我也趁此机会发表一下自己的看法吧。这次谈的是两种语言(其实在这个话题上也是平台)下“标准”的事件模型。“标准”二字意味着是被双方社区各自接受的模型,而不仅仅是为了实现“事件”这一理念而使用的任意做法。

.NET中的事件

还是从两种事件模型开始介绍。首先是.NET中的事件模型。.NET里的“事件”是一等公民,换句话说,这是平台中所直接定义和描述的概念,我们利用反射相关的API(如GetEvent方法)可以直接获取到某个“事件”对象,然后对其进行各类操作(例如添加或删除处理器)。.NET中的事件基于“委托”,这也是.NET有别于Java平台的概念之一,在上一篇文章中也有过简单介绍,事实上委托在.NET 1.0中似乎完全是为事件量身定做的,例如在System.Windows.Forms.Form类中便定义了:

// C#
public class Form : Component
{
    public event MouseEventHandler MouseMove;
    public event MouseEventHandler MouseDown;
    public event MouseEventHandler MouseUp;
    public event MouseEventHandler MouseWheel;
    ...
}

当然“事件”这东西不光是UI组件独有的,事实上在.NET中有一种异步模式便是基于事件的——例如WebClient类,在使用时我们可以为一个WebClient对象的DownloadProgressChanged事件注册事件处理方法:

// C#
void Download()
{
    WebClient client = new WebClient();
    client.DownloadProgressChanged +=
        new DownloadProgressChangedEventHandler(OnDownloadProgressChanged);
    ...
}

void OnDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    ...
}

在.NET中,事件的处理器是一个符合委托签名方法,单个事件之间完全分离,它们各自的事件处理器也完全独立。

Java中的事件

Java中并没有特定的“事件”对象,这和它的“属性”一样,都是属于纯粹“概念”上的内容,事实上它们完全是由普通的方法,接口等基本事物形成的。例如,同样作为UI组件中的窗口,javax.swing.JFrame有一套这样的API(继承自java.awt.Component):

// Java
public class Component {
    public void addMouseListener(MouseListener l);
    public void removeMouseListener(MouseListener l);
    public MouseListener[] getMouseListeners();
    ...
}

public interface MouseListener {
    void mouseClicked(MouseEvent e);
    void mouseEntered(MouseEvent e);
    void mouseExited(MouseEvent e);
    void mousePressed(MouseEvent e);
    void mouseReleased(MouseEvent e);
}

Java中的事件不是“对象”,如它的属性一样,都是“一组API”,不过事件比属性更复杂一些。Java中的事件模型由几个部分组成:一个addXxxListener方法,用于添加事件处理器;一个removeXxxListener方法用于删除一个事件处理器;还有一个getXxxListners方法用于获得当前已经添加的所有的事件处理器。此外,在Java中的事件处理器是由接口XxxListener表示的,一个接口中包含了多个事件,换句话说,Java是对事件进行了“分组”,例如在Component对象中还有另外一组与鼠标有关的事件:

// Java
public class Component {
    public void addMouseMotionListener(MouseMotionListener l);
    public void removeMouseMotionListener(MouseMotionListener l);
    public MouseMotionListener[] getMouseMotionListeners();
    ...
}

public interface MouseMotionListener {
    void mouseDragged(MouseEvent e);
    void mouseMoved(MouseEvent e);
}

在使用事件时,往往是利用匿名类型添加事件处理器,例如:

// Java
component.addMouseMotionListener(
    new MouseMotionListener() {
        public void mouseMoved(MouseEvent e) {
            // do this, do that...
        }
        public void mouseDragged(MouseEvent e) { /* empty */ }
    });

使用匿名类型,我们可以内联地创建一个实现了XxxListener接口的对象,这样就避免了创建一个新的类型(在Java语言中这意味着还要创建新的源文件),也方便形成一个能够访问上下文成员的闭包。不过您可以发现,如果我们只是要监听mouseMoved事件,也需要实现整个分组,即MouseMontionListener接口,只不过要将无需实现的方法留空罢了。这么做产生的问题就是,例如像MouseListener这样的接口,其中包含5个成员,那么如果我只想实现mouseClicked单个事件的话,留空其他4个方法还是太过麻烦了。因此Java也提供了对应的XxxAdaptor类,让我们可以写出这样的代码:

// Java
component.addMouseListener(
    new MouseAdaptor() {
        public void mouseClicked(MouseEvent e) {
            // do this, do that...
        }
    });

XxxAdaptor类会实现XxxListener接口,并且实现其中的所有方法,并全部留空。于是在使用时,我们便可以基于Adaptor类创建一个匿名类型,并选择我们需要的方法来覆盖(override)。例如上面这段代码,我们既然只要关注mouseClicked事件,那么也只要覆盖这一个方法就行了。

Java事件模型的缺点

一句话:我不喜欢Java的事件模型。

首先,Java的事件模型比较零散。一个事件要包含三个方法,这三个方法组成一个完整的事件,缺一不可。那么,这三个方法为什么就不能“一体化”,统一成单个对象呢?.NET在这方面做的比较好,事件本身是一个独立的对象,无论是添加、删除,还是获得当前所有的事件处理器,都是从“事件对象”本身出发的功能。这与“属性”一样,我认为.NET的设计更为紧凑,优雅。当然,要实现这一点,并非一定要.NET中“委托”这样有些特殊的类型,一个普通的接口或是抽象类也可以满足“单一对象”的要求。只是,我不是十分接受Java这种“松散”的事件模型。

其次,Java的事件之间不是独立,而是经过“分组”的——当然,也有像MouseWheelListener那样的只包含mouseWheel单个事件的“分组”,但毕竟大部分分组中还是包含多个事件。这就出现一个问题,我们难以单独处理单个事件,在添加单个事件的处理器时必然要涉及到其他事件。我们来设想这样一种情况:

// Java
component.addMouseListener(
    new MouseAdaptor() {
        public void mouseClicked(MouseEvent e) {
             // do this, do that...
        }
    });

component.addMouseListener(
    new MouseAdaptor() {
        public void mousePressed(MouseEvent e) {
             // do this, do that...
        }
    });

以上两段代码分别为mouseClicked和mousePressed事件各自添加了一个事件处理器。那么请问,当mouseClicked事件触发时,将会执行几个事件处理器?答案是2个,一个是我们添加的逻辑,还有一个是随mousePressed事件一起携带而来的“空白逻辑”。而且事实上,即便是理应“置身事外”的mouseEntered或mouseExited事件,它们也被各自添加了两个空白的处理器。对于一个对性能极度苛刻的程序员来说,这样的“浪费”可能是无法忍受的(虽然我觉得这里并不会有什么性能问题)。

此外您是否想过,为什么MouseListener和MouseMotionListener会是两个“事件组”而不合并为同一个呢?据说也是性能方面的缘故,因为MouseMotionListener中的事件都是“连续触发”的,换句话说,它们执行事件处理器的密度很高,如果将它和MouseListener合并,那么一个如mouseClicked这样的“普通型”事件处理器,也会让mouseMoved这样的“密集型”事件执行无谓的方法。由于执行密度很高,可能对于性能的影响就比较可观了。

可能您会说,把所有的事件处理逻辑实现在一个XxxAdaptor或是XxxListener中不就可以了吗?不过这就要求多个不同事件的处理器必须在同一段代码中添加,实在不够自由——这点在使用了Reactive Framework的时候体会尤甚。

不过,我认为Java事件模型最大的缺陷还是“扩展性”。Java中的事件大量依赖了接口,而在一个成熟的类库中,接口的使用应该是非常谨慎的,因为一旦发布了某个公开接口,它就不能进行任何修改,因为任何修改都会导致兼容性上的破坏,这方面在《Framework Design Guildlines》一书中进行了详细论述。试想,现在MouseListener中有5个方法,表示5个事件,那么如果我在新版本的类库中希望增加另外一个事件(如mouseDoubleClicked),那么该怎么办?似乎也只有创建新的接口。但是如果每次需要添加新的事件时都要增加新的接口,而其中仅仅是包含一个接口的话,类库中的补丁痕迹就会很重。更何况,如mouseDoubleClicked这样的事件明显也应该属于MouseListener的一部分。

.NET事件模型的遗憾

.NET事件模型没有Java中的许多缺点,事实上如果有人说.NET的设计参考了Java的缺点,那么我认为“事件模型”可能的确是其中一个。在.NET的事件模型中,事件是一等公民,每个事件都是类的独立成员;它们的事件处理器完全独立,不会相互干涉;在类库升级时如果要增加新的事件,使用最普通最自然的方式增加便是,仅此而已。

当然,.NET中的事件模型也不够完美。在我看来它的缺点在于,它虽然是对象,但还是有限制的对象。在C#中,我们无法将一个事件作为对象传递,无法使用一个抽象类对其进行统一处理(object类型自然除外),也难针对其利用“扩展方法”等常用特性。这个问题在某些情况下会限制某些开发模型,于是我们会为其增加一些“事件即对象”的机制

微软自己其实也意识到这个问题,因此在F#中进行了一些特别的处理。F#编译器会自动将.NET中的事件视为一个IEvent<THandler, TEventArgs>,定义如下:

// F#
type IDelegateEvent<'Delegate> =
  interface
    abstract this.AddHandler : 'Delegate -> unit
    abstract this.RemoveHandler : 'Delegate -> unit
end

type IEvent<'Delegate,'Args
  when 'Delegate : delegate<'Args,unit> and 'Delegate :> System.Delegate> =
  interface
    inherit IDelegateEvent<'Delegate>
end

在F#中,一个.NET中的事件便是一个标准的对象,它弥补了C#里的缺点,于是许多做法在F#中便显得自然或直接了一些。例如,在F#中内置了响应式编程模型,可以直接使用。而对于C#来说,使用Reactive Framework相关功能时,则需要手动地将一个事件转化为IObservable对象——当然,有了一些辅助方法,这也就是一行代码的工作罢了。

总结

这篇文章中我简单介绍了.NET与Java中事件模型,并谈了谈自己的看法。总而言之,.NET的事件模型虽有遗憾,但较之Java的事件模型还是有很大优势的。即便是.NET中的事件模型,在某些人看来会成为“心智负担”,但比较之下我也不愿意让.NET或C#退回到Java的设计方式上——更何况,就这样一个简单的机制就能成为值得一提的心智负担吗?我对此持保留意见。

相关文章

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

91 条回复

  1. 链接

    zhangle1987 2010-07-13 01:39:48

    我是一个大沙发

  2. halida
    72.52.94.*
    链接

    halida 2010-07-13 02:18:14

    看到上面一堆的代码,有种想写: Why C# Sucks and python Rocks 的感觉。

  3. 老赵
    admin
    链接

    老赵 2010-07-13 02:23:04

    @halida

    其实上面都是Java代码,基本没有C#的,呵呵。支持你写,我也对Python有一定了解,自觉C#很多方面和Python差距不大,所以就看你怎么写了,呵呵。

  4. 躺着读书
    116.77.211.*
    链接

    躺着读书 2010-07-13 02:35:12

    Why python Sucks and ruby Rocks

  5. 老赵
    admin
    链接

    老赵 2010-07-13 03:00:10

    @躺着读书

    同样支持啊

  6. halida
    72.52.94.*
    链接

    halida 2010-07-13 03:01:01

    还有,文章里面都是用法,是否可以补上原理?没有用过的人可以了解一下。

  7. yemg
    60.191.246.*
    链接

    yemg 2010-07-13 03:23:44

    使用Event机制设计的UI非常优雅。

  8. FunnyCake
    125.95.113.*
    链接

    FunnyCake 2010-07-13 03:47:09

    人家的时间都拿去发明轮子了,事件当然是心智负担

  9. billlo
    221.4.199.*
    链接

    billlo 2010-07-13 03:47:49

    看了老趙這個系列,才了解java一些東西.以前沒接觸過java語言

  10. yemg
    60.191.246.*
    链接

    yemg 2010-07-13 03:47:53

    回复的时候可以贴图片吗,有些东西使用图片的形式可能更准确。

  11. halida
    72.52.94.*
    链接

    halida 2010-07-13 04:44:48

    对event不是很了解(主要是自己没有在需要event的领域做过事,不敢写这个话题)

    找到一篇文章:http://www.valuedlessons.com/2008/04/events-in-python.html

    python的好处在所想即所写,需要什么,很容易就写出来一个了。

  12. halida
    72.52.94.*
    链接

    halida 2010-07-13 04:48:30

    恩,我发的这个不得了,把C#的event用python实现了,26行代码。

  13. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-13 05:09:31

    老赵说的事件对象都只是与类库设计有关,和语言关系不大

    首先,Java的事件模型比较零散。一个事件要包含三个方法,这三个方法组成一个完整的事件,缺一不可。

    这是类库设计的思路不一样而已,java完全可以设计成一个接口只有一个方法

    public interface MouseLEvent {
        void onMounseEvent(MouseEvent e);
    }
    

    当然同时component就需要加入addMounseEntered、addMouneClicked,addMouseLeave

    不过,我认为Java事件模型最大的缺陷还是“扩展性”。Java中的事件大量依赖了接口,而在一个成熟的类库中,接口的使用应该是非常谨慎的,因为一旦发布了某个公开接口,它就不能进行任何修改,因为任何修改都会导致兼容性上的破坏,这方面在《Framework Design Guildlines》一书中进行了详细论述。试想,现在MouseListener中有5个方法,表示5个事件,那么如果我在新版本的类库中希望增加另外一个事件(如mouseDoubleClicked),那么该怎么办?

    1. event也是一种只有一个方法的接口,它也是不能进行任何修改的。
    2. 扩展很简单嘛,对java自然是需要添加新的接口,.net也需要添加新的delegate嘛。微软的DirectX就有很多Ixxx2,Ixxx3之类的东西。

    接口的使用应该是非常谨慎的,这句话并不是说interface这个类型使用需要谨慎,其实质就是API更换要谨慎,要接口和实现分离,所以不是说要限制使用接口,而是说能用interface的地方,最好用interface而不是class,而interface本身的定义要保持不变。

    推而广之,任何给用户调用的函数等等都应尽可能保持兼容。

    而保持兼容其实是微软最大的问题之一,WinForm都要变成了WPF了,所有接口早都已经没有了,还斤斤计较于一个接口添加一个方法的问题,岂不是看到芝麻丢了西瓜。再比如微软的WF工作流,4.0与之前兼容性完全没有,还有什么事件兼容可谈呢?

    当然了,微软支持者会辩解说,这是技术必须。

    真的是必须吗?当然不是,Qt现在也支持动画框架,也有ui语言定义ui,KDE也使用Qt的,但从来没有说所有接口都推翻重来了。而且最好笑的是,微软推出的众多框架,自己基本不用,比如MFC,WinForm,WPF,微软os的界面层很少用到自己对外推出的这些框架。

  14. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-13 05:23:46

    老赵的这句话

    接口的使用应该是非常谨慎的

    我认为应该是

    接口的修改应该是非常谨慎的

    微软做的就很差,导致博客园总充满又发现一种新方式写hello,world的文章。

    而至于老赵这篇文章,其实探讨的是接口的粒度粗细的问题,

    类似于一个初始化point,是定义成point.setX(int x), point.setY(int y)还是point.setXY(int x, int y). 老赵是担心,如果以后point变成了3d的话,前面一个只需要加个函数setZ显得更一致。

    不过这是库的设计问题,而不是语言问题。

  15. 老赵
    admin
    链接

    老赵 2010-07-13 06:04:00

    @mcpssx

    你没有看明白我文章到底在写什么,比如你说的“接口”和我说“接口”就不是一类东西。你说的东西泛指用户使用API,我说的是“class”、“interface”这里的“接口”。你说“接口的修改时非常谨慎”的,这话不对,一旦发布了公开的API就不能够修改了。而我说的“接口的使用应该非常谨慎”,说的是对于正规的类库来说,创建公开interface要谨慎,因为一旦发布就不能修改了。于此相对,类或是抽象类的话,只要保持原有API不变,增加新的API不会破坏兼容型的。

    一句话就是,你说的东西和我说的不是一个玩意儿,还有说我担心setX之类的,更加是无厘头了,根本没想谈这个……

    再有,你说的一个接口一个事件,我文章里也说了,当然是可以的,但可惜Java类库就是用这种古怪的“分类”逻辑来,你也没办法,我也不愿意。在Java的这种方式下面,基本没法添加新事件,.NET的则很容易添加。还有这个自然是类库的设计问题,不是语言问题,这个我在文章第一段里就写了,不知道你看到了没有。其实如果你看到我文章里到处用的是.NET而不是C#也应该意识到这点了。

    至于你其他地方说微软不兼容做的差什么的,你说过无数遍的我也回应过无数遍了,我就不多谈了,实在很没意思。总而言之,微软的兼容性做的是很好的,无论是事实还是理论。推出WPF又如何?WinForm照样正常使用,这就是兼容性强的表现,这和西瓜芝麻有什么关系?兼容性是指对遗留系统的可执行性,而不是指开发新系统是不是用老的API。

    所以其实吧,你口中的“兼容性”和我的“兼容性”,其实说的也不是一类事情。所以我还是建议你再理解一下我想表达的内容,免得讨论歪了……

  16. 老赵
    admin
    链接

    老赵 2010-07-13 06:07:32

    @halida: 恩,我发的这个不得了,把C#的event用python实现了,26行代码。

    实现个event模型没什么大不了的,连Java都能很简单地实现类似的功能,比Python多的基本上都是些架子代码。这个场景体现不出Python的优势,其实对于动态语言来说,基本要体现优势还得上Meta-Programming。

  17. 老赵
    admin
    链接

    老赵 2010-07-13 06:14:33

    @yemg: 回复的时候可以贴图片吗,有些东西使用图片的形式可能更准确。

    可以的,看一下帮助吧。

  18. 老赵
    admin
    链接

    老赵 2010-07-13 06:15:58

    @halida: 还有,文章里面都是用法,是否可以补上原理?没有用过的人可以了解一下。

    这里没什么原理可谈,事件模型其实就是一套对外表现出的API样式,谈不到原理的。

  19. Cadina
    125.71.228.*
    链接

    Cadina 2010-07-13 06:41:00

    Silverlight里面的Trigger,Action,Behavior也很优雅啊,期待老赵讲一下

  20. 老赵
    admin
    链接

    老赵 2010-07-13 07:18:12

    @Cadina

    Silverlight我一窍不通的。

  21. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-13 07:50:05

    @mcpssx

    你没有看明白我文章到底在写什么,比如你说的“接口”和我说“接口”就不是一类东西。你说的东西泛指用户使用API,我说的是“class”、“interface”这里的“接口”。你说“接口的修改时非常谨慎”的,这话不对,一旦发布了公开的API就不能够修改了。而我说的“接口的使用应该非常谨慎”,说的是对于正规的类库来说,创建公开interface要谨慎,因为一旦发布就不能修改了。于此相对,类或是抽象类的话,只要保持原有API不变,增加新的API不会破坏兼容型的。

    delegate、event一经发布,也不能修改嘛,难道已有的event能增加新事件吗?

    再有,你说的一个接口一个事件,我文章里也说了,当然是可以的,但可惜Java类库就是用这种古怪的“分类”逻辑来,你没有办法,我也没有办法。在Java的这种方式下面,基本没法添加新事件,.NET的则很容易添加。还有这个自然是类库的设计问题,不是语言问题,这个我在文章第一段里就写了,不知道你看到了没有。其实如果你看到我文章里到处用的是.NET而不是C#也应该意识到这点了。

    为什么你会得出java没法添加新事件的结论呢?

    不也就是加一个MouseLister2的接口,在component中加一个addMounseListen2的函数吗?

    微软要加入新事件,不也是加一个新delegate,然后在component中加一个添加event的函数或属性吗?

    至于你其他地方说微软不兼容做的差什么的,你说过无数遍的我也回应过无数遍了,我就不多谈了,实在很没意思。总而言之,微软的兼容性做的是很好的,无论是事实还是理论。推出WPF又如何?WinForm照样正常使用,这就是兼容性强的表现,这和西瓜芝麻有什么关系?兼容性是指对遗留系统的可执行性,而不是指开发新系统是不是用老的API。

    现在我们说的兼容性,都是是针对程序员而言的,而不是指系统可以运行以前的程序,不是什么winform程序还可以继续运行。

    Linux上都能运行Qt和GTK+程序,这与QT API是否保持连续是两个问题。

    如果winform能很好的扩展,为什么不能在接口稳定的情况下,扩展出WPF来?

    功能类似WPF的GTK+ 的Clutter和Qt Animation都没有大修改已有的API。

    微软的软件开发接口没有兼容性,导致微软的程序员始终在各种helloworld上打转。

  22. 链接

    陈梓瀚(vczh) 2010-07-13 07:52:30

    道理很简单嘛,因为当初Java不支持泛型,因此根据Java语法的学院派风格,它是不可能实现event这种东西的。如果Java语法不是那么学院派的话,说不定他还是会做的。

  23. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-13 08:19:04

    微软基本不用自己开发出的框架,是一件很值得大家思考的事情。 MFC、WPF、WinForm有哪一个微软正儿八经的用过了?微软自己为什么不用?

    微软os的桌面层和office之类应用的基本没有用过这些东西。

    相反,GNome,KDE、KOffice,GOffice就是用Qt,GTK+开发的,而QT,GTK+的API可以追溯到很多年前了。

    事实证明,微软在桌面层开发并不比这些传统的框架方便多少,但是已经不知道变了多少次框架了。

    在这种情况下,说.net的系统设计扩展性更好其实没有多大意义。

    老赵试图论证.net的系统设计更容易扩展,更容易保持过去的接口不变,但事实是,微软的系统接口变得一塌糊涂,跟重新学习没什么区别。

    老赵举得java的例子都是一些具体设计问题,这种问题与语言本身无关,.net中间也很多设计不方便的,比如ASP .net中的数据库连接,java中连接不同类型的数据库只有一种connection,而微软则是单独搞出SqlConnection,在SqlCommand传递参数时候,使用微软独有的@来表示占位参数,总之就是尽力把你绑定在微软数据库上。vs2003中是可视化设计sqlconnection,到了2005就变成了主推SqlDataSource。

    老赵总是从理论上论证,问题就是现实完全想反。java swing遇到了扩展问题?没有吧,老赵能举出一个因为这个接口导致java界表示很难扩展的例子吗!.net更好的保持现有接口不变,现实是.net的变动比java不知道多多少。

  24. 老赵
    admin
    链接

    老赵 2010-07-13 09:24:16

    @mcpssx

    delegate、event一经发布,也不能修改嘛,难道已有的event能增加新事件吗?

    .NET 2.0在1.0的基础上增加了MouseDoubleClick事件(还是2.0到3.5?),没有任何问题,因为事件之间是独立的。在Java里如果我想加,那么它可以加到MouseListener里吗?不行,一加就不能向后兼容了。

    为什么你会得出java没法添加新事件的结论呢?不也就是加一个MouseLister2的接口,在component中加一个addMounseListen2的函数吗?微软要加入新事件,不也是加一个新delegate,然后在component中加一个添加event的函数或属性吗?

    是啊,微软只要加一个新的delegate,就能漂亮的增加一个事件了,没有任何痕迹。Java这边只能上MouseListener2,那么我再升一次级就用3或4吗?这也太狗皮膏药状了(我文章里的说法是:“类库中的补丁痕迹就会很重”)。你可能不嫌丑,我是没法接受这种设计的(就像你发表的评论如果格式糟糕的话,我都会帮你修改好的)。

    老赵举得java的例子都是一些具体设计问题,这种问题与语言本身无关。.net中间也很多设计不方便的,比如ASP.net中的数据库连接,java中连接不同类型的数据库只有一种connection,而微软则是单独搞出SqlConnection……

    我再先强调一次,拜托先看我文章第一段,我已经说明的很多东西不想一遍遍地重复……

    至于数据库连接什么的,从.NET 1.0一开始就有IDbConnection,SqlConnection就是其中一个实现罢了,当然它有自己独特的功能和优势,这又有什么不行?如果你想要兼容,那么就用IDbConnection,IDbCommand之类的就行了,也不是没有人这么写。而且,又不是没有SqliteConnection,MySqlConnection这些东西。真不知道你为什么说只有SqlConnection。

    现在我们说的兼容性,都是是针对程序员而言的,而不是指系统可以运行以前的程序,不是什么winform程序还可以继续运行。

    我刚才不是说了么,我们没有在说同一种“兼容性”。其实这只是你口中的“兼容性”,不是我正在谈论的兼容性,我也不认为你这个叫做兼容性(叫“连续性”倒还算合适),而且也不觉得使用新的API代替旧有的有什么问题……你要谈的这个话题之前争论过无数遍了,我实在懒得参与了。

    Linux上都能运行Qt和GTK+程序,这与QT API是否保持连续是两个问题。如果winform能很好的扩展,为什么不能在接口稳定的情况下,扩展出WPF来?功能类似WPF的GTK+ 的Clutter和Qt Animation都没有大修改已有的API。

    你先证明WPF和GTK+之类的功能一致再说吧。我不会怀疑你是否了解GTK+,但是从你以前的说法里我可以推测其实你并不接触太多.NET,我很难相信你掌握WPF多少内容。至于其他的,开发WPF是因为WinForm不能扩展吗?我没用过GTK+不过我用过GTK#(就是给.NET的port,不知道接口是不是类似),它的接口其实WinForm相比没什么特别的。所以我觉得你又在臆断了,你使用臆断来论证的话,的确什么都能证明出来的……希望提出论点的时候顺便就举证了罢,否则我说你拍脑袋随口说也不好听,是吧。

    建议你还是看看Framework Design Guildlines一书吧,业界很有名的,得奖的,那里关于兼容性的措施等等写的很具体,你如果觉得这些准则有问题的话,正好也可以明确指出的。这些才叫“证明”,而不是随便抓来一个东西就说“这证明了XXX兼容性不好”。

    老赵总是从理论上论证,问题就是现实完全想反。java swing遇到了扩展问题?没有吧,老赵能举出一个因为这个接口导致java界表示很难扩展的例子吗!.net更好的保持现有接口不变,现实是.net的变动比java不知道多多少。

    它有没有扩展问题?我不知道啊,因为不能扩展,也不能扩展(好像增加过MouseWheelListener,里面就一个事件),我真想让它扩展一个mouseDoubleClicked事件,看看它会怎么处理(要打狗皮膏药吗?)。我说的理论是真实存在的,除非你的类库不升级,否则Java的事件模型就会遇到我说的这种情况。.NET从来没有变动接口过,所以它的兼容性很好,旧的.NET代码可以直接编译,程序可以直接运行,这就是兼容性。

  25. vczh
    124.79.173.*
    链接

    vczh 2010-07-13 13:02:33

    @mcpssx: 微软基本不用自己开发出的框架,是一件很值得大家思考的事情。 MFC、WPF、WinForm有哪一个微软正儿八经的用过了?微软自己为什么不用?

    你去看看Visual Studio,去看看SQLServer,谁没用了?Office也就是众多产品中的一款而已,开发比.net早,有历史原因的。VS和SQLServer后来都改成了.net,那还不就是因为好用吗。如今vs2010都用了WPF了,根据个人的经验,那速度还是不慢的……

  26. 老赵
    admin
    链接

    老赵 2010-07-13 13:42:06

    @vczh

    还有Expression Studio,Windows Live套件等等……其实微软开发的新工具基本都是使用.NET,我不知道为什么“微软自己都不用”这种调调还会在,难道非要把Office重写了才行?就怕估计到时候又会说“写个Windows看看”之类的话了,呵呵。

  27. mikeshi
    114.91.66.*
    链接

    mikeshi 2010-07-13 14:42:58

    @halida: 恩,我发的这个不得了,把C#的event用python实现了,26行代码。

    实现个event模型没什么大不了的,连Java都能很简单地实现类似的功能,比Python多的基本上都是些架子代码。这个场景体现不出Python的优势,其实对于动态语言来说,基本要体现优势还得上Meta-Programming。

    这个,这个……太不像老赵的风格了。你最痛恨的不就是那些和业务无关,仅仅为了满足编译器需求的架子代码吗?也强调过,虽然有些确实可以说是语法糖,但是正是因为这些语法糖,使很多用法变得更为廉价和实用了。现在怎么就成了“比Python多的基本上都是些架子代码”了,仿佛很无所谓一样。

    当然,动态语言确实在Meta-Programming上确实优势很大,用惯了SQLAlchemy再回头用Hibernate,简直像倒退了很多年一样,但是也不用贬低Python的event实现吧,呵呵

  28. Duron800
    113.44.0.*
    链接

    Duron800 2010-07-13 14:45:06

    @mcpssx: 微软基本不用自己开发出的框架,是一件很值得大家思考的事情。 MFC、WPF、WinForm有哪一个微软正儿八经的用过了?微软自己为什么不用?

    你自己不知道就别在这里丢人行不?你都不去了解一下就在那里胡诹?你自己不知道不代表就没有用过。

  29. 老赵
    admin
    链接

    老赵 2010-07-13 14:55:39

    @mikeshi: 现在怎么就成了“比Python多的基本上都是些架子代码”了,仿佛很无所谓一样。

    本来多出些架子代码就是无所谓的。

    谁说过我痛恨架子代码了啊?我支持的LINQ,Lambda表达式等等,声明式编程,哪个涉及到“去除架子代码”了亚?记得上次有哪本书说Ruby多强,比Java强多少,我还指出这个例子不妥当,因为数行数的时候把架子代码算进去了。架子代码,基本上都可以由编辑器生成的,我重视的都是编辑器没法生成的(当然这个架子代码也不能太丑)

    还有我什么时候贬低过Python的Event实现了啊?这是个有用的例子,我只是说它体现不出Python的强大而已,背后的意思是,Python强大,但是这个例子不好。我的确重视语法糖,但是Python少掉的架子代码是语法糖吗?而且,你说Python少了这些架子,对于编程思想的帮助在哪里?

    说到底你曲解我的话就不对了,包括我不喜欢架子代码等等,估计这其实是你的看法,但以为我也应该同意吧……

    PS: 你可以在这篇文章里搜索“架子”两个字,在评论里。还有文章正文的最后一段话(甚至整篇文章)也能表达我的看法,呵呵。

  30. yemg
    60.191.246.*
    链接

    yemg 2010-07-14 00:40:55

    微软有95%的C#+5%的C++实现的操作系统。

  31. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-14 01:31:42

    .NET 2.0在1.0的基础上增加了MouseDoubleClick事件(还是2.0到3.5?),没有任何问题,因为事件之间是独立的。在Java里如果我想加,那么它可以加到MouseListener里吗?不行,一加就不能向后兼容了。

    为什么要加到MouseListener里?难道MouseDoubleClick能加到MouseClick里吗?

    是啊,微软只要加一个新的delegate,就能漂亮的增加一个事件了,没有任何痕迹。Java这边只能上MouseListener2,那么我再升一次级就用3或4吗?这也太狗皮膏药状了(我文章里的说法是:“类库中的补丁痕迹就会很重”)。你可能不嫌丑,我是没法接受这种设计的(就像你发表的评论如果格式糟糕的话,我都会帮你修改好的)。

    那只是一个取名的问题而已,你把NouseDoubleClickEvent改成MouseClickEvent2看看

    至于数据库连接什么的,从.NET 1.0一开始就有IDbConnection,SqlConnection就是其中一个实现罢了,当然它有自己独特的功能和优势,这又有什么不行?如果你想要兼容,那么就用IDbConnection,IDbCommand之类的就行了,也不是没有人这么写。而且,又不是没有SqliteConnection,MySqlConnection这些东西。真不知道你为什么说只有SqlConnection。

    你说的这个我早就知道,你见过几个用IDbConneciton的?ASP .net的工具一直支持的就是各种数据库的connection的。 即使使用了IdbConnection,那只是返回值而已,你具体驱动连接的时候,还是要使用SqlConnection,SqlCommand。 你说的各种数据库connection我当然知道,所以一换数据库,各种SqlConection,SqlCommand都要发生变化,而java是只要改数据库driver的字符串的。

    你先证明WPF和GTK+之类的功能一致再说吧。我不会怀疑你是否了解GTK+,但是从你以前的说法里我可以推测其实你并不接触太多.NET,我很难相信你掌握WPF多少内容。

    去看看Clutter吧 http://www.clutter-project.org/about

    至于其他的,开发WPF是因为WinForm不能扩展吗?我没用过GTK+不过我用过GTK#(就是给.NET的port,不知道接口是不是类似),它的接口其实WinForm相比没什么特别的。所以我觉得你又在臆断了,你使用臆断来论证的话,的确什么都能证明出来的……希望提出论点的时候顺便就举证了罢,否则我说你拍脑袋随口说也不好听,是吧。

    那是因为你你不知道Clutter,GTK不需要全部推倒重来,才能实现WPF的功能。

    它有没有扩展问题?我不知道啊,因为不能扩展,也不能扩展(好像增加过MouseWheelListener,里面就一个事件),我真想让它扩展一个mouseDoubleClicked事件,看看它会怎么处理(要打狗皮膏药吗?)

    所谓的delegate,就是一个只有一个方法的类,跟加一个接口有什么区别?你不能加一个MouseDoubleClickedListerer吗?

  32. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-14 01:35:33

    什么是Clutter,请看如下

    Clutter currently has the following features:

    • Scene-graph of layered 2D interface elements manipulated in 3D space via position, grouping, transparency, scaling, clipping and rotation. Learn more about ClutterActor...
    • Animation framework, providing path interpolation, transitions and other custom effects via implicit animations. Learn more about Clutter Animation Framework...
    • User Interface definition format, based on JSON, for describing layout and animation. Learn more about ClutterScript... Advanced input event handling, including multiple pointing devices.
    • Custom Pango renderer providing efficient internationalised UTF8 text rendering through OpenGL.
    • Support for high end OpenGL features such as Shaders, FBO, VBO and PBO through a low-level, object oriented abstraction API. More about Cogl...
    • Support for media playback with GStreamer, Cairo graphics rendering, GTK+ embedding, Box2D physics engine and Gecko and WebKit web rendering are available via optional add-on libraries.
    • Object oriented design via GObject with a familiar GTK+ like API.
    • Runs on Linux, Windows and OSX with native backend window system support for GLX, EGL, WGL, SDL and Cocoa.
    • Support for mobile devices with fixed point internals and portability across Open GL, OpenGL ES 1.1 and OpenGL ES 2.0

    请老赵说说,为什么这玩意就不能和WPF相比了?

    clutter是完全基于GTK+扩展的

  33. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-14 01:56:04

    @老赵: 还有Expression Studio,Windows Live套件等等……其实微软开发的新工具基本都是使用.NET,我不知道为什么“微软自己都不用”这种调调还会在,难道非要把Office重写了才行?就怕估计到时候又会说“写个Windows看看”之类的话了,呵呵。

    我说的基本不用,并不是完全不用。

    VisualStudio大部分是C++的,只是部分界面使用了WPF,这和java完全不同,java的netbeans,eclipse, 和以前的jbuilder都是基本上完全使用java开发的。

    SqlServer不知道说的是什么,是指企业管理器,查询分析器?我记得纯java数据库倒是有不少。

    Expression Studio有人用吗?老赵,你常用?那个sliverlight从1.0到4.0 API变化有多大,

    Windows Live套件,一部分是收购过来,比如说windows live writer,另外的windows live mail, photo是.net的?而那个messager明显是越来越臃肿,我看用的人比以前少多了。

  34. 老赵
    admin
    链接

    老赵 2010-07-14 02:07:57

    @mcpssx

    请老赵说说,为什么这玩意就不能和WPF相比了?

    光看介绍就能说明问题了?如果你是用这种方式来讨论问题的话,那么我们根本就是鸡同鸭讲。我不了解Clutter也不了解WPF,所以我不会说XX也做到了YY,你觉得都能做到,那么就要说清楚。WPF和Clutter应该都是大家伙,你用三句两句话就能说清么?

    如果你喜欢推测,我那么我也可以来推测。就像我上面说的,GTK#的API和WinForm其实没什么太大设计区别,如果GTK可以扩展,那么WinForm也可以扩展,因此重新设计一个WPF是有其他原因的。什么原因,我不知道,不过如果你坚持认为“WinForm不能扩展”,请给出更好的理由,不要再说类似于“.NET客户端不多就一定是因为.NET性能差”这样的说明了。

    之前某人是“认定了.NET性能差”,所以“看什么都觉得是性能杀手”,比如元数据之类的,但就是不给出具体说明。这点很多人在后面的评论中已经指出了。其实说某某东西有问题,我很支持。但是为了批评而批评,只批评不给出切实理由(我还没强求解决方案呢),我是无法接受的。

    为什么要加到MouseListener里?难道MouseDoubleClick能加到MouseClick里吗?那只是一个取名的问题而已,你把NouseDoubleClickEvent改成MouseClickEvent2看看。所谓的delegate,就是一个只有一个方法的类,跟加一个接口有什么区别?你不能加一个MouseDoubleClickedListerer吗?

    MouseDoubleClick明显就是属于MouseListener的一个事件,和MouseClick是并列关系的。至于2不2的命名,我说过了,你无所谓API设计是否优雅,你能接受2的命名,你能接受Java的设计;和你想法不同,我有所谓,我没法接受2,我没法接受Java的设计。你可以把delegate看作是只有一个方法的类,但是它的语义和接口完全不同,你每次升级都要增加接口,这就是“狗皮膏药”式设计了。

    你说的这个我早就知道,你见过几个用IDbConneciton的?ASP.NET的工具一直支持的就是各种数据库的connection的。 即使使用了IdbConnection,那只是返回值而已,你具体驱动连接的时候,还是要使用SqlConnection,SqlCommand。 你说的各种数据库connection我当然知道,所以一换数据库,各种SqlConection,SqlCommand都要发生变化,而java是只要改数据库driver的字符串的。

    因为SQL Server是微软自己的,自然SQLConnection的有些额外的更好的支持了,这有什么不对的?如果你希望得到“通用性”,愿意接受“共同平庸”,那么就可以去使用IDbConnection,你不用不代表就别人不用。我也用过IDbConnection,只不过是全部使用IDbConnection和IDbCommand而已,然后使用IDbFactory创建对象,不要直接new SqlParameter,用factory.CreateParameter方法——这点在微软N年前的Enterprise Library里就有支持了。

  35. 老赵
    admin
    链接

    老赵 2010-07-14 02:26:22

    @mcpssx

    Visual Studio大部分是C++的,只是部分界面使用了WPF,这和java完全不同,java的netbeans,eclipse, 和以前的jbuilder都是基本上完全使用java开发的。

    VS 2010使用WPF开发了完整界面,使用.NET重写了一部分工具和完整的编辑器的功能和插件体系,因此可以说核心完全是.NET的。而为了节省开发成本而复用以前代码,或是有些东西需要直接使用COM和C++写,所以相反C++只是只是负责写其中的部分组件、工具而已。

    SqlServer不知道说的是什么,是指企业管理器,查询分析器?我记得纯java数据库倒是有不少。

    纯.NET的数据库也不少,但是对于真正成熟的常用的,比如SQL Server,Oracle,DB2,MySQL,PostgreSQL,有哪个是用.NET或Java写主要部分的?这毕竟还是有软件特征因素在里面的。

    Expression Studio有人用吗?老赵,你常用?那个sliverlight从1.0到4.0 API变化有多大。

    我时不时用一下,不常用,但你扯这个做什么?现在讨论的是微软用没用.NET写软件,和这个软件流不流行有关系吗?即使Expression Studio真像你说的这样不流行,那么它不用.NET写就能流行了?你也是老程序员了,这样扯一些没有逻辑的话很失高级技术人员的风范的。

    Silverlight我不了解因此不知道,我只听说1.0到2.0是推翻的,后面就连贯了。我很奇怪你为什么似乎什么都知道,什么都敢说,但我还是那句话,拜托你立论的时候顺便证明一下,这个要求不过分吧。

    Windows Live套件,一部分是收购过来,比如说windows live writer,另外的windows live mail, photo是.net的?

    Photo我没装还不知道,但是Writer和Mail的确都是用.NET写的。Windows Live套件基于.NET 3.5,Expression Studio基于.NET 4.0。微软开发的新工具几乎都是基于.NET的,虽然根据各自“档期”不同,可能没有利用最新的.NET,仅此而已。

  36. 链接

    幸存者 2010-07-14 03:09:24

    基于委托的事件机制的一大优势就是比接口更松藕合,创建一个委托只要参数列表和返回值兼容就可以了,而创建一个接口的实例首先要保证某个类实现这个接口。

    其实.net中的事件说白了就是内建的更松藕合的Observer模式。

  37. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-14 03:29:06

    @老赵

    光看介绍就能说明问题了?如果你是用这种方式来讨论问题的话,那么我们根本就是鸡同鸭讲。我不了解Clutter也不了解WPF,所以我不会说XX也做到了YY,你觉得都能做到,那么就要说清楚。WPF和Clutter应该都是大家伙,你用三句两句话就能说清么?

    看语言的futuren、Demo、和tutorial当然就能知道这是干什么的。否则为什么大家又说silverlight和flash是一个类型的?

    如果你喜欢推测,我那么我也可以来推测。就像我上面说的,GTK#的API和WinForm其实没什么太大设计区别,如果GTK可以扩展,那么WinForm也可以扩展,因此重新设计一个WPF是有其他原因的。什么原因,我不知道,不过如果你坚持认为“WinForm不能扩展”,请给出更好的理由,不要再说类似于“.NET客户端不多就一定是因为.NET性能差”这样的说明了。

    那你就要证明WPF有什么特别之处需要这样做不可,既没有提供与别人不同的功能,却需要人家重新学习,自然有问题。

    cnblogs最近又开始推出一个WPF系列了,又开始介绍WPF的基础知识了,这就是我说的微软的程序员总是浪费在学习各种hello,world上了。

    你应该知道有个moonlight是和silverlight对应的,moonlight就是基于GTK的。

    之前某人是“认定了.NET性能差”,所以“看什么都觉得是性能杀手”,比如元数据之类的,但就是不给出具体说明。这点很多人在后面的评论中已经指出了。其实说某某东西有问题,我很支持。但是为了批评而批评,只批评不给出切实理由(我还没强求解决方案呢),我是无法接受的。

    认定.net性能差,并不是个人意见,而是大家的感受,.net桌面程序有停滞感是事实吧?vb算1+1不比.net快吧?以前vb的程序真么没有这么多人反应呢?

    MouseDoubleClick明显就是属于MouseListener的一个事件,和MouseClick是并列关系的。至于2不2的命名,我说过了,你无所谓API设计是否优雅,你能接受2的命名,你能接受Java的设计;和你想法不同,我有所谓,我没法接受2,我没法接受Java的设计。你可以把delegate看作是只有一个方法的类,但是它的语义和接口完全不同,你每次升级都要增加接口,这就是“狗皮膏药”式设计了。

    那也是命名问题,只是接口粒度的问题嘛,delegate是一个只有一个方法的类,所以你自然觉得命名不会有问题。

    因为SQL Server是微软自己的,自然SQLConnection的有些额外的更好的支持了,这有什么不对的?如果你希望得到“通用性”,愿意接受“共同平庸”,那么就可以去使用IDbConnection,你不用不代表就别人不用。我也用过IDbConnection,只不过是全部使用IDbConnection和IDbCommand而已,然后使用IDbFactory创建对象,不要直接new SqlParameter,用factory.CreateParameter方法——这点在微软N年前的Enterprise Library里就有支持了。

    更好的支持应该体现在sql语法的特性上,比如select top 10 *, java只有一种connection, state 并没有说就不支持sqlserver的独有特性了。

  38. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-14 03:47:24

    @老赵

    Expression Studio有人用吗?老赵,你常用?那个sliverlight从1.0到4.0 API变化有多大。我时不时用一下,不常用,但你扯这个做什么?现在讨论的是微软用没用.NET写软件,和这个软件流不流行有关系吗?Expression Studio不用.NET写就能流行了?你也是老程序员了,这样扯一些没有逻辑的话很丢失高级技术人员的风范的。

    我说的是基本不用,不是完全不用,而且我一直指出微软是在折腾程序员,所以不断在程序员界推出新的东西。 Expression就是用来写WPF的,自然不可能不用.net. Expression不流行其实根源在于WPF,silverlight本身就不流行。 相当部分.net程序员会winform,但不会WPF.

    Silverlight我不了解因此不知道,我只听说1.0到2.0是推翻的,后面就连贯了。我很奇怪你为什么似乎什么都知道,什么都敢说,但我还是那句话,拜托你立论的时候顺便证明一下,这个要求不过分吧。

    我注意到一点,你总是强调你对WPF,silverlinght不了解,但是老赵你肯定了解WinForm吧?

    这就说我说的,不要以为光掌握思想就能忍受微软不停的变换类库了,人的时间是有限的,这点Qt,GTK+的程序员要使用新的动画类库,特效效果就不需要这么折腾。

    你还真得到了它,的确是用.NET写的。Windows Live套件基于.NET 3.5,Expression Studio基于.NET 4.0。微软开发的新工具都是基于.NET的,虽然根据各自“档期”不同,可能没有利用最新的.NET,仅此而已。

    Windows Live photo, mail、movie maker是用.net 3.5写的? Expression本来就是用来表示WPF效果,自然不可能不用.net.

  39. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-14 03:59:52

    老赵似乎认为.net的性能是大家臆想出来的,其实不然,这是大家感觉出来的,.net程序启动慢,中间会有停滞感,以前VB6程序大家就没有这么多抱怨。虽然VB6肯定比C慢不少。

    WPF、silverlinght其实现在学习的人并不多,这说明市场并没有这种程序的迫切需求。其实以后大部分可能会用html5,而性能要求高的大型程序就是C++了

  40. yemg
    60.191.246.*
    链接

    yemg 2010-07-14 04:17:42

    @mcpssx

    你能不能给个具体的例子,分别使用C#,java编写,比较两种之间的性能差距到底有多少,通过具体的数据是很有说服力的。

  41. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-14 04:26:02

    @yemg

    我从来没有说C#比java慢多少,我并不认为java桌面程序就能取代.net桌面程序了。

    我说的是.net的桌面程序给用户感受就不好,这个与计算性能无关,通过函数级的测试是无法证明的。

    我前面就举了个例子,就是Evernote他有C++版,.net版和web版,大家体验一下就清楚了。

    以前VB6也比C++慢,但没有多少人反映启动慢,操作时候有停滞感的。

  42. 链接

    Ivony 2010-07-14 04:31:34

    @幸存者

    也不是这样,使用接口的方式,可以针对每个方法做一个实现类,一般会这样做。

    除了性能的问题外,就是语法的难受。事实上.NET的委托也可以抽象为一个接口: IDelegate { public TResult Invoke( T1, T2, ... ); }

    .NET中支持委托的语言会将继承于MulticastDelagate类型,且有Invoke方法的类型视为委托类型,而Invoke方法的签名即是委托的签名。而签名检查应该是编译器的事情。

    很明显这里的实现是基于“约定”。

  43. 链接

    幸存者 2010-07-14 05:07:46

    @Ivony

    我没太明白你的意思,针对每个方法做一个实现类不代表藕合不紧啊。例如我要为某个事件添加一个处理方法,我必须要先实现这个接口,这样就表示方法签名必须和接口保持一致。

    而委托只需要参数列表和返回值兼容就可以了,对方法名没有要求。这里说“兼容”是因为委托支持协变和逆变,这一点也是很重要的。

    当然C#中的委托可以看作是编译器的一种“约定”,不过其实运行时也提供了一部分支持,例如 Invoke, BeginInvoke 之类的方法就是运行时直接提供的。

  44. 老赵
    admin
    链接

    老赵 2010-07-14 05:18:49

    我注意到一点,你总是强调你对WPF,silverlinght不了解,但是老赵你肯定了解WinForm吧?

    这就是连续性方面的问题了。我对WinForm也几乎不了解,一个程序都没写过,只会拖控件,连如何布局都不会,我做的最多的还是ASP.NET方面的。

    Windows Live photo, mail、movie maker是用.net 3.5写的?

    我现在只装了Writer和Mail,都是.NET写的,clrver -all一下就可以看出来当前哪个进程用了什么CLR版本,比如我现在机器上(Expression的几个是特地打开的):

    3428    devev.exe               v4.0.30319
    4960    devev.exe               v4.0.30319
    5932    wlmail.exe              v2.0.50727
    5856    WindowsLiveWriter.exe   v2.0.50727
    1752    Blend.exe               v4.0.30319
    5496    Design.exe              v4.0.30319
    5136    Encoder.exe             v4.0.30319
    5036    ExpressionWeb.exe       v4.0.30319
    

    Expression本来就是用来表示WPF效果,自然不可能不用.net。

    Expression Studio包含很多东西了,比如Design,Web,Encoder之类的,它们的工作都和.NET无关,而且以前的微软这方面工具也都不是.NET的,因此可以说这些都是重写的新工具。而且,即便是Blend和Silverlight相关,它也不一定需要基于.NET开发,例如以前的Visual Studio不是.NET写的,不也用来开发.NET程序了吗?

    WPF、silverlinght其实现在学习的人并不多,这说明市场并没有这种程序的迫切需求。其实以后大部分可能会用html5,而性能要求高的大型程序就是C++了

    我忽然意识到现在都是在谈桌面应用。说到html 5的话,那就离不开服务器后端,这也是.NET的重要领域了。

  45. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-14 06:56:48

    live writer是收购的,我记得是C#开发的,

    mail我刚用云端装了一个,一启动就说日历破坏云云,不过我用spy++看了一下启动窗口,类名显示是DirectUIHwnd,应该不是.net的。

  46. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-14 07:08:24

    .net桌面应用的毛病就是响应速度问题,这也不是它一家的毛病,java也有这个毛病,所以java界有人用Flash来做界面与本地嵌入式web服务器交互。

    而.net的服务器端

    1. iis不像apache,ngix有各种选择余地和调优技巧
    2. asp .net架构有一些潜在的问题,比如说ASP.NET的Session会导致的性能问题
    3. 服务器端很多新技术都是基于开源平台的,在windows上的支持并不优先
    4. mono用的人太少,连.net官方版本都会遇到各种问题,而mono出了问题,你能问的人就很少。
  47. 老赵
    admin
    链接

    老赵 2010-07-14 07:36:26

    @mcpssx

    我装的是Window Live Wave 4 Beta,你试试看?我用clrver看不会有问题的。

    至于你对IIS和ASP.NET的评价都是最常见的FUD的调调,我懒得回应了。其实吧,IIS和ASP.NET这些东西的质量,要证明有证明,要评测有评测,要案例有案例,别人都可以用的爽歪歪。你用偏见去看,自然满眼都能看出一些似是而非问题,优点无视,鸡蛋里能挑出骨头,小缺点会不断放大,虽然对普通人来说都没什么大不了的。

    我昨天NDC视频的文章里不是也写了嘛,偏见实在体现不出水平来,只能体现出自身的狭隘,很没意思。

  48. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-14 08:40:53

    @老赵

    1、听说live wave4要vista之上,本人还在用xp。你不妨用spy++看看,是否mail是.net wpf的窗口

    2、iis和asp .net用的爽歪歪的,说实话,不多见,

    1)我见过电信机房里面,托管的windows服务器比linux的麻烦多了,要防范各种攻击。而机房里面的linux基本上是不需要管理的。

    2)你说的案例很多,我不知道是什么?你举几个用asp .net webform的网站看看?你这个blog网站会是webform做的?

    我倒不是说asp .net完全做不出来,而是说你花费的精力比用lamp要多得多,如果做成功,最后大都抛弃了微软的webform,sqldatasource之类的玩意,变成了一种强类型的asp模式。

  49. 老赵
    admin
    链接

    老赵 2010-07-14 09:44:03

    @mcpssx

    我经手的Windows服务器也从来不需要特别照顾,几年了,根本没有什么问题,比如别人说的几个月重启一次的……所以其实还是要看谁用,Windows容易用,不好好用的人也多,微软的东西大都这样。

    不用WebForm就不算用ASP.NET了?用ASP.NET MVC就比LAMP要难做的多?WebForm是给你一种增强,你觉得这种增强不需要,那么就别用,不会让你损失什么的,基于ASP.NET的核心架构写一个自己需要的Web模型是相当容易的,无需多少代码。此外,ASP.NET MVC不是强类型的ASP模式,这方面你网上随便搜一下就知道了。如果你认为它是ASP模式,那么PHP和Rails就是纯ASP模式了……除非又是WebForm这种从模型上提升一层的抽象。

    当然我始终认为WebForm不是个失败的产品,只是太容易用,因此少有人深入了解,于是用好的不多罢了。说到底别人最多说ViewState多,控制一下,也不麻烦。当然要深刻理解WebForm模型需要些时间和经验,如果你要精打细算的话——至于普通项目的快速开发就不需要了,WebForm不会有什么问题。

    这方面我就懒得多谈了,以前谈的太多了。

  50. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-15 00:21:00

    @老赵

    我经手的Windows服务器也从来不需要特别照顾,几年了,根本没有什么问题,比如别人说的几个月重启一次的……所以其实还是要看谁用,Windows容易用,不好好用的人也多,微软的东西大都这样。

    重要的是不是你经手的windows服务器能不能不需要特别照顾? 一个不是你经手的linux服务器和不是你经手的windows服务器放在电信机房里, 哪个会更安全?

    不用WebForm就不算用ASP.NET了?用ASP.NET MVC就比LAMP要难做的多?WebForm是给你一种增强,你觉得这种增强不需要,那么就别用,不会让你损失什么的,基于ASP.NET的核心架构写一个自己需要的Web模型是相当容易的,无需多少代码。

    1. MVC是什么时候才出来的?互联网等到今天黄花菜都凉了
    2. 我印象中MVC是从MonoRails过来的,而当年开发MonoRails因为批评微软的模型的被微软拒录了。
    3. MVC是否稳定了,你能确定吗?

    此外,ASP.NET MVC不是强类型的ASP模式,这方面你网上随便搜一下就知道了。如果你认为它是ASP模式,那么天下没有不ASP模式的Web框架了……除非又是WebForm这种从模型上提升一层的抽象。

    ASP.NET mvc其实已经抛弃了组件模型,又回到了html嵌入变量的时代。

    当然我始终认为WebForm不是个失败的产品,只是太容易用,因此少有人深入了解,于是用好的不多罢了。说到底别人最多说ViewState多,控制一下,也不麻烦。当然要深刻理解WebForm模型需要些时间和经验,如果你要精打细算的话——至于普通项目的快速开发就不需要了,WebForm不会有什么问题。

    控制一下不麻烦的话,那你这个Blog是用WebForm做的吗?你认为不会有问题的话,哪个大点的网站是用WebForm做的?微软自己有吗?

  51. 老赵
    admin
    链接

    老赵 2010-07-15 01:01:22

    @mcpssx

    重要的是不是你经手的windows服务器能不能不需要特别照顾?一个不是你经手的linux服务器和不是你经手的windows服务器放在电信机房里, 哪个会更安全?

    如果是同一个人的话,要么他搞不定Linux服务器并搞定一个安全性较差的Windows服务器,要么就是一样安全。安全性很多时候说白了也就是做几件普通的小事情而已。

    1. MVC是什么时候才出来的?互联网等到今天黄花菜都凉了
    2. 我印象中MVC是从MonoRails过来的,而当年开发MonoRails因为批评微软的模型的被微软拒录了。
    3. MVC是否稳定了,你能确定吗?
    1. 无所谓过去,你都期待着HTML 5这个标准和实现都不完整的东西,就见不得我说这个已经出来2年的框架?照你说WebForm如此糟糕,那么ASP.NET还是这么多人用?为什么大家就算不用WebForm也在用ASP.NET?而现在有了MVC你又觉得没价值,这不是偏见还能是什么。
    2. 拜托,同时给点证据要求不高吧,还真是爱怎么说就怎么说啊?我还听说(真听说)微软是想收购MonoRails结果对方不同意,于是自己做了,可惜我也没有直接证据。
    3. 纯正的FUD套路么,呵呵,也不见见别人怎么说。比如有多少人用过ASP.NET MVC了,你在怀疑之前为什么不去互联网上,比如Stack Overflow上搜索一番?对了,SO本身也是ASP.NET MVC做的。

    ASP.NET MVC其实已经抛弃了组件模型,又回到了html嵌入变量的时代。

    微软又没有放弃WebForm,提供了ASP.NET MVC和WebForm两种选择而已。而且事实上,在WebForm时也完全可以在需要的时候使用HTML嵌入变量的做法,而且MVC还是利用WebForm的组件模型,可见ASP.NET基础架构设计的多么好。

    WebForm组件模型的优点也很多,例如模型直观,快速开发,物理页面与请求直接对应(当然也可以做URL Rewrite),自动状态维护,光这点便节省了无数精力。还有它的复用性极好,甚至开启了一个第三方商业控件产业,还有哪个Web模型能做到这点?说到底还是只见缺点,放大缺点,但不见其优点了。

    控制一下不麻烦的话,那你这个Blog是用WebForm做的吗?你认为不会有问题的话,哪个大点的网站是用WebForm做的?微软自己有吗?

    我的Blog不是,但我又不是每个项目都用MVC做,两种模型都有适合不适合的应用。微软的WebForm网站太多了,内部系统不说(我也在微软呆过),最最常见的http://msdn.microsoft.comhttp://asp.nethttp://codeplex.com还有论坛等等都是WebForm做的。

    所以,我希望你能在说某些东西之前先简单调查一下,不要凭感觉信口开河。你也是高级技术人员了,但是这种讨论让我觉得实在没有意思。

  52. yemg
    60.191.246.*
    链接

    yemg 2010-07-15 01:57:44

    @mcpssx

    你认为WenForm很糟糕,只能应付一些小的项目,那你认为理想中的大型Web项目改采用什么技术做才是合适的呢?

  53. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-15 04:16:46

    @yemg

    LAMP吧

  54. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-15 04:20:38

    @老赵

    老赵你总是只说微软的优点, 那么微软WebForm有什么缺点,以至于你决定不使用WebForm开发你这个blog呢?

  55. billlo
    221.4.199.*
    链接

    billlo 2010-07-15 05:23:19

    @mcpssx

    有沒有個人blog可發個連接出來?

  56. 老赵
    admin
    链接

    老赵 2010-07-15 05:41:19

    @mcpssx: 老赵你总是只说微软的优点, 那么微软WebForm有什么缺点,以至于你决定不使用WebForm开发你这个blog呢?

    你这种话对我没有意义,因为我就是那种有好说好有坏说坏的人,比如我在说Java语言恶劣的同时,一直也在到处强调JVM的JIT优化做的比CLR彻底。还有说SQL Server贵,不适合普通互联网项目,在存储这段尽量使用*nix等等,包括不开源什么的。微软各种坏话我说的少么,要不是我觉得你对微软有偏见,我才不会说微软那么多好话,呵呵。

    我从来没说WebForm没有缺点,我上面还说可能要理解WebForm模型,要用好它需要更多学习,又被你忽略了?就我这个博客来说吧,WebForm对于我这种简单的页面,交互不多的网站作用不大,因为我不需要它来帮我保留状态,我只需要一个一个简单的独立的请求就行了。

  57. 链接

    陈梓瀚(vczh) 2010-07-15 06:36:20

    mcpssx这个论调就跟某些人自己控制不了C++就批评他复杂一样,毫无区别。学一个api很难吗?你觉得会了WinForm之后学WPF觉得太难,那不是你自己烂是什么。要是你觉得WPF容易但是又觉得太麻烦,以至于你最后WPF用的不好导致问题那么多(你看人家Expression Studio用WPF用得多好,也没见出了什么性能问题,我就用过它),那不是你学习态度不好是什么。lamp跟微软那套东西就有本质区别了?这不就是迷信吗?

    我倒是觉得java的那些个语法看起来很难受导致我不想去接近那套东西呢,虽然这是我的个人问题,不过话说回来现在电脑硬件这么强大,那点破性能的损失用我自己的功力来弥补就好了,.net的类库在我用起来(我经常开发WinForm程序,在C#上实现各种小型的编译器和虚拟机),从来就没有成为瓶颈过。

    你要是说一个SB用linux会比用windows安全,那也只能说他懂得知识太少碰不到不安全的地方。你要是说一个高手用linux会比用windows安全,那多半是他的学习态度有问题造成的。

  58. 链接

    陈梓瀚(vczh) 2010-07-15 06:37:33

    mcpssx如果你觉得学习新的东西一点都不爽,那就没什么话好说了。lamp的api是变得慢,那你尽管去用好了,也跟我没关系。

  59. yemg
    60.191.246.*
    链接

    yemg 2010-07-15 08:00:44

    @mcpssx

    美国国家广播公司(NBC)在直播2008北京奥运的时候选择的就是Smoothing Streaming,我想作为NBC这样的大公司在选择奥运直播技术的时候不会随随便便做选择,Smoothing Streaming作为视屏播放有它的优势和长处存在NBC才选择它,我并不认为微软的技术都一无是处。

  60. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-15 08:10:35

    @陈梓瀚(vczh) 2010-07-15 14:36:20

    mcpssx这个论调就跟某些人自己控制不了C++就批评他复杂一样,毫无区别。

    从C++的论调就可以看出来你用C++时间不长,你可以发现批评C++的人很多是10几年前就用C++的人。

    学一个api很难吗?你觉得会了WinForm之后学WPF觉得太难,那不是你自己烂是什么。

    学一个API当然不难,不过学习是需要时间的,而时间不是浪费在无意义的重复上的。

    如果很快的话,为什么直到今天博客园的头条还在从WPF基础讲起呢?现在silverlight都到4.0了吧?而wpf比silverlight更早出来吧?

    博客园每天都有一种hello、world的新写法。

    要是你觉得WPF容易但是又觉得太麻烦,以至于你最后WPF用的不好导致问题那么多(你看人家Expression Studio用WPF用得多好,也没见出了什么性能问题,我就用过它),那不是你学习态度不好是什么。lamp跟微软那套东西就有本质区别了?这不就是迷信吗?

    我告诉你吧,很多写Flash的以前还不是程序员出身呢,好的工具和语言是要隐藏问题的,比如说C++程序员用不着去谴责C#程序员不好好处理指针。

    我倒是觉得java的那些个语法看起来很难受导致我不想去接近那套东西呢,虽然这是我的个人问题,不过话说回来现在电脑硬件这么强大,那点破性能的损失用我自己的功力来弥补就好了,.net的类库在我用起来(我经常开发WinForm程序,在C#上实现各种小型的编译器和虚拟机),从来就没有成为瓶颈过。

    因为你的程序给你自己用,当然没问题了。你发布给广大用户看看。你总是拿一个技术人员的思维去想商业问题。

    你要是说一个SB用linux会比用windows安全,那也只能说他懂得知识太少碰不到不安全的地方。你要是说一个高手用linux会比用windows安全,那多半是他的学习态度有问题造成的。

    是啊,所以世界上要是都是你这样学习态度好,知识又很多的人那当然没问题了。

    不过问题就是世界并不完美,现状就是如此。

    改造社会重任恐怕只能落在你们的肩上了。

  61. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-15 08:14:33

    @陈梓瀚(vczh): 如果你觉得学习新的东西一点都不爽,那就没什么话好说了。lamp的api是变得慢,那你尽管去用好了,也跟我没关系。

    我想我说的很清楚了,你要把你的时间用在有意义的事情上,而不是学习狗熊掰玉米,最后只有一个玉米。

    你要研究ngix,couchdb,mongodb之类的,我是很赞成的。

    我就担心,有的人花了大量时间,只是学会了用win32, mfc, winform, wpf四种方法画出一个窗口来。

  62. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-15 08:25:52

    @yemg: 美国国家广播公司(NBC)在直播2008北京奥运的时候选择的就是Smoothing Streaming,我想作为NBC这样的大公司在选择奥运直播技术的时候不会随随便便做选择,Smoothing Streaming作为视屏播放有它的优势和长处存在NBC才选择它,我并不认为微软的技术都一无是处。

    1、我并没有说他一无是处,而是说你有更好的选择。比如说互联网界,你选择lamp体系明显比asp .net容易开发维护和扩展

    2、具体到你这个新闻,那你也应该知道NBC Drops Silverlight, Runs Back to Adobe for Flash

    NBC为何这么快过河拆桥?正如一位叫SAI的老兄所言,当四千万美国用 户访问 NBCOlympics.com时他们并没有安装有Silverlight,而互联网上98%的用户都预安装了Adobe的FlashPlayer,况且 Silverlight的直播质量并不理想,经常出现不断缓冲、断线的故障,用户体验下降,因而NBC并没有获得的预期效果,只能放弃

  63. 链接

    陈梓瀚(vczh) 2010-07-15 08:39:31

    @mcpssx

    这个我C++用的怎么样你去点我名字去看我的博客就知道了,不需要你来想象。那作为一个程序员,要求自己必须学习知识,你不能说是不对的把。反而你给理由自己说不需要持续学习,我认为才是不对的。话说回来,我们这里讨论的是.net的问题,用户才不管你那玩意儿是java还是.net呢,管得是你的功力好不好,最终能不能把你手上的语言也好类库也好给用好了,给出一个好的程序出来。因此这里不适合用“技术思维”来反驳“用户”观点。

    有意义的事情是很难衡量的,为啥学ngix就比学winform强呢?这是毫无道理的。难道GUI就不需要高手去做吗?用户看到的可是GUI而不是你背后用了什么B+树的算法,用户的观点就是你慢一点我可以忍GUI不能卡,那归根结底这根类库的性能的关系就不大了,变成你能不能处理好GUI的事情了(那些在WinForm上自动生成一千多个Label然后就怪.net性能不好的人我也不知道这是怎么想的,我前几天还google到了这贴子)。当然性能我不否认他是重要的,不过这根你用java也好用.net也好毫无关系,算法不好,怪谁呢?那为什么那么多人用Visual Studio怪他界面慢,而不赞扬他C#的编译器快呢?话说回来C#的编译器还真是比得上当年Delphi的编译速度的,那么强大的技术,被Visual Studio不能运行在烂PC上(编译器还能高速运行在烂PC上的)不就掩盖掉了吗?究竟是谁在用技术的观点来看问题呢。

    要求工具好到你可以不需要学习就升级那是毫无道理的,那为啥有了DOS统治了PC好几年之后,Macintosh和Windows和Ubuntu会大行其道,难道不是完全改变了观念让你去学习你才能跟得上世界的步伐吗?完全是因为懒嘛,没啥好说的。

    学习是义务,不管你觉得啥必须学有啥不必须学,你靠API啥都干的出来,就是开发效率慢。显然自己开发、或者学习别人开发出来的、可以在你熟练掌握之后提高开发效率的工具是必需的。而且工具不需要给那些只会点皮毛的人用得爽。

  64. 链接

    陈梓瀚(vczh) 2010-07-15 08:40:19

    我就担心,有的人花了大量时间,只是学会了用win32, mfc, winform, wpf四种方法画出一个窗口来。

    具体到这个问题,只能怪那个人智商太低,怪不了微软

  65. 老赵
    admin
    链接

    老赵 2010-07-15 08:40:25

    @mcpssx: 什么直到今天博客园的头条还在从WPF基础讲起呢?现在silverlight都到4.0了吧?博客园每天都有一种hello、world的新写法。

    有些话我一直懒得说,但是你一直重复,那么我也就说了吧。

    如果你真关注博客园的话,你就会知道初学者们很多,他们只能从新东西学起,于是可以兴冲冲地写出文章来,他们的文章内容都是一样的,不是所谓“Hello World”的新写法,都是同一种写法。这个状态在任何技术社区都一样,你去搜索一个话题,都有无数初学者反复写反复问,这和技术本身是什么样的无关。

  66. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-15 09:11:31

    @陈梓瀚(vczh)

    这个我C++用的怎么样你去点我名字去看我的博客就知道了,不需要你来想象。那作为一个程序员,要求自己必须学习知识,你不能说是不对的把。反而你给理由自己说不需要持续学习,我认为才是不对的。话说回来,我们这里讨论的是.net的问题,用户才不管你那玩意儿是java还是.net呢,管得是你的功力好不好,最终能不能把你手上的语言也好类库也好给用好了,给出一个好的程序出来。因此这里不适合用“技术思维”来反驳“用户”观点。

    工具和语言都是为程序员服务的,人的时间最宝贵,而不是反过来你去适应某种语言。 C++语言的心智包袱问题,不是一个人在说,说这话的人更不是因为不爱学习,而是说C++的某些缺陷不符合人性。

    有意义的事情是很难衡量的,为啥学ngix就比学winform强呢?这是毫无道理的。难道GUI就不需要高手去做吗?

    1. 因为现在已经进入WEB时代了
    2. 我针对的是重复学习,没有连续性,比如说从winform->wpf,qt和gtk++引入动画功能,界面描述都是无缝升级的。

    用户看到的可是GUI而不是你背后用了什么B+树的算法,用户的观点就是你慢一点我可以忍GUI不能卡,那归根结底这根类库的性能的关系就不大了,变成你能不能处理好GUI的事情了(那些在WinForm上自动生成一千多个Label然后就怪.net性能不好的人我也不知道这是怎么想的,我前几天还google到了这贴子)。当然性能我不否认他是重要的,

    这个问题我已经举个例子了,比如说evernote有c++版本, wpf版本和web版本,你可以都试一下,就知道慢并不是你举得这种极端例子才有。

    不过这根你用java也好用.net也好毫无关系,算法不好,怪谁呢?那为什么那么多人用Visual Studio怪他界面慢,而不赞扬他C#的编译器快呢?话说回来C#的编译器还真是比得上当年Delphi的编译速度的,那么强大的技术,被Visual Studio不能运行在烂PC上(编译器还能高速运行在烂PC上的)不就掩盖掉了吗?究竟是谁在用技术的观点来看问题呢。

    1. 因为C#编译器现在还是C++写的,不过据anders说,下次要改到C#给大家调用
    2. 你用borland产品当年是什么内存的机器?

    要求工具好到你可以不需要学习就升级那是毫无道理的,那为啥有了DOS统治了PC好几年之后,Macintosh和Windows和Ubuntu会大行其道,难道不是完全改变了观念让你去学习你才能跟得上世界的步伐吗?完全是因为懒嘛,没啥好说的。

    我这么说了吗?我只是告诉你要减少不必要的学习。

    比如说Qt也引入动画框架,特效效果,ui的json表示,也没有把创建窗口的api都变成另一套吧。

  67. 老赵
    admin
    链接

    老赵 2010-07-15 09:18:00

    @mcpssx: 因为C#编译器现在还是C++写的,不过据anders说,下次要改到C#给大家调用

    呵呵,我就问一句:你认为C#编译器速度快,是因为它是用C++写的吗?

  68. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-15 09:18:22

    @陈梓瀚(vczh): 具体到这个问题,只能怪那个人智商太低,怪不了微软

    我看了一下你的博客,原来你是写那个脚本语言的,这就难怪说话很牛了

    1、不是每个人都有你的智商的,希望你不要总是从技术人员个人英雄角度来看问题,而是要从商业的、项目合作的角度看问题。

    2、智商太高的人时间也是有价值的。比如说你当初是学GTK+的,现在你要用Clutter来实现类似WPF的效果,你会发现你10几年前学习画窗口的代码还是可以拷贝到新程序中来的。

    相反,如果为了画一个窗口,今天是CreateWindow,明天是CreateForm,后天又变成WindowCreate,你掌握了这三种API,记住了三种参数,有什么意义吗?

  69. 链接

    陈梓瀚(vczh) 2010-07-15 09:37:30

    @mcpssx

    当然事实上来说,C#编译器速度快完全是因为C#语法设计得好,而不是因为它是C++写的。你对比一下C++写的C++编译器……

    更好的工具,总是会让我们在【测试】上、【维护】上以及【开发】上达到一个更高的效率层次的,那你说值不值得花时间去看呢?至于说qt和WinForm的问题,你要是从WinForm的接口上看那完全是可以无缝插入动画什么的的,至于为什么不那么做,显然是因为WPF这一套新的东西有完全新的UI Automation Interface支持(这个对盲人和残疾人,和测试都十分有用,但是WinForm的控件分类和概念都不合适),有一套新的描述(便于UX跟程序猿分离,这个已经在我们公司里面实践过了,完全可行),等等。对于开发人员来说,为了让你的程序更加可以测试,更加可以让UX和代码分离,因此修改了开发工具(VisualStudio里面),完全是说的过去的。那你想享受这些待遇是不是也稍微学习一下就行呢?WPF到WinForm说到底也就是函数名变了一下,大部分的用法还都是差不多的(除了template和动画),如果你纯代码创建他们的话基本不会感觉到有什么区别。所以我不觉得WinForm到WPF会有多么不可逾越的鸿沟。相反qt无缝插入之后会不会受到局限性我就不知道了,因为我没碰过。

  70. 老赵
    admin
    链接

    老赵 2010-07-15 09:44:25

    @陈梓瀚(vczh): 当然事实上来说,C#编译器速度快完全是因为C#语法设计得好,而不是因为它是C++写的。你对比一下C++写的C++编译器……

    当然客观地说,C#编译器做的事情比C++要少,例如很多事情都交给JIT去做了,呵呵。

  71. vczh
    58.38.53.*
    链接

    vczh 2010-07-15 11:27:29

    我一直没办法在你这里用windows live登陆,修一下。

  72. 为了梦想
    123.134.4.*
    链接

    为了梦想 2010-07-15 12:42:47

    看评论比看文章学东西多,我只是个看评论的

  73. 老赵
    admin
    链接

    老赵 2010-07-15 13:04:55

    @vczh

    什么环境?什么错误?其他登陆方式可以吗?

  74. mcpssx
    113.57.86.*
    链接

    mcpssx 2010-07-15 14:51:33

    @vczh

    Qt也是ux和代码分离的。比如说绘制一个长方体在窗口中移动:

    Rectangle {
        width: 300;height: 200
        Rectangle {
            id:page; width:50; height:50
            x:0; y:100; color:”red”
    
            PropertyAnimation on x { to:100; duration:1000 }
        }
    }
    

    这并不影响Qt继承以前的架构。

  75. mcpssx
    113.57.86.*
    链接

    mcpssx 2010-07-15 14:58:32

    @billlo

    我还真没写过个人的技术博客

  76. mcpssx
    113.57.86.*
    链接

    mcpssx 2010-07-15 15:04:19

    @老赵: 呵呵,我就问一句:你认为C#编译器速度快,是因为它是用C++写的吗?

    1. 我个人认为应该也有语法比C++简单的因素吧。就是用C++也达不到borland程度的,以前我在64M内存用borland产品也很快,估计以后C#的编译器速度和javac差不多数量级。
    2. 其实我印象中Vs中C#编译器并不是最快的,我记得以前vb .net编译器是可以即时编译的,而C#是没有做到的。
    3. 顺便指出一点,scala编译是很慢的,特别是文件多了以后。
  77. mcpssx
    113.57.86.*
    链接

    mcpssx 2010-07-15 15:17:34

    @陈梓瀚(vczh): 所以我不觉得WinForm到WPF会有多么不可逾越的鸿沟。相反qt无缝插入之后会不会受到局限性我就不知道了,因为我没碰过。

    其实最怕恰恰这种不是不可逾越但是很无聊的鸿沟,

    从Sql到NoSql变动很大,但是很有意义,值得学习。相反把printf改名叫putf,意义就不大了,你写个hello,world,自然无所谓了,问题是加入你已经写了几万行vb6代码,过几天为了加入新功能要改成winform,再过几天为了酷一点又要改成WPF的,那能受得了吗?

    既然你是C++高手,其实Qt更适合你,autodesk的专业动画工具maya都迁移到了Qt上了,不可能满足不了你的需求,但性能绝对大大提高。

  78. yemg
    60.191.246.*
    链接

    yemg 2010-07-16 03:32:17

    @mcpssx: 问题是加入你已经写了几万行vb6代码,过几天为了加入新功能要改成winform,再过几天为了酷一点又要改成WPF的,那能受得了吗?

    问题是VB也好,C#也好,C++也好,代码已经有几万行了,变成酷一点的WPF,几万行代码推到重新来过谁也受不了,我不知道这里语言选择的问题造成还是软件工程问题造成。

  79. 链接

    陈梓瀚(vczh) 2010-07-16 03:43:37

    @yemg

    这个问题嘛,推倒重来也不是不行,你看VS2010不就重做成了WPF了吗。

    @mcpssx

    Qt不是不好,但是开发复杂界面的时候没有GC实在是受不了啊(你知道Control.Tag+GC是多么的重要,而且C++没有最终根类,因此Qt没办法有这个特性),所以这就是为什么我喜欢用C# + Managed C++ + Native C++一起开发的原因了。但是开发逻辑(就算是编译器)部分有没有GC都无所谓,因为一切的数据结构只有到了GUI之后,才会变得错综复杂起来。而且我也开发过虽然功能不是很强大,但至少也能用得GUI Framework,有API封装版本,也有全盘基于OpenGL重绘的版本,最后还是因为C#的语法更加适合写GUI而从C++做GUI转到C#做GUI了。

    @老赵

    我用的是Vista(64) + IE7,我没有其他帐号,不过看样子其他帐号是可以的,因为Windows Live不是登陆不了,而是打开那个登录网页的时候连输入的文本框都没显示出来。

  80. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-16 03:50:13

    @yemg: 问题是VB也好,C#也好,C++也好,代码已经有几万行了,变成酷一点的WPF,几万行代码推到重新来过谁也受不了,我不知道这里语言选择的问题造成还是软件工程问题造成。

    举几个例子

    1. 动网论坛当年是ASP的,与dicuz是同时起步的两大巨头,现在动网只能改用php重写。中国互联网以前asp是占据了半壁江山的,然而现在那个时代的博客,论坛、全站程序很少有能转移到了.net的。
    2. Microstratge报表工具的设计器,是用VB6写的,现在真么办?你能用软件工程解决吗?

    这其中起决定因素的就是微软开发工具和语言的延续性问题。如果只是用各种语言写几个hello,world自然无所谓了。

  81. 链接

    陈梓瀚(vczh) 2010-07-16 07:22:10

    @mcpssx

    延续性显然不是问题,现在VB6和VC6和.net 1.1仍然可以开发服务器,调用API,写GUI,只要你愿意用就行了。要是是因为你自己不愿意用,怎么能怪软件的延续性呢?Vista刚发行的时候,还得为VB6打补丁呢。

  82. 链接

    陈梓瀚(vczh) 2010-07-16 07:26:28

    @mcpxxs

    退一步讲,微软对于商业软件的【任何一个版本】的维护政策【一般】都是10年,这个不够吗?

    换句话说,如果你调用的每一个API都是按照正确的方法来进行,那哪怕过了10年程序还都是好用的。一般来说操作系统带来的兼容性问题都是你开发软件的时候依赖了Bug导致的,我几乎没有见到过哪个API对于【正确的使用方法】有breaking change。而且PE也没改,浏览器也是向下兼容的,IIS也是(Apache更是),那哪来的延续性呢,显然只能因为新的程序猿没学过太旧的工具吗,你可以让他们学,也可以招那些学过的,这个随你。

  83. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-16 08:58:11

    @陈梓瀚(vczh): 延续性显然不是问题,现在VB6和VC6和.net 1.1仍然可以开发服务器,调用API,写GUI,只要你愿意用就行了。要是是因为你自己不愿意用,怎么能怪软件的延续性呢?Vista刚发行的时候,还得为VB6打补丁呢。

    VB4程序也能跑,那你VB6时代真么不用VB4呢?

    你现在用的C++编译器,真么不用Visual C++ 4.0呢?

    Foxbase也能跑,你现在还会去继续升级Foxbase程序加功能?

  84. 链接

    陈梓瀚(vczh) 2010-07-16 09:17:02

    @mcpssx

    因为我相信大公司维护工具比我维护自己代码来的更可靠,所以我会持续更新最新版——如果他真的有breaking change了,那我一定会改变自己的代码的,因为那显然是开发的更好的方法。因此对于那些懒得改代码的人,显然没人阻止他非得升级不可,因此“没有延续性”也就无从谈起了。

    就如同VC6来讲,VC6的延续性真是无可匹敌啊,就算微软不干了,社会上还有一大堆的人在研究如何让VC6编译出来的程序可以运行在最新版的Windows上,虽然兼容性大部分还是微软负责的,而且跟之前的讨论一样,发生不兼容,要么就是用户的缺省权限降低了,要么就是软件依赖了Bug,总之很少是操作系统自身的错误。我认为现在还坚持用VC6不肯放弃的公司是在自取灭亡——如果他开发的东西是运行在PC上面的。

    但是版本升级跟延续性那完全是两回事。就如同C#,你从2.0升级到3.5基本没有开发和部署代价,那死抱着2.0不放跟延续性是完全没有关系的——只能说那是你自己的决定。你说C#的生命力长吗?那1.1的生命力不长能说明C#延续性不好吗?

    不要混淆视听。

  85. 链接

    陈梓瀚(vczh) 2010-07-16 09:18:15

    @mcpssx

    至于我为什么提到VC6和VB6,那是因为这两款软件可以视为“绝版”了。

  86. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-16 09:25:34

    @陈梓瀚(vczh): 退一步讲,微软对于商业软件的【任何一个版本】的维护政策【一般】都是10年,这个不够吗?

    维护某个版本和变换大架构是两回事,如果你说的是维护VC 4.0 10年,那自然够了,反之,如果VC的框架1.0是MFC,3.0变成了OWL,5.0又变成Cocoa,每个框架都宣布会维护10年,那是绝对不够的。

    换句话说,如果你调用的每一个API都是按照正确的方法来进行,那哪怕过了10年程序还都是好用的。一般来说操作系统带来的兼容性问题都是你开发软件的时候依赖了Bug导致的,我几乎没有见到过哪个API对于【正确的使用方法】有breaking change。而且PE也没改,浏览器也是向下兼容的,IIS也是(Apache更是),那哪来的延续性呢,显然只能因为新的程序猿没学过太旧的工具吗,你可以让他们学,也可以招那些学过的,这个随你。

    1. 软件是要升级的,Foxbase现在也能用,你还能用Foxbase开发新功能继续跟其他厂商竞争?你自然要把全部代码改写。
    2. 你想过没有,浏览器其实也是一种界面,html也是一种xaml,为什么浏览器能兼容?

    因为浏览器不是微软一家控制的。微软向下兼容是不得已,微软创造了很多东西,就是试图不兼容,比如说ie浏览器支持vbscript,再比如说xaml浏览器程序。

    你反复强调的就是要学新的,这就是我说的为什么微软程序员不停在写hello,world,你没有考虑到程序产品最重要的是历史的积累。

    我就举blog程序的例子,wordpress写了多少年?7-8年,这就是wordpress成功的秘密之一。相反,你用asp写了2年,改用WebForm写,过几天又用MVC写,中间你加用了匿名函数,linq等各种先进技术,结果最后被别人甩了一大截。

  87. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-16 09:37:18

    @陈梓瀚(vczh): 因为我相信大公司维护工具比我维护自己代码来的更可靠,所以我会持续更新最新版——如果他真的有breaking change了,那我一定会改变自己的代码的,因为那显然是开发的更好的方法。因此对于那些懒得改代码的人,显然没人阻止他非得升级不可,因此“没有延续性”也就无从谈起了。

    1. 那是因为的你的代码都不大,我推测你是一个人在写代码。
    2. 就算你的代码代价不大也是有时间的,而你始终把自己的劳动力成本不算钱。

    人家的不用改,你觉得无所谓,是因为你没有算自己的时间价值。

    你觉得是Breaking Change,那是因为你没有了解到其实是不用做如此大的改动的。

    你看html也是界面,没有说不兼容前面的吧?

  88. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-16 09:41:10

    @陈梓瀚(vczh): 但是版本升级跟延续性那完全是两回事。就如同C#,你从2.0升级到3.5基本没有开发和部署代价,那死抱着2.0不放跟延续性是完全没有关系的——只能说那是你自己的决定。你说C#的生命力长吗?那1.1的生命力不长能说明C#延续性不好吗?

    我说的是框架,C++延续性好吧?VC 1.0用MFC,2.0用OWL,3.0用wx,4.0用Qt,你觉得延续性好不好?

    我一直说的是,Qt,GTK+都引入了动画框架,特效效果,ui的分离,并不需要连创建窗口的方法都要重写。

  89. 链接

    陈梓瀚(vczh) 2010-07-16 09:47:49

    @mcpssx

    html这个就很纠结了,很多人抱怨IE6不够标准以至于他们要专门为IE6写代码,然后IE7变得更加标准了,让原先给IE6写的代码就不管用了,那你说IE7是应该变标准呢还是保持原状呢?(前提:IE6那会儿标准不成熟,基本不能责怪IE6干嘛干嘛,就如同VC6不标准一样,VC6比标准还来得早)

    我说的不是自己的代码,我们公司的代码也一样,以前用managed C++写了一个超大的程序,于是换成了最新的C++/CLI,语法都变了,那还不是得写。谁说劳动不算钱,但是你要看到你多年以后的【劳动总和】,而不能看你【当前项目的劳动】。我想程序猿不考虑一下以后别的程序猿维护的成本也是不负责任的。

    所以你那两个理由完全不是理由。至于说“本来不用做这么大的改变”,那仅仅是在你项目的角度上出发,而不是所有使用该工具的人的角度上出发的。难道犯了错误就一定要在无穷多的后续版本上保持这个错误吗(参考Unix痛恨者手册)?

    当然语法是一个问题,语言大幅度修改语法的情况是很少见的,目前只有在C++/CLI和python 3000上看到。但是错误嘛,无论你是不是依赖了这个错误,那既然你换到了新版本,你肯定要检查一下你以前所依赖的错误是不是还在。如果你没做这个打算,那就证明你当时决定依赖这个错误的做法就是不正确的。譬如说Windows的某些很旧的版本,free掉的指针还是能用的,你就不能做这个假设说,后续的所有版本,free掉的指针还能用。对于Windows来说,他完全没有责任保证你free掉的指针的行为,显然是程序员应该保证自己不要用free掉的指针。那因此造成的不兼容,你怪操作系统,还是怪开发软件的人啊?用户显然会怪操作系统,因此Windows为了让那个程序可以运行,为它保留了一份旧的内核代码以遍模拟这个bug,然后对新的软件严格要求。话扯远了。

    团队才是衡量成本的最小单位,而不是一个两个会跳槽的人。

  90. 链接

    陈梓瀚(vczh) 2010-07-16 09:50:40

    @mcpssx

    而且具体到managed C++的那个问题,显然managed C++的语法设计的不是很成熟,所以下一个版本重新打造也就成为了必然。但是作为一个程序员,你决定要把你的代码建立在一个还不成熟的语言上面,显然是你自己的责任了,导致后面要重写。当然有时候也是迫于其他原因才让你做这个决定的,因此这个时候就要给未来留出时间以便处理这种问题。那你说为什么不用一个成熟的语言呢——原因只有一个,这个项目不适合它。

  91. tang
    119.19.6.*
    链接

    tang 2010-11-17 06:30:39

    看到老程序员们争论这个问题,小弟觉得没必要,你在java领域当然说java好,在.net领域说.net领域好,我认为java的设计思想好,mcpssx说java比.net快,这不对吧,尤其是.net2.0后,.net的出的新东西应该领先于java,我觉得java的程序员一开始就是有色眼镜看微软的东西,说winform或wpf没vb快,没vb感觉好,这些应该不是老程序员说的话吧。.net开源资源确实不多,微软产品自己能选择不多,这当然是不爽的事,mysql收费了,jvm好像也出商业版本了,替java可惜!

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我