Android 数据绑定的优缺点是什么?

我的同事和我都有 Web 应用程序的 MVVM 的经验,而我们对本地 Android 开发还是新手。现在我们对 Android 数据绑定有相反的看法——我是它的粉丝,而他不是。

我的观点:

  • 减少轮流带来的样板代码
    • 更少的耦合
    • 可读性更强
  • 功能强大,易于实现自定义属性和自定义视图
  • 甚至比 findViewById (详情)更快

他的观点:

  • 自动生成的. class 增加了应用程序的大小。
  • 更难调试

我做了一些调查,但没有多少讨论。现在我想收集 Android 数据绑定的优缺点。

讨论的方面包括但不限于:

  • 单元测试
  • 应用程序大小
  • 表演
  • 学习曲线
  • 可读性
  • 耦合
20951 次浏览

我将首先评论你的论点,然后陈述我的观点:

1.删除样板代码-它将删除一些它将只移动一些在 xml或它将需要额外的类。因此,您必须小心并平衡数据绑定的使用。

2.更强的可读性-取决于你是一个新的开发人员,那么你可能会发现学习它很容易,但如果你以前在 Android 上工作,你将需要额外的时间来学习它。

3.强大-代码有更多的权力,你可以实现任何你喜欢的代码。可以这样想,使用数据绑定实现的所有东西都有一个等价的代码(可能需要编写更长的代码) ,但是 revers 是无效的。

4.甚至比 findViewById更快的速度——比较这两者之间的速度,在我看来是没有用的,你永远不会注意到差异,如果你看到一些差异,那么其中一个实现是错误的。

5.自动生成类-这是真的,它将增加应用程序的大小,但再次只有当你有吨,它将有关系。的确,在 android 开发网站上,他们声称使用自动生成代码的库或者使用生成额外代码的 annotations是不好的。

6.难以调试——与可读性一样,这取决于您所习惯的东西,对于某些问题来说,无论哪种方式都很难调试,如果不使用不同的库进行调试,您将会得到更好的结果。

所以这纯粹是我的观点,我已经开发了许多应用程序使用不同的库和不同的方法,他们都有优点和缺点,但我学到了什么: 平衡一切,不要使用吨的库,不要浪费时间实现的东西,已经实现并工作良好,不要“解耦一切”,不要“耦合”一切,不要只使用代码,不要尝试“生成”一切。

我认为这是相当错误的,你可能会得到一个错误的想法,如果你问“优点和缺点”关于一些库/实现,因为通常它不会是公正的,你会得到很多优点,从某些人谁使用库在一个特定的方式,它工作,其他人会给你的缺点,因为他们使用不同的,它没有工作。

所以最后,我认为您应该检查一下库能为您做什么,不能为您做什么,然后决定它是否有利于您的设置。换句话说,你应该决定一个图书馆是否适合你,而不是其他人;)。

更新-2018年8月8日

首先,我仍然坚持我的初步结论,在这种情况下,平衡是关键,但在我的情况下,数据绑定加快了一点开发过程,也改善了它。这里有一些你们都应该考虑的新观点。

  1. 测试用户界面——使用数据绑定更容易测试用户界面,但是数据绑定还不够,你还需要一个好的架构,使用 Google 建议的架构将显示数据绑定的实际威力。

  2. 最明显的变化是从我原来的答案第2点和第5点提供的。在 决定了使用数据绑定之后,阅读代码就变得更加容易了,这里最重要的事情是: 我们作为一个团队决定使用数据绑定,在那之后,我们希望在 XML 文件中有大部分琐碎和基本的 UI 设置。

对于调试部分,这里有一点棘手,Android Studio 在数据绑定的错误和自动完成方面有很多需要改进的地方,但是最常见的错误是在前2-3次出现之后出现的。我还学到了一个“干净的项目”形式的时间,有助于很多。

  1. 另一点你必须考虑的是使用数据绑定的项目配置,现在 AS (3.1)默认支持 Java 的数据绑定(只是在 graddle 中设置了一个标志) ,但是我和 Kotlin 之间有一些问题,在这里搜索了一下 SO 之后,我设法解决了所有问题。

作为第二个结论(来自我最初的文章) ,如果你可以和项目的最后期限/需求/等允许你尝试数据绑定,去它将是值得的(除非你做一些非常愚蠢的东西:))。

