看到最近围绕 Dart 的所有炒作以及对某些替代方案的仇恨和不尊重,尽管从一开始就设计得更好,这是非常有趣的。
在这篇文章中,我将尝试向您展示,如果您认为 Dart 是一种与 Flutter 一起征服世界的神奇语言,那么您的幻想是多么幻灭。 我会读一些非常蹩脚的引言,而且常常让我开始烦恼。 我想向您展示 Dart 是一个完美的例子,它展示了软件工程师如何受到营销的影响,就像普通消费者如何受到新 iPhone 广告的影响一样。
这可能是所有虚假陈述中最奇怪的一个! 客户端优化实际上意味着什么?
原来是:
现在看起来像这样:
这就是它“针对客户优化”的原因? 好吧,你猜怎么着,Dart 于 2011 年推出,“new”关键字在 2018 年成为可选。我猜这 7 年里它都不是“客户端优化”的?
哦,现在。 所有这些默认格式化程序将使其看起来像这样:
设计精美且简洁的语言不应该需要默认的格式化工具来使代码可读。 Flutter 代码看起来仍然很丑,并不是因为它不好,而是因为 Dart 无法让它看起来更好。
Swift 于 2014 年推出,Kotlin 于 2011 年推出,他们从一开始就没有新的声明。 事实上,如果你不在堆中创建对象,即使现在像 CPP 这样可怕的语言也不需要它。 Dart 拥有这些只是因为它是糟糕的 JavaScript 和具有“HipsterScript”风格的 Java Frankenstein,比如对私有成员使用下划线。
在数组内添加条件的能力不是一项功能,而是解决不可读的 Flutter 源的必要条件,这些源也是几年前才引入的。 语言在什么时候真正变得“针对客户优化”?
编译速度快? 孤立的线程? 我想 Flutter 应该是用 Golang 构建的。
我要再说一遍——Dart 并不比任何其他语言更适合客户,其他一切都只是营销。
下面这段话摘自官网,不过这一段特别搞笑:
语言是由其技术范围来定义的——开发过程中做出的选择决定了语言的功能和优势。 Dart 专为特别适合客户端开发的技术包络而设计,优先考虑跨各种编译目标(Web、移动和桌面)的开发(亚秒级有状态热重载)和高质量生产体验。
我认为,语言设计,其实是Dart最大的问题。 正如我在 Dart 推出时提到的,它是 Java 和当时流行的其他语言的奇怪混合体。 这并不是要根据过去的知识创建一种新语言,而是试图让某些东西变得流行。 让我们来看看其中的一些:
Dart 最初确实是一种动态类型语言。 如今,我们从各个角落都能听到“快速AOT语言”,但当年,“动态”才是趋势! 您可以使用类型,但它们类似于 TypeScript 中的类型(主要用于 IDE 和 linter),具有在运行时测试的完全动态类型。
因此,那些喜欢使用动态语言的人不需要这些“可选”类型,而那些习惯了 Java 的人只是继续使用它。
谁会为了继续使用语言而从根本上改变它?! 我们花费了数年时间才将动态语言变成静态语言!
当时,Google 在各种应用程序中广泛使用 Java,并且从未停止尝试通过 Java 到 JavaScript 编译将其引入网络。 Dart 作为一种语言,本质上是 Java 的一个较小的子集,但 Google 的目标是将流行的功能融入其中。 然而,公平地说,他们选择了一些颇有争议的:
正如我之前提到的,“动态”是当时的趋势,尤其是在 Web 上,这是 Dart 最初的目标平台。 每当他们意识到 JavaScript/CoffeeScript 和 Java 开发人员都不愿意使用动态 Java 变体时,他们就会不断引入另一个独特命名的类型系统。 我不记得之前的迭代了,但现在稳健才是王道!
使类成员以“_”开头为私有。 这个其实我最喜欢了! 当时 CoffeeScript 很快就流行起来了。 我不记得他们在哪里借用它,但要创建私有变量或方法,您将在名称中添加“_”前缀。 哦,当时每个人都痴迷于使源代码尽可能小。 我不得不说,对于小脚本来说,它的效果非常好。 Dart 也想变得时尚。 像 private、protected 和 public 这样的访问修饰符太多了,所以我们会说 protected 成员不好,而 private 成员将从“_”开始。 这就是为什么我们有这些非常疯狂的结构,例如:- methodName — public- _methodName — private- @protected methodName - protected
是的,因为 Java 注释对于时髦的语言来说也太复杂了。 所以现在,虽然你不能自己编写,但你不断地使用“@protected”、“@required”和其他一些。 您还抱怨 PHP 不一致。
JavaScript 是在几天内编写的,所以我原谅它的许多架构决策。 在 C++ 中,您可以控制内存并选择在堆栈或堆中分配内存的位置,这就是您要使用 new 关键字的原因。 Java 只有类和其他所有内容,并且对于对象是在堆栈还是堆上创建也非常明确。 但在 Flatter 中,您现在可以使用可选的新关键字创建实例,但其特殊的 GC 有特殊的机制来避免 GC 峰值,而不像您有其他选择。 再说一次,考虑到 Java 的年龄,我会原谅它,但对于 Dart,它只是纯粹语言设计的另一个证据,或者更好地说是复制另一种语言的纯粹尝试。
多年来,我们已经意识到,在变量或方法后面包含类型可以更好地保持一致性,并且可以很好地进行类型推断。 例如,通过声明 let a: int = func() ,您明确声明您需要此变量作为整数,并且如果该函数返回其他内容,您将在编译期间捕获该错误。 但如果你想从函数中推断变量类型,你可以简单地写成let a = func()。 这种方法保持了一致性,并且您继续使用“let”作为声明变量的方式。 Java、C 或 C++ 等语言是在编程学科仍处于起步阶段时创建的,硬件速度太慢,无法将整个源代码树保留在内存中以提供类型推断等功能。 因此,这些语言受制于当前的语法,导致不一致,例如当您希望类型明确时 int a = func() 或 auto a = func() 否则。那么 Dart 呢? 一如既往,它遵循相同的模式! Dart 本质上复制了 Java,现在它也有同样的不一致:var a = func() — 我们假装是 JavaScriptint a = func() — 而现在我们是 Java 即使您将在类方法的函数体中采用 var 仍然必须从类型声明开始。 哦,我可以继续前进
反思很好,让我们添加那些! Ops,它似乎对于静态语言和 AOT 没有那么有用——删除它们!
Dart 是一种纯粹设计的语言,其驱动不是出于实际原因,而是为了吸引 WEB 和现在的移动开发人员。 您知道他们试图将自己与 Node.js 对应吗?
没有其他语言像 Dart 那样变异得如此之多,因为它背后的公司对其投入了太多。
你抱怨 C# 吗? 但凭借近年来他们添加的所有这些功能,他们保持了 100% 的向后兼容性。 它的设计决策(例如基于堆栈的结构和基于堆的类)已迁移到 Swift,并且很快将通过 Valhalla 项目登陆 Java 世界。
Swift 和 Kolin 引入了令人惊叹的 DSL 功能,使您无需预处理器即可编写真正的 UI 优化代码:
Rust 引入了独特的所有权模型,而 Golang 让语言极简主义和快速编译重新流行起来,更不用说类 C 语言中的绿色线程了。
但达特呢? 除了快速编译之外(考虑到 Dart 最初的目标是成为类似 Java 的 JavaScript 替代品,这是可以理解的),我所看到的是,年复一年,这是一种设计糟糕的语言,而 Google 花了 12 年时间试图修复它并缩小范围。 与其他选项的差距。
对我来说最突出的是令人难以置信的营销成功以及人们如何容易受到影响。 尝试查找有关 Dart 2 之前版本的任何信息; 谷歌只是不想让你知道它。
看起来我是一个 Flutter 批评者,但其实我不是。 我衷心感谢 Flutter 所取得的成就!
我相信它将彻底改变网络! 请随意阅读更多关于我为什么这么认为的内容。
Flutter 代表了声明式 UI 的重大演变。 虽然 React 使我们能够使用 JSX 创建漂亮的界面,但它是围绕完全不同的 DOM 构建的。 相比之下,Flutter 本身就是基础。 我确信将会出现在幕后利用 Flutter 的新框架。
跨平台开发已经非常接近原生性能,甚至在很多方面超越了原生性能。 我无法想象在 Xcode 中创建所有这些流畅的动画。 决不!
Compose Multiplatform、MAUI、Avalonia 和 Uno 都变得异常强大,这是令人鼓舞的。
然而,它的受欢迎程度也让我担心,因为:
您几乎可以在任何语言中使用像 GTK 这样的框架,但是 Flutter 呢?
尽管 JVM 有众多变体,但您始终知道一切都通过开源 OpenJDK 进行。 另一方面,Flutter 主要由 Google 所有,本质上是作为他们在 Fuchsia 发布之日立即普及的工具。
我们谁都无法控制它的未来。 Flutter 何时获得 3D 支持以及您使用它的方式完全取决于 Google。 虽然您可能担心 Metal 或 DirectX 是专有标准,但对于 Flutter,一切都是专有的。
干杯!