APP重构之路:引入单元测试】的更多相关文章

一.为什么要引入单元测试 在开发过程中我们会遇到这样一些问题: 面对需要重构庞大的模块代码时无从下手 修改了一处地方却在另一处地方引发了新的bug 扩展新功能的同时导致旧代码出现bug 在测试人员难以覆盖到的基础功能接口出现了bug 出现了一种难以重现的特殊边界条件触发的bug 另外我们也许还会遇到一些这样的模块: A模块依赖于B模块的结果,但是B模块尚未开发完成 模块状态过于复杂,手工测试需要耗费大量时间 模块业务与时间节点相关,手工测试难以覆盖 这个时候也许能够利用经验和丰富的debug技巧…
很多的app使用MVC设计模式来将“用户交互”与“数据和逻辑”分开,而model其中一个重要作用就是持久化.下文中设计的Model可能不是一个完美的,扩展性强的model范例,但在我需要重构的app中,这样的设计能够满足我的需要. 关于Model Model层包含了app的数据与逻辑,Model层中的类需要关心的是数据的表现,存储,以及操作.Model层是整个app生态中相对独立的一个部分,因为它不会直接与controller层或者是View层进行通讯,而是在其他层需要请求它的信息的时候进行间接…
上文回顾 :Hybird框架UI重构之路:四.分而治之 这里讲述在开发的过程中,一些HTML.CSS的关键点. 单页模式的页面结构 在单页模式中,弱化HTML的概念,把HTML当成一个容器,BODY中显示的主体内容才是页面,一个HTML容器中可以存放1个或者多个页面,每个页面放置于section中.而一个页面(section)中必有主体内容(content),也有可能包含头部内容.底部内容,甚至一些侧滑菜单等. 所以,以我们通常看到的一个移动应用的界面中包含了顶部Title和主体内容的页面代码如…
上文回顾:Hybird框架UI重构之路:二.事出有因 工欲善其事,必先利其器,事是重构的目标,器是开发环境. 这篇文章将讲述重构时的UI框架的目录结构,且需要使用的开发工具. 目录结构 demo : 开发框架的模板(单页模式) demo-muti : 开发框架的模板(多页模式) demo-scene : 示例模板.一个完整的示例,目的是给使用者稍作修改就可以使用在项目上. demo-template : 给使用者使用的开发模板. demo-whole : 可在PC上演示的示例模板 dist :…
Android Studio重构之路,我们重新来了解一下Google官方的Android开发工具 记得我的第一篇博客就是写Android Studio,但是现在看来还是有些粗糙了,所有重构了一下思路,覆写了一篇 Google主推-Android开发利器--Android Studio,这可能是最全的AS教程! Android Studio,自Google2013年发布以来,就倍受Android开发者的喜爱,我们本书,就是基于Android Studio来进行案例演示的,大家都知道,Android…
前两篇文章Android项目重构之路:架构篇和Android项目重构之路:界面篇已经讲了我的项目开始搭建时的架构设计和界面设计,这篇就讲讲具体怎么实现的,以实现最小化可用产品(MVP)的目标,用最简单的方式来搭建架构和实现代码. IDE采用Android Studio,Demo实现的功能为用户注册.登录和展示一个券列表,数据采用我们现有项目的测试数据,接口也是我们项目中的测试接口. 项目搭建 根据架构篇所讲的,将项目分为了四个层级:模型层.接口层.核心层.界面层.四个层级之间的关系如下图所示:…
在前一篇文章<Android项目重构之路:架构篇>中已经简单说明了项目的架构,将项目分为了四个层级:模型层.接口层.核心层.界面层.其中,最上层的界面,是变化最频繁的一个层面,也是最复杂最容易出问题的一个层面,如果规划不好,很容易做着做着,又乱成一团了. 要规划好界面层,至少应该遵循几条基本的原则: 保持规范性:定义好开发规范,包括书写规范.命名规范.注释规范等,并按照规范严格执行: 保持单一性:布局就只做布局,内容就只做内容,各自分离好:每个方法.每个类,也只做一件事情: 保持简洁性:保持代…
上文回顾 :Hybird框架UI重构之路:五.前端那点事儿(HTML.CSS) 这里讲述在开发的过程中,一些JS的关键点. 换肤 对于终端的换肤,我之前一篇文章有说了我的想法. 请查看:http://www.cnblogs.com/lovesong/p/4122262.html   iscroll的问题 1.使用iscroll的页面里面有表单元素,当键盘弹出再缩回后,页面拖不到最顶地方. 这个在android上总出现,使用的iscroll版本是4.2.5. 这原来是个很棘手的问题,导致了有inp…
上文回顾:Hybird框架UI重构之路:三.工欲善其事,必先利其器 上一篇文章有说到less.grunt这两个工具,是为了css.js分模块使用的.UI框架提供给使用者的时候,是一个大的xxx.js.xxx.css,但在开发时候,必须划分模块. CSS模块划分 1.variables.less 这里面是一些样式的变量.函数 例: 字体: @baseFontSize: 20px; 圆角: .rounded-corners (@radius: 5px) { border-radius: @radiu…
上文回顾:Hybird框架UI重构之路:一.师其长技以自强 一切的重构都是有原因的,或许为了更快速度.更好体验.更快捷开发等,于是就有了自己的开发目标,简单看看未重构前UI("中国移动式"风格). 上一篇文章说明调查了这么多类似框架,对比了他们的特点,而比对自身UI,也是存在可优化的地方,于是有了下面几点目标(仅仅UI框架方面,不涉及原生部分). (1)规范开发 1.SVN版本控制.之前的UI框架部分是没有进行svn版本控制的,于是会导致个问题——有些文件在多次修改后,连当初的开发者都…
看国内APP发展之路" title="从Instagram"宁静.规则"的成功 看国内APP发展之路"> Instagram在全球获得的巨大成功,让很多社交.即时通信.图片乃至其他领域的APP等羡慕不已.尤其是Instagram在成立五年之后,仍能保持高频的使用幅度,仍然处于高速增长态势,看不到衰落的现象,更是难能可贵.相比之下,曾经的社交应用霸主Twitter的直线坠落,就显得是那么的出人意料. Instagram的成功,其由来是能够"以…
简介: RPC 模块是我最初研究 Seata 源码开始的地方,因此我对 Seata 的 RPC 模块有过一些深刻研究,在我研究了一番后,发现 RPC 模块中的代码需要进行优化,使得代码更加优雅,交互逻辑更加清晰易懂,本着 "让天下没有难懂的 RPC 通信代码" 的初衷,我开始了 RPC 模块的重构之路. RPC 模块是我最初研究 Seata 源码开始的地方,因此我对 Seata 的 RPC 模块有过一些深刻研究,在我研究了一番后,发现 RPC 模块中的代码需要进行优化,使得代码更加优雅…
这两年在支撑公司的Hybrid框架的运维发展,让人确认这种移动开发方式确实是一条不错的路.混合应用这种开发方式降低开发难度,极大的提高开发效率,最重要的一点效果可以接近原生应用.框架的本身是需要持续不断发展的,这里开始我讲述我重构Hybird框架的UI的这三个月(2014-11——2015-1),而在重构之前,预先调查了目前所了解的几个混合应用的框架,师其长技以自强. PS:Hybrid应用是web页面与原生壳(Android.IOS)的结合最后打成安装包的应用.   重构的前奏曲: ApiCl…
去年10月底换到了新公司,做移动研发组的负责人,刚开始接手android项目时,发现该项目真的是一团糟.首先是其架构,是按功能模块进行划分的,本来按模块划分也挺好的,可是,他却分得太细,总共分为了17个模块,而好几个模块也就只有两三个类而已.但应用本身其实比较简单,要按功能模块来分的话,最多五个模块就够了.另外,有好多模块划分也很模糊,也有很多类按其功能其实可以属于多个模块的,也有些类定义不明确,做了不该做的事.有时候,我要找一个界面的Activity,按照其功能应该属于A模块的,可是在A模块里…
1. 背景 if/else是高级编程语言中最基础的功能,虽然 if/else 是必须的,但滥用 if/else,特别是各种大量的if/else嵌套,会对代码的可读性.可维护性造成很大伤害,对于阅读代码的人来说就是一场灾难. 本系列博客的目的不是消除if/else,而是如何"写好"if/else 2. 方法 根据if/else的使用方式和场景,大概有如下解决方法 多态 表驱动 职责链模式 卫语句 Optional 调整判断逻辑,抽取方法,逻辑优化 本篇博客我介绍的是表驱动,后续博客会介绍…
1. 背景 if/else是高级编程语言中最基础的功能,虽然 if/else 是必须的,但滥用 if/else,特别是各种大量的if/else嵌套,会对代码的可读性.可维护性造成很大伤害,对于阅读代码的人来说就是一场灾难. 本系列博客的目的不是消除if/else,而是如何“写好”if/else 2. 方法 根据if/else的使用方式和场景,大概有如下解决方法 多态 表驱动 职责链模式 卫语句 Optional 调整判断逻辑,抽取方法,逻辑优化 本篇博客我介绍的是表驱动,后续博客会介绍其他案例…
在现在的app,网络请求是一个很重要的部分,app中很多部分都有或多或少的网络请求,所以在一个项目重构时,我会选择网络请求框架作为我重构的起点.在这篇文章中我所提出的架构,并不是所谓的 最好 的网络请求架构,因为我只基于我这个app原有架构进行改善,更多的情况下我是以app为出发点,让这个网络架构能够在原app的环境下给我一个完美的结果,当然如果有更好的改进意见,我会很乐于尝试. 关于网络请求框架 一个好的网络请求框架对于一个团队来说是十分重要的.如果一个网络请求框架没有封装好,或者是在设计上存…
步骤一: PROJECT --info --configurations,将对应的Debug和Release 设置成pods.debug和pods.release    步骤2:编译一下(本人遇到的问题是真机调试可以跑起来了,但是打包Archive给别人测试的时候出现下面的错误:在App Extension 出现library not found for-lMasonry  错误. 解决方式:TARGETS--选择AppExtension --Build Phases 添加对应的.a文件…
6年之前一直做过一些内存挂,脚本挂.都是比较低级的技术. 这几年期间,断断续续利用业余时间学了一些汇编的知识,当时只是想着破解游戏. 所有的黑技术都是业余自学的,没有老师可以问,只能百度和自己领悟,比较苦逼.有时候搞一个东西搞到吐血,想砸电脑. 6年前就知道 Windows破解的工具: ida, ollydbg. CE.  换到Mac电脑,想当然也是想用这个几个软件.百度了一番,除了ollydbg, 都有Mac版本的. 于是网上下载了一个mac版本的IDA工具,随便拖了几个可执行程序分析了一番,…
不想无限使用,直接破解到正版: 输入邮箱 名字之后 还有licence信息之后,处理函数是: this.text.getText() 很明显是你输入的licence.   然后交给父类okPress处理了.      licence字符串存放的变量是 this.r.   获取这个变量的方法是 am() 查看调用licence信息的地方: t3.common.lic.a.d.bb(). :   把用户输入用this.aT.a()进行处理.   aT对象的类名是:t3.utils.a 展示licen…
前提条件: 越狱手机里, 安装了 <JJ斗地主> 使用砸壳工具clutch 下载地址: https://github.com/KJCracks/Clutch/releases dzq:~/data root# Clutch -i | grep JJ 57: JJ斗地主-欢乐棋牌休闲合集 <cn.jj.TKLobby> [1]+ Stopped Clutch -i | grep JJ [1]+ Done Clutch -i | grep JJ dzq:~/data root# Clu…
1,  在Mac电脑上的app store里搜索Apple Configurator2 并安装 2, iPhone手机连接Mac电脑 3, 登录Apple Configurator2 菜单栏,  账号->登录 4, 添加手机设备 5, 搜索想要的ipa安装包, 下载安装 6, 下载完成后, 会弹出一个页面,  这个时候去本地目录找下载下来的ipa: /Users/dengzhongqiang/Library/Group\ Containers/K36BKF7T3D.group.com.apple…
注:请点击此处进行充电! 1.问题描述:在实现图片轮转时,若将 <script type="text/javascript"> mui("#slider").slider({ interval: 5000 }); </script> 置于图片加载之前,图片不会显示, 解决措施:将其置于图片显示之后才会显示. 2.问题描述: 同上面的问题,会遇到报指针为null的异常.若要获取一个组件的id,可能带获取的组件还未加载,导致获取失败. 解决措施:…
1.问题 在浏览项目时,发现一段使用正则表达式的代码 这段代码,在循环里执行了Pattern.matches()方法进行正则匹配判断. 查看matches方法的源码,可以看到 每调用一次matches方法,都会创建一个Pattern对象,而且这段代码还是在for循环里,如果外层函数又被频繁调用,就会出现很明显的性能问题. 创建Pattern实例的成本很高,因为需要将正则表达式编译成一个有限状态机(final state machine). 2.解决 使用正则表达式的预编译功能,可以有效加快正则匹…
这个软件破解非常简单: 修改: [PaddleStatic Yz6nrtNwF4].直接返回1 效果:…
破解对象: luaide 破解目的:学习如何破解vscode插件 破解背景: vsscode用了这么多年,安装了很多插件,其中luaide插件是收费的.  说实话,100块并不贵, 我本来准备买的. 结果我想加入luaide群,问几个插件相关问题,结果需要回答验证码.太扯了.  既然有7天试用,为何还要入群权限?真搞不懂 一般群我也懒得加,反正加入群,基本上是划水,没什么软用. 刚好之前没有破解vscode插件经验, 那就拿这个练手好了. 纯属破解学习用, 不做非法用途. 我破解的过程中,发现l…
本人使用MacBooster 7 扫出了几个未知程序. JMJ56 这个程序. 在finder中打开发现是一个shell脚本 调用了python 9NKb0 就是python脚本使用.    只不过是编译之后的 pyc二进制文件. 使用 https://tool.lu/pyc/ 在线反编译工具, 将其反编译后,得到了如下代码: import zlib import base64 exec zlib.decompress(base64.b64decode('eJyVV+lz4rgS/85fQVG1…
何为DDD DDD不是架构设计方法,不能把每个设计细节具象化,DDD是一套体系,决定了其开放性,体系中可以用任何一种方法来解决这些问题,但是如果一些关键问题没有具体方案落地,可能让团队无所适从. 有的小伙伴觉得DDD太虚了,具体在我们进行业务代码编写落地中DDD主要解决什么问题呢? 总结起来说主要目的有两点: 建立业务术语,统一PM/RD/QA需求沟通术语. 梳理业务边界,将业务领域逻辑内聚. 搞定DDD要解决的问题 如何进行领域建模 如何识别Bounded Context 如何在战术层面寻找对…
DDD不是架构设计方法 一文读懂DDD 2019-05-28 19:18 by 春哥大魔王, 413 阅读, 3 评论, 收藏, 编辑 何为DDD DDD不是架构设计方法,不能把每个设计细节具象化,DDD是一套体系,决定了其开放性,体系中可以用任何一种方法来解决这些问题,但是如果一些关键问题没有具体方案落地,可能让团队无所适从. 有的小伙伴觉得DDD太虚了,具体在我们进行业务代码编写落地中DDD主要解决什么问题呢? 总结起来说主要目的有两点: 建立业务术语,统一PM/RD/QA需求沟通术语. 梳…
iOS精选源码 电商商品详情 Swift.两种方式实现tableViewCell拖拽功能 ffmpeg+openGL播放器 微信聊天表情雨.表情下落.表情动画 iOS指示器集锦 弹窗增加 pickerView 可交互.无限个数.支持回弹.自定义的圆弧菜单 LXFProtocolTool-swift协议方式实现功能的实用工具库[支持 Rx ] MoyaMapper 快速解析模型工具,支持RxSwift.支持缓存功能 一键合成APP引导页,包含不同状态下的引导页操作方式,... iOS优质博客 对i…