電卓作ってみた（スーパー途中）

#はじめに
電卓くらいつくれるようになりたいなと思い。午後に取り組んでみたが時間かかりすぎた！
まあ、将来自分が成長したな。と思えるような記録とする。

#頑張れたところ、発見
・ログ
ログの取り方は以前よりもマシになったと思う。
机上デバッグがしやすくなった。
どのプロセスを実行したときの出力なのか、わかるようにするのはいいのでは？
熟練の人のログの取り方と今度比較してみよう。。。

#ダメなところ
・設計せよ
簡単な処理の集合かつ、その数が少なければ設計は必要でないこともあるかもしれない。
けど、今回は電卓で、演算の手順などがかなり複雑なプロダクトであるから、設計を学ばなければならないと思う。
・コードが汚い
自覚はあるものの、どんな風に改善すればいいのかとか、なにがキレイなのかわからない。その辺は他の人を見習って、盗んでいこうと思う。



#ソースコード
```MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val btNum1 = findViewById<Button>(R.id.btNum1)
        val btNum2 = findViewById<Button>(R.id.btNum2)
        val btPlus = findViewById<Button>(R.id.btPlus)
        val btMulti = findViewById<Button>(R.id.btMulti)
        val btEqual = findViewById<Button>(R.id.btEqual)

        var listener = CalculateListener()

        btNum1.setOnClickListener(listener)
        btNum2.setOnClickListener(listener)
        btPlus.setOnClickListener(listener)
        btMulti.setOnClickListener(listener)
        btEqual.setOnClickListener(listener)
    }

    private inner class CalculateListener() : View.OnClickListener {
        override fun onClick(view: View) {

            val tvDisplay = findViewById<TextView>(R.id.tvDisplay)
            var state = tvDisplay.text.toString()
            var input = ""

            when (view.id) {
                R.id.btNum1 -> {
                    input = tvDisplay.text.toString() + "1"

                }
                R.id.btNum2 -> {
                    input = tvDisplay.text.toString() + "2"
                }
                R.id.btPlus -> {
                    input = tvDisplay.text.toString() + "+"
                }
                R.id.btMulti -> {
                    input = tvDisplay.text.toString() + "×"
                }
                R.id.btEqual -> {
                    input = tvDisplay.text.toString() + "="
                    tvDisplay.setText(input)
                    Log.d("aaaaa", "input = "+ input)
                    Log.d("aaaaa", "state = "+ state)

                    state = tvDisplay.text.toString()
                    var result = CalculationStart(state)
                    input = "=" + result.toString()
                }
            }
            tvDisplay.setText(input)
        }
    }


    private fun CalculationStart(state: String): Int {

        Log.d("aaaaa", state)
        var n = 0                 // state Index
        var numBuff: IntArray = intArrayOf(0, 0, 0, 0, 0, 0, 0, 0)
        var numBuffIndex = 0
        var result = 0

        var plusFlag = 0
        var multiFlag = 0

        while (true) {

            // digit?
            if (isDigitsOnly(state.substring(n, n+1)) == true) {
                Log.d("aaaaa", "----DIGIT PROCESS----")
                Log.d("aaaaa", "数字だった時、その値" + state.substring(n, n+1))
                if (multiFlag == 1) {
                    Log.d("aaaaa", "----MULTI PROCESS----")
                    Log.d("aaaaa", "numBuffIndex-1 = " + (numBuffIndex-1).toString())
                    if (numBuffIndex >= 1){
                        numBuff[numBuffIndex-1] = numBuff[numBuffIndex-1] * state.substring(n, n+1).toInt()
                        Log.d("aaaaa", "numBuff[numBuffIndex-1] = " + numBuff[numBuffIndex-1].toString())
                    }else{
                        Log.d("aaaaa", "numBuffIndexは０のはず => " + numBuffIndex)
                        Log.d("aaaaa", "state.substring(n, n+1) = " + state.substring(n, n+1))
                        numBuff[numBuffIndex] = numBuff[numBuffIndex] * state.substring(n, n+1).toInt()
                        Log.d("aaaaa", "numBuff[numBuffIndex-1] = " + numBuff[numBuffIndex].toString())
                    }


                    numBuffIndex = numBuffIndex - 1
                    if (numBuffIndex < 0){
                        numBuffIndex = 0
                    }
                    multiFlag = 0
                }else {
                    Log.d("aaaaa", "----NOT MULTI PROCESS----")
                    numBuff[numBuffIndex] = state.substring(n, n + 1).toInt()
                    numBuffIndex++;
                    Log.d("aaaaa", "numBuffIndex = " + numBuffIndex)
                    Log.d("aaaaa", "numBuff[numBuffIndex-1] = " + numBuff[numBuffIndex-1])

                }


                // =?
            } else if (state.substring(n, n+1) == "=") {
                Log.d("aaaaa", "----EQUAL PROCESS----")
                Log.d("aaaaa", "numBuff[Index] = " + numBuff[0])
                Log.d("aaaaa", "numBuffIndex = " + numBuffIndex)

                val result = numBuff[numBuffIndex]
                return result

                // calc token
            } else {
                Log.d("aaaaa", "----TOKEN PROCESS----")
                when (state.substring(n, n+1)) {
                    "+" -> {
                        plusFlag = 1
                    }
                    "-" -> {
                    }
                    "×" -> {
                        multiFlag = 1
                        Log.d("aaaaa","multiFlag = " + multiFlag.toString())
                    }
                }
            }
            Log.d("aaaaa", "----NEXT CHARACTER----")
            n++;
        }
    }
}


```