# 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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://heronyang.gitbook.io/clean-up-your-spaghetti/1_dont_code_now/what_clean_code.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