即使我喜欢 danypata 的回答,我想添加/编辑他的一些陈述到 android 数据绑定。

1.删除样板代码 -正如 danypatas 中所写的那样,它删除了一些代码,并在其他地方添加了一些代码,比如在布局中。这并不意味着锅炉代码不减少,因为它通常是减少。

For example you may want to create a bindingadapter, which handles several custom arrayadapters for your spinner/recyclerview/listview/.. but requires only one simple adapter. You may want to use the adapter in your layout by using e.g.

app:myCoolAdaptersData="@{model.mydata}"

现在,您可以创建通用适配器,并(重新)在所有布局中使用 bindingAdapter,而不是使用例如:

ListView lv = findViewById(...);
CoolGenericAdapter<MyModel> coolAdapter = new CoolGenericAdapter<>(...);
lv.setAdapter(coolAdapter);

这只是一个简单的示例,它在大型项目中收回了大量代码。重新获取代码的另一个示例是,将模型绑定到布局。更新模型的字段值通常也会更新模型(如果它至少是一个 BaseObserver/Observer ableField)。

这意味着您不需要查找所有视图,更新视图,更新模型,..。

2.可读性更强 -学习数据绑定所花费的额外时间并不重要。由于这些布局并没有什么不同,只是将它们包装到一个布局标记中并将名称空间放在那里,所以它们与“常规”布局没有什么不同。在布局中使用绑定适配器和访问模型可能需要一些时间,但是通常您可以从简单而美观的基础开始使用。学习新东西总是需要时间的,但是过一段时间之后,当您使用数据绑定时,您将很容易彻底改变时间。

3.强大是的,它非常强大。它更容易重用现有的代码,重用现有的绑定适配器,并可能导致生成更多的代码,但这并不总是正确的。例如,您可能在多个类中创建多个适配器,而不是创建一个绑定适配器,以后可能很难对其进行“优化”。优化 BindingAdapter 意味着它在任何地方都会得到更新。优化可能会减少“代码行”,因为锅炉反正是减少了。

我同意4和5。

6.很难调试 由于 AS 3.0 + 输出有用的提示,比如布局中的语法问题(行号和文件) ,因此很容易调试数据绑定生成的代码。如果在查找问题时遇到问题,可能还需要检查生成的代码中是否存在错误。一些类似匕首2或者 android 架构库的库可能会使您感到困惑,因为错误行与真正的“错误”不匹配。这是由其他注释处理器生成的代码。如果您知道这些注释处理器可能会在数据绑定错误输出方面遇到麻烦,那么可以很容易地解决这个问题。

7. 单元测试 可能类似于不使用 ExecutePendingBindings 来使用数据绑定。

8.可读性 没有数据绑定的可读性可能会更好。由于您将一些业务逻辑放到了布局中,一些放到了实际的代码中,这可能会导致意大利面条式的代码。另一个问题是,如果“布局设计师”不知道可以使用哪个参数,那么在布局中使用 lambdas 可能会非常混乱。

另一个非常大的问题是绑定适配器可能无处不在。使用 BindingAdapter 注释生成代码。这意味着在布局中使用这种方法可能会导致找到适当代码的问题。如果你想更新一个绑定适配器,你需要“找到”它。

你什么时候该用什么?对于大型项目,将数据绑定与 mvvm 或 mvp 模式一起使用是一个非常好的主意。这是一个非常干净的解决方案,并且非常容易扩展。如果你只是想创建一个小的简单的应用程序,你可以在没有数据绑定的情况下使用 MVC 模式。如果您有可以从其他项目中使用的现有通用绑定适配器,那么您可能希望使用数据绑定,因为这样很容易重用此代码。

我正在做一个巨大的 Android 项目,团队已经决定逐步淘汰数据绑定库。为什么?主要原因是,它通过在构建过程中生成大量的类而加剧了构建时间(10分钟以上)。

在我看来,数据绑定、概念智慧看起来很有希望,但我不喜欢实现部分。

我希望你能用更简单直接的方法来解决这个问题。 因此,我觉得保持传统更舒服。

模型类,可变对象,观察者对我来说太多了,如果一些用于绑定的数据变量被接收为对象,这些对象在类中是可变的,可直接观察的,那么这将使过程更加清晰,简单和简洁。