前言
这是我新起的一个系列,目的地总结一下写出优秀代码的方法。
大家都知道,代码如果括号嵌套太多了,会影响代码的可读性和扩展性,这次就总结一些代码中减少嵌套的一些方法
第一个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| fun test1(condition1: Boolean, condition2: Boolean, condition3: Boolean) { if (obj != null) { if (condition1) { while (true) { if (condition2) { if (condition3) { } } } } } else { throw NullPointerException("obj is Null") } }
|
上面这个函数,下面一下子放了 6 层括号,已经很复杂了,我们可以进行如下更改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| fun test2(condition1: Boolean, condition2: Boolean, condition3: Boolean) { if (obj == null) { throw NullPointerException("obj is Null") } if (!condition1) { return }
while (true) { if (!condition2) { continue } if (condition3) { } } }
|
提前抛异常
我们在 obj = null 的时候,直接抛出异常,减少了一个 else 括号
提前返回(Early Return)
我们直接让在不满足 condition1 的情况下,直接返回。
这样,我么就可以将满足 condition1 的情况直接拿出来,从而减少了一层嵌套。
提前跳出循环
我们遇到不满足 condition2 的情况,直接跳过本次循环,将满足 condition2 的情况拿了出来,从而减少了一层嵌套
第二个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| fun onClick(v: View) { val id: Int = v.getId() if (id == R.id.button1) { startActivity(Intent(this, StandardActivity::class.java)) } else if (id == R.id.button2) { startActivity(Intent(this, SingleTopActivity::class.java)) } else if (id == R.id.button3) { startActivity(Intent(this, SingleTaskActivity::class.java)) } else if (id == R.id.button4) { startActivity(Intent(this, SingleInstanceActivity::class.java)) } else if (id == R.id.button4) { startActivity(Intent(this, SingleInstanceActivity::class.java)) } else if (id == R.id.button5) { startActivity(Intent(this, SingleTopActivity.SingleTopActivity1::class.java)) } else if (id == R.id.button6) { startActivity(Intent(this, SingleTopActivity.SingleTopActivity2::class.java)) } else if (id == R.id.button7) { startActivity(Intent(this, SingleTopActivity.SingleTopActivity3::class.java)) } else if (id == R.id.button8) { startActivity(Intent(this, SingleTopActivity.SingleTopActivity4::class.java)) } else if (id == R.id.button9) { startActivity(Intent(this, SingleTopActivity.SingleTopActivity5::class.java)) } else if (id == R.id.button10) { startActivity(Intent(this, SingleTaskActivity.SingleTaskActivity1::class.java)) } else if (id == R.id.button11) { startActivity(Intent(this, SingleTaskActivity.SingleTaskActivity2::class.java)) } else if (id == R.id.button12) { startActivity(Intent(this, SingleTaskActivity.SingleTaskActivity3::class.java)) } else if (id == R.id.button13) { startActivity(Intent(this, SingleTaskActivity.SingleTaskActivity4::class.java)) } }
|
上述代码用了大量if-else
并且都是判断id
的,这种键值对判断,我们就可以改用switch-case
,kotlin
里用的是when
,或者用map
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| fun onClick(v: View) { val id: Int = v.getId() when (id) { R.id.button1 -> { startActivity(Intent(this, StandardActivity::class.java)) } R.id.button2 -> { startActivity(Intent(this, SingleTopActivity::class.java)) } R.id.button3 -> { startActivity(Intent(this, SingleTaskActivity::class.java)) } R.id.button4 -> { startActivity(Intent(this, SingleInstanceActivity::class.java)) } R.id.button4 -> { startActivity(Intent(this, SingleInstanceActivity::class.java)) } R.id.button5 -> { startActivity(Intent(this, SingleTopActivity.SingleTopActivity1::class.java)) } R.id.button6 -> { startActivity(Intent(this, SingleTopActivity.SingleTopActivity2::class.java)) } R.id.button7 -> { startActivity(Intent(this, SingleTopActivity.SingleTopActivity3::class.java)) } R.id.button8 -> { startActivity(Intent(this, SingleTopActivity.SingleTopActivity4::class.java)) } R.id.button9 -> { startActivity(Intent(this, SingleTopActivity.SingleTopActivity5::class.java)) } R.id.button10 -> { startActivity(Intent(this, SingleTaskActivity.SingleTaskActivity1::class.java)) } R.id.button11 -> { startActivity(Intent(this, SingleTaskActivity.SingleTaskActivity2::class.java)) } R.id.button12 -> { startActivity(Intent(this, SingleTaskActivity.SingleTaskActivity3::class.java)) } R.id.button13 -> { startActivity(Intent(this, SingleTaskActivity.SingleTaskActivity4::class.java)) } } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| val classMap = HashMap<Int, Class<out FragmentActivity>>().apply { put(R.id.button1, StandardActivity.class) put(R.id.button2, SingleTopActivity.class) put(R.id.button3, SingleTaskActivity.class) put(R.id.button4, SingleInstanceActivity.class) put(R.id.button5, SingleTopActivity.SingleTopActivity1.class) put(R.id.button6, SingleTopActivity.SingleTopActivity2.class) put(R.id.button7, SingleTopActivity.SingleTopActivity3.class) put(R.id.button8, SingleTopActivity.SingleTopActivity4.class) put(R.id.button9, SingleTopActivity.SingleTopActivity5.class) put(R.id.button10, SingleTaskActivity.SingleTaskActivity1.class) put(R.id.button11, SingleTaskActivity.SingleTaskActivity2.class) put(R.id.button12, SingleTaskActivity.SingleTaskActivity3.class) put(R.id.button13, SingleTaskActivity.SingleTaskActivity4.class) }
override fun onClick(v: View) { startActivity(Intent(this, classMap[v.id])) }
|
ps:我推荐一个jetbrains
插件,叫Better Highlights
,他其中一个免费功能就是帮你检查方法的复杂度