代码之家  ›  专栏  ›  技术社区  ›  Stu Mackellar

声明性ui语言(比如xaml和qml)的实际好处是什么?

  •  18
  • Stu Mackellar  · 技术社区  · 14 年前

    我正在评估 QtQuick (Qt用户界面创建工具包),将作为Qt4.7的一部分发布。 QML 是qtquick背后基于javascript的声明性语言。

    这似乎是一个非常强大的概念,但我想知道是否有人已经广泛使用了其他更成熟的声明性ui语言,比如 XAML 在wpf或silverlight中,可以深入了解从这种编程风格中获得的实际好处。人们经常提到各种好处:

    • 发展速度
    • 迫使表达和逻辑分离
    • 更好地集成编码器和设计器
    • 用户界面更改不需要重新编译

    还有,有什么缺点吗?一些潜在的关注领域浮现在脑海中:

    • 执行速度
    • 内存使用
    • 增加了复杂性

    还有其他需要考虑的因素吗?

    4 回复  |  直到 13 年前
        1
  •  13
  •   Tigraine    14 年前

    (更新)

    对xaml的误解是它没有编译。它实际上被编译为baml一个二进制的预标记xaml。显然有一个编译过的xaml版本也叫做caml。手术医生指给我看的 good article 解释什么是xaml/baml和caml。

    不管怎样,对于为什么要使用它的问题:

    xaml只是c对象的序列化格式,它特别适合描述分层对象结构,如wpf gui中的那样。

    wpf帮你做的是写一些不那么枯燥的c代码,比如:

    var grid = new Grid();
    grid.Content.add(new TextBlock() {Text = "Hello"});
    grid.Content.add(new TextBlock() {Text = "World"});
    

    用一种更易懂的方式来表达:

    <Grid>
      <TextBlock Text="Hello">
      <TextBlock Text="World">
    </Grid>
    

    由于wpf对象嵌套(将东西放在其他对象中)可以变得非常深入,因此wpf比生成的c代码更易于阅读。

    至于关注点的分离:xaml也有帮助,因为它只允许您表达对象及其关系/属性,而不是逻辑。这迫使您将逻辑与ui布局分离。mvvm模式非常适合这个任务,并且允许eay可测试性和可互换视图。

    在xaml中增加的复杂性也很容易被忽略,因为c中相同的代码比xaml标记更容易变得复杂。

    但我不能给你任何关于qtquick的信息。对不起的

        2
  •  8
  •   Ahmad Mushtaq    14 年前

    QtQuick是可扩展的,通过C++插件,实际上QT家伙重新评论的是,你在QtQueQ/QML中做UI、动画、转换等,而你的所有业务逻辑都是在C++/QT中。这样,你可以从两个世界中得到最好的结果,你可以像通常一样调试你的C++代码,同时让UIS变得不费吹灰之力,非常容易。

    另外,qtquick/xaml的另一个重要思想是它们是硬件加速的,因此例如,您可以不费吹灰之力就获得非常好的fps。所以他们一点也不迟钝。

    它节省时间,所以很多时间。我用3天的时间做了一个带代码的ui,用2小时的时间在qml中做了同样的事情。

        3
  •  7
  •   Michael    14 年前

    声明式编码(即wpf或qtquick)的目的是在开发人员和实现应用程序视觉方面的艺术家之间提供一个分隔。关于wpf,我发现调试变得有点困难。在我们发言时,我正在编译最新的qt以查看qtquick。(这需要很长时间,我有时间看看stackoverflow:—))所以,我还没有对此发表意见。

        4
  •  6
  •   S.M.Mousavi    13 年前

    qml/xaml是:

    • 非常适合mvvm模式
    • 硬件加速(QML使用OpenGL for Windows、Mac、Linux和电话操作系统…使用DirectX for Windows及其手机版本的Xaml)
    • 更接近艺术家
    • 您可以使用xaml/qml创建一个优秀的ui
    • 更容易的ui实现
    • 很好的动画是可能的
    • 在xaml中,通常只需稍作更改就可以创建应用程序的silverlight版本。
    • 在xaml中,有一些很好的特性,如模板、触发器(datatrigger、触发器、eventtrigger)、绑定(在任何一边,也在两边一起)、资源、命令、dependencProperty和可通知属性。

    但是请注意在xaml中:(我是一个xaml程序员,因此我没有qml的点)

    • 无法进行xaml调试
    • 对于xaml中的任何更改,必须重新编译所有程序
    • 表演时要更加小心。例如,如果在xaml中使用许多routed命令,则应用程序将无法使用!

    • 在xaml中,有些功能不能按预期工作。不幸的是有一些诡计。(应该很清楚……应该按预期工作…不是吗?)

    • 注意一些类似的名称空间,如bitmapeffect和effect。有不同的功能和成本。(例如,bitmapeffect在软件渲染中有一些效果,而在硬件渲染中有一些效果)

    • 在现实世界中,艺术家不能使用wpf作为flash(至少在表现良好的情况下)。

    • 一些特色在特殊的地方发挥作用。例如,datatrigger只在样式标记中工作,而不在资源节中。

    • xaml中存在一些弱点。一些例子:没有任何顺序动画…你不能用xaml做任何计算(你必须用c写一个转换器,即使是很小的工作量也不行!javasript是qml中一个很好的替代品。有些属性是重复的。X:名字和名字…从viewmodel控制视图不清楚。例如,从viewmodel关闭视图(您需要一些代码隐藏)

    • 太多运行时错误。如果在错误的地方使用一些标记,它会注意到语法错误,但许多错误只是在运行时发生的。例如,如果我将ColorAnimation的background属性(而不是background.color)作为目标,它将成功编译,但在运行动画时…碰撞。。。运行时错误!!!!在这种情况下,在表达式混合,应用程序将崩溃!!!!