# What is Clean Code?

## You Care

```
"Clean code always looks like it was written by someone who cares."
```

## Example

[LeetCode Problem 20](https://leetcode.com/problems/valid-parentheses/)

[Code Example I found on Github](https://github.com/mrahmiao/leetcode-solutions/blob/master/20_Valid_Parenthese.js)

## Bad Code (Spaghetti)

```javascript
/**
 * @param {string} s
 * @returns {boolean}
 */
var isValid = function(s) {

  if ((s.length % 2 === 1) || (s.length === 0)) {
      return false;
  }

  var brackets = [],
      openBracketsMapping = {
        '(': ')',
        '[': ']',
        '{': '}'
      },
      chars = s.split(''),
      currentChar = '',
      couple = '';

  for (var i = 0; i < chars.length; i++) {
    currentChar = chars[i];
    if (currentChar in openBracketsMapping) {
      brackets.push(currentChar);
    } else {
      if (openBracketsMapping[brackets.pop()] !== currentChar) {
         return false;
      } else {
        continue;;
      }
    }
  }

  if (brackets.length === 0) {
      return true;
  }
  return false;
};
```

## Clean Code

```javascript
/**
 * @param {string} s
 * @returns {boolean}
 */
var openBracketMapping = {
    '(': ')',
    '[': ']',
    '{': '}'
};
var bracketStack;

var isValid = function(s) {

    if (isImpossibleValid(s)) {
        return false;
    }

    return isValidCheck(s);

};

function isValidCheck(s) {

    initBracketStack();

    var chars = s.split('');
    for(var i = 0; i < chars.length; i++) {

        var c = chars[i];

        if (isOpenBracket(c)) {
            getNewOpenBracket(c);
        } else if (!isCorrectCloseBracket(c)) {
            return false;
        }

    }

    return isBracketStackEmpty();

}

function isImpossibleValid(s) {
    var isLengthOdd = (s.length % 2 === 1);
    var isEmpty = (s.length === 0);
    return  isLengthOdd || isEmpty;
}

function initBracketStack() {
    bracketStack = [];
}

function getNewOpenBracket(c) {
    bracketStack.push(c);
}

function isOpenBracket(c) {
    return c in openBracketMapping;
}

function isCorrectCloseBracket(c) {

    var stackTop = bracketStack.pop();
    var expectedChar = openBracketMapping[stackTop];

    return expectedChar === c;

}

function isBracketStackEmpty() {
    return bracketStack.length === 0;
}
```

## Question

* Please explain the code, which one is easier?
* Any funny thing found in the code?
* If you want to support quotation marks including "" and '', how?

## Tip

The easiest way to test the code is to use Node. Install Node first (link is [here](https://nodejs.org/en/)), save your file then run follow command:

```bash
$ node main.js # change to your own filename
```

You can use console.log("string") to print things out.
