来之不易的Android编程经验

就像肯特·贝克(Kent Beck)在他的《实现模式》一书中所说,“……基于一个相当脆弱的前提,即好的代码很重要……”。 但是我们都知道干净的代码很重要,因为我们不得不对其缺乏处理这么长时间。 肯特也是如此。

肯特·贝克

拥有垃圾的总成本

几年前,就像每个在印度的一家初创公司工作的天真的Android开发人员一样,我试图“破解”现实世界中的问题,“扰乱整个行业”,并在“宇宙中扎根”。 我一向不关心优秀的软件设计或体系结构,因此开始编写代码来构建一个Android应用程序,该应用程序有一天将成为印度最大的消费者健康护理应用程序之一。

一次又一次的冲刺,一次又一次的破解,疯狂地建立了功能。 建立。 测量。 学习。 上市时间很重要,每一天都很重要。 随着时间的流逝,我们每6个月以1名团队成员的速度增长,该应用程序的下载量已达到百万。

我们应用程序的Google Play商店下载和评分。

到了这个时候,该应用程序已经不再是琐碎的事了,它甚至已经成为多租户客户端。 我们刚开始需要花费数小时才能完成的功能现在需要数天,有时甚至数周。 每个活动都是超过1000行的意大利面条代码,因为Android本质上不必过多担心关注点的分离。 拥有一团糟的总成本极大地拖慢了我们的步伐。

Android难题

代码看起来很丑陋,活动管理了所有内容:

  • 穿线
  • 输入输出
  • 计算方式
  • 版面
  • 配置变更
  • 什么不

毕竟,活动是控制者,对不对? 还是他们的观点? 我不知道了

MVC

空中重新设计

我们需要以一种方式设计应用程序,即在某处更改一行代码不会破坏其他地方的代码。 正如Bob叔叔所说,该应用程序必须“健壮但不僵化,灵活但不易碎”。

罗伯特“鲍伯叔叔”马丁

这是我的导师和朋友Kashif Razzaqui加入团队帮助我们减轻混乱的时候。 宏伟的重新设计从未发生,但是我们从代码中重构了地狱:

  • 我们添加了一个“服务”层,并将所有非UI代码移动到其中,一次提供一个服务。
  • 我们放弃了AsyncTasks并使用Guava移到了ListenableFutures。
  • 我们为OkHttp转储了AsyncHttpClient。
  • 但更重要的是,我们开始阅读很多文章:干净的代码,干净的体系结构,SOLID,DRY,实用程序程序员,实践中的Java并发,域驱动设计等。

很快,我们开始看到我们努力的好处。 生产力提高了,我们写东西的速度更快,每个人都很高兴。

直到我们统一了我们的应用程序,一切都破灭了。 仅仅拥有一个额外的服务层并不能减少它。

清洁守则的艺术

在多次观看Bob叔叔关于Clean Architecture的视频并阅读了很多有关Android应用程序体系结构的文章之后,我决定尝试使用MVP设计模式和RxJava。

经过几天的实验,我们决定切换到RxJava并使用Clean Architecture实现MVP。 我们确保将所有层封装在接口后面,并且很好地分离了关注点。

  • 通常由片段实现的视图包含对演示者的引用。 视图唯一要做的就是每当有接口操作时从Presenter调用一个方法。
  • 演示者负责充当视图和模型之间的中间人。 它从模型中检索数据,并将其格式化后返回给视图。 但是与典型的MVC不同,它还决定了与View交互时会发生什么。
  • 该模型只是域层或业务逻辑的网关。
  • Interactor处理I / O,是要在View中显示的数据的提供者。

现在,使用全新的实现轻松切换一层。 重新设计UI是Android应用程序开发的重要组成部分,变得更加容易。 事情最终可以快速发展而不会破裂。

童子军规则

仅仅编写好代码是不够的,随着时间的流逝,必须保持代码的清洁。 生活的事实是,软件具有熵的趋势。 我们都看到代码会随着时间的流逝而腐烂和退化,因此我们借用了简单的童子军规则:“让营地比您发现的更干净。”

如果我们签入的代码都比签出的代码干净一点,那么代码根本不会腐烂。 清理不必很大。 更好地更改一个变量名,分解一个太大的函数,消除一点重复,清理一个复合if语句。

结论

我们构建可扩展应用程序的方法可能不是“正确的”,您可能不同意本文。 毕竟,并非所有的武术家都同意最好的武术或其中一种最好的技术;)

针对MVP的方法有很多,还有许多有趣的解决方案可使其适应Android。 我们不能否认的一个事实是,“清洁代码”很重要,您根本无法将它扫地出门。

该帖子大量借鉴了Bob叔叔的Clean Code,并从2011年的Kashif的Droidcon演讲中窃取了该标题。

如果“清洁代码”对您很重要,让我们聊天:) Twitter:@_arunsasi LinkedIn:https://www.linkedin.com/in/arunsasidharan

如果您喜欢这篇文章,请打动一下! ❤