在项目开发中我们都会遇到判断是否登录、是否是会员、是否有数据等等,不唯一跳转路径的业务,这种业务有个优点就是好写,确定就是需要写的多。那写的多能算一个缺点吗? 也不算,但是对于代码的刻度性来讲,一个方法一点击引用处,出现几十处,总归不是很好的,我们需要将这些简单的功能精简化
是不是很简单的一个逻辑,反手就写出来了
// UserUtils:
fun isLogin(user: User) :Boolean{
return user.xx == null
}
然后呢?然后当然是使用了
// Activity A
// Activity B
if (UserUtils.isLogin()) {
startActivity(Intent(this,A::class.java))
} else {
startActivity(Intent(this,B::class.java))
}
然后就是出现了 A jump B isLogin(), A jump C isLogin(), C jump D isLogin …
那我们是不希望出现这种情况的,这种代码耦合性太高了,并且及其不易维护, 加入我们user 的参数放生了变化,那我们是不是需要在调用的每一个地方做一个修改(只是说明出现类似问题会很麻烦)
怎么优雅处理是否jump逻辑
什么情况是最好维护的?什么情况是最好管理的?
答案很明显,当然是在一个文件中,在一个文件中管理是否jump逻辑,我们需要的是在一个类文件中进行管理,说白了就是集中路由,我在这里称之为集中路由就是将项目中的jump全部拿到一个navigation文件中处理。
以是否登录jump为例:
首选我们需要一个用户登录状态管理类:
object Authenticator {
fun isLogin() :Boolean{
return true
}
}
其次我们创建navigator 类
class Navigator {
fun show(context:Context) {
when (authenticator.userLoggedIn()) {
true -> jump(context)
false -> jumpLogin(context)
}
}
}
很简单的就在此处进行了判断 并且进行了路由集中管理
那么上述是一个boolean 的处理,在jump 方法中进行路由的处理,
总结
在是否jump 类型的业务中,我们将重复使用的功能拿到一个文件中处理是很好的解决方式,既可以集中处理路由,又有易修改等特点。要是将此方法和注解一起使用,会更加方便,比如Dagger2
class RouteActivity : AppCompatActivity() {
private val appComponent: ApplicationComponent by lazy(mode = LazyThreadSafetyMode.NONE) {
(application as ImageKotlinDemoApplication).appComponent
}
@Inject
internal lateinit var navigator: Navigator
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
appComponent.inject(this)
navigator.showMain(this)
}
}