Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

https://github.com/trekhleb/state-of-the-art-shitcode

๐Ÿ’ฉState-of-the-art shitcode principles your project should follow to call it a proper shitcode
https://github.com/trekhleb/state-of-the-art-shitcode

best-practice best-practices code-quality coding javascript principles programming style-guides styleguide

Last synced: about 1 month ago
JSON representation

๐Ÿ’ฉState-of-the-art shitcode principles your project should follow to call it a proper shitcode

Lists

README

        

# State-of-the-Art Shitcode์˜ ๊ทœ์น™

[![State-of-the-art Shitcode](https://img.shields.io/static/v1?label=State-of-the-art&message=Shitcode&color=7B5804)](https://github.com/trekhleb/state-of-the-art-shitcode)

์ด ๋ชฉ๋ก์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ œ๋Œ€๋กœ shitcode๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ๋”ฐ๋ผ์•ผ ํ•˜๋Š” ๊ทœ์น™๋“ค์ž…๋‹ˆ๋‹ค.

_๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ฝ๊ธฐ:_
[_English_](README.md),
[_็ฎ€ไฝ“ไธญๆ–‡_](README.zh-CN.md)

## ๋ฑƒ์ง€ ๋งŒ๋“ค๊ธฐ

๋งŒ์ผ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๊ฐ€ shitcode์˜ ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ "state-of-the-art shitcode" ๋ฑƒ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

[![State-of-the-art Shitcode](https://img.shields.io/static/v1?label=State-of-the-art&message=Shitcode&color=7B5804)](https://github.com/trekhleb/state-of-the-art-shitcode)

๋ฑƒ์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋งˆํฌ๋‹ค์šด ์†Œ์Šค์ฝ”๋“œ:

```
[![State-of-the-art Shitcode](https://img.shields.io/static/v1?label=State-of-the-art&message=Shitcode&color=7B5804)](https://github.com/trekhleb/state-of-the-art-shitcode)
```

## ๊ทœ์น™

### ๐Ÿ’ฉ ๋ณ€์ˆ˜ ์ด๋ฆ„ ์• ๋งคํ•˜๊ฒŒ ์ง€์ •ํ•˜๊ธฐ

์ ์€ ํ‚ค ์ž…๋ ฅ์€, ์—ฌ๋Ÿฌ๋ถ„์˜ ์‹œ๊ฐ„์„ ์•„๋ผ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

_Good ๐Ÿ‘๐Ÿป_

```javascript
let a = 42;
```

_Bad ๐Ÿ‘Ž๐Ÿป_

```javascript
let age = 42;
```

### ๐Ÿ’ฉ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ์ด๋ฆ„ ์Šคํƒ€์ผ์„ ์„ž๊ธฐ

๋‹ค์–‘์„ฑ์„ ์ถ•ํ•˜ํ•ฉ์‹œ๋‹ค.

_Good ๐Ÿ‘๐Ÿป_

```javascript
let wWidth = 640;
let w_height = 480;
```

_Bad ๐Ÿ‘Ž๐Ÿป_

```javascript
let windowWidth = 640;
let windowHeight = 480;
```

### ๐Ÿ’ฉ ์ฃผ์„์„ ์ „ํ˜€ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ธฐ

์–ด์ฐจํ”ผ ์•„๋ฌด๋„ ๋‹น์‹ ์˜ ์ฝ”๋“œ๋ฅผ ์ฝ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

_Good ๐Ÿ‘๐Ÿป_

```javascript
const cdr = 700;
```

_Bad ๐Ÿ‘Ž๐Ÿป_

์ž์ฃผ ์ž‘์„ฑ๋˜๋Š” ์ฃผ์„์€ '์™œ'๊ฐ€ ์•„๋‹ˆ๋ผ '๋ฌด์—‡'์ธ์ง€๋ฅผ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์ผ ์ฝ”๋“œ์—์„œ '๋ฌด์—‡'์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์œผ๋ฉด, ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ํํŠธ๋Ÿฌ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

```javascript
// 700ms๋ผ๋Š” ์ˆ˜๋Š” UX A/B ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์— ๊ธฐ์ดˆํ•˜์—ฌ ๊ฒฝํ—˜์ ์œผ๋กœ ๊ณ„์‚ฐ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
// @๋ณด์„ธ์š”: <์‹คํ—˜ ๋˜๋Š” JIRA ์ž‘์—…์— ๊ด€๋ จ๋œ ๊ฒƒ ๋˜๋Š” ์ˆซ์ž 700์— ๋Œ€ํ•ด ์ƒ์„ธํžˆ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋งํฌ>
const callbackDebounceRate = 700;
```

### ๐Ÿ’ฉ ํ•ญ์ƒ ์ž์‹ ์˜ ๋ชจ๊ตญ์–ด๋กœ ์ฃผ์„์„ ์ž‘์„ฑํ•˜๊ธฐ

๋งŒ์ผ "์ฃผ์„ ์—†์Œ"์˜ ์›์น™์„ ์œ„๋ฐ˜ํ–ˆ๋‹ค๋ฉด ์ ์–ด๋„ ์ฃผ์„์€ ์ฝ”๋“œ ์ž‘์„ฑ์— ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์™€ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑํ•˜์„ธ์š”. ๋งŒ์ผ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ชจ๊ตญ์–ด๊ฐ€ ์˜์–ด๋ผ๋ฉด ์—ฌ๋Ÿฌ๋ถ„์€ ์ด ์›์น™์„ ์œ„๋ฐ˜ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

_Good ๐Ÿ‘๐Ÿป_

```javascript
// ะ—ะฐะบั€ะธะฒะฐั”ะผะพ ะผะพะดะฐะปัŒะฝะต ะฒั–ะบะพะฝะตั‡ะบะพ ะฟั€ะธ ะฒะธะฝะธะบะฝะตะฝะฝั– ะฟะพะผะธะปะบะธ.
toggleModal(false);
```

_Bad ๐Ÿ‘Ž๐Ÿป_

```javascript
// Hide modal window on error.
toggleModal(false);
```

### ๐Ÿ’ฉ ๊ฐ€๋Šฅํ•œ ๋งŽ์ด ์„œ์‹ ์Šคํƒ€์ผ์„ ํ˜ผํ•ฉํ•˜๊ธฐ

๋‹ค์–‘์„ฑ์„ ์ถ•ํ•˜ํ•ฉ์‹œ๋‹ค.

_Good ๐Ÿ‘๐Ÿป_

```javascript
let i = ['tomato', 'onion', 'mushrooms'];
let d = [ "ketchup", "mayonnaise" ];
```

_Bad ๐Ÿ‘Ž๐Ÿป_

```javascript
let ingredients = ['tomato', 'onion', 'mushrooms'];
let dressings = ['ketchup', 'mayonnaise'];
```

### ๐Ÿ’ฉ ๊ฐ€๋Šฅํ•œ ๋งŽ์ด ํ•œ ์ค„์— ์ฝ”๋“œ ์ž…๋ ฅํ•˜๊ธฐ

_Good ๐Ÿ‘๐Ÿป_

```javascript
document.location.search.replace(/(^\?)/,'').split('&').reduce(function(o,n){n=n.split('=');o[n[0]]=n[1];return o},{})
```

_Bad ๐Ÿ‘Ž๐Ÿป_

```javascript
document.location.search
.replace(/(^\?)/, '')
.split('&')
.reduce((searchParams, keyValuePair) => {
keyValuePair = keyValuePair.split('=');
searchParams[keyValuePair[0]] = keyValuePair[1];
return searchParams;
},
{}
)
```

### ๐Ÿ’ฉ ์กฐ์šฉํžˆ ์‹คํŒจํ•˜๊ธฐ

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๊ทธ ์˜ค๋ฅ˜๋ฅผ ์•Œ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ๋„ ์—†๊ณ , ์˜ค๋ฅ˜ ๋ชจ๋‹ฌ๋„ ์—†์ด, ์‹ธ๋Š˜ํ•˜๊ฒŒ.

_Good ๐Ÿ‘๐Ÿป_

```javascript
try {
// ๋ฌด์–ธ๊ฐ€ ์˜ˆ๊ฒฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ.
} catch (error) {
// ์‰ฟ... ๐Ÿคซ
}
```

_Bad ๐Ÿ‘Ž๐Ÿป_

```javascript
try {
// ๋ฌด์–ธ๊ฐ€ ์˜ˆ๊ฒฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ.
} catch (error) {
setErrorMessage(error.message);
// and/or
logError(error);
}
```

### ๐Ÿ’ฉ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ

์„ธ๊ณ„์ ์ธ ์›์น™์ž…๋‹ˆ๋‹ค.

_Good ๐Ÿ‘๐Ÿป_

```javascript
let x = 5;

function square() {
x = x ** 2;
}

square(); // ์ด์ œ x๋Š” 25์ž…๋‹ˆ๋‹ค.
```

_Bad ๐Ÿ‘Ž๐Ÿป_

```javascript
let x = 5;

function square(num) {
return num ** 2;
}

x = square(x); // ์ด์ œ x๋Š” 25์ž…๋‹ˆ๋‹ค.
```

### ๐Ÿ’ฉ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋ณ€์ˆ˜ ๋งŒ๋“ค๊ธฐ

ํ˜น์‹œ ๋ชจ๋ฅด๋‹ˆ๊นŒ์š”.

_Good ๐Ÿ‘๐Ÿป_

```javascript
function sum(a, b, c) {
const timeout = 1300;
const result = a + b;
return a + b;
}
```

_Bad ๐Ÿ‘Ž๐Ÿป_

```javascript
function sum(a, b) {
return a + b;
}
```

### ๐Ÿ’ฉ ๊ฐ€๋Šฅํ•œ ์–ธ์–ด๋ผ๋ฉด ํƒ€์ž…์ง€์ • ๋ฐ/๋˜๋Š” ํƒ€์ž…๊ฒ€์‚ฌ ํ•˜์ง€ ์•Š๊ธฐ

_Good ๐Ÿ‘๐Ÿป_

```javascript
function sum(a, b) {
return a + b;
}

// ํ˜•์‹์ด ์—†์œผ๋ฉด ์‹ ์ด ๋‚˜์š”.
const guessWhat = sum([], {}); // -> "[object Object]"
const guessWhatAgain = sum({}, []); // -> 0
```

_Bad ๐Ÿ‘Ž๐Ÿป_

```javascript
function sum(a: number, b: number): ?number {
// ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฐ˜ํ™˜ ๋ฐ/๋˜๋Š” ํƒ€์ž…๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ์ปค๋ฒ„ํ•˜๋Š” ์กฐ๊ฑด
if (typeof a !== 'number' && typeof b !== 'number') {
return undefined;
}
return a + b;
}
// ์ด ๊ฒฝ์šฐ๋Š” ๋ฐ˜ํ™˜/์ปดํŒŒ์ผ์˜ ๊ฒฝ์šฐ์— ์‹คํŒจํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
const guessWhat = sum([], {}); // -> undefined
```

### ๐Ÿ’ฉ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ

์ด ๊ฒƒ์ด ์—ฌ๋Ÿฌ๋ถ„์˜ "ํ”Œ๋žœ B" ์ž…๋‹ˆ๋‹ค.

_Good ๐Ÿ‘๐Ÿป_

```javascript
function square(num) {
if (typeof num === 'undefined') {
return undefined;
}
else {
return num ** 2;
}
return null; // ์ด ๊ฒƒ์ด ๋‚˜์˜ "ํ”Œ๋žœ B".
}
```

_Bad ๐Ÿ‘Ž๐Ÿป_

```javascript
function square(num) {
if (typeof num === 'undefined') {
return undefined;
}
return num ** 2;
}
```

### ๐Ÿ’ฉ ์‚ผ๊ฐํ˜• ๊ทœ์น™

์ƒˆ์ฒ˜๋Ÿผ ๋˜์ž - ๋‘ฅ์ง€๋ฅผ ํ‹€์ž, ๋‘ฅ์ง€๋ฅผ ํ‹€์ž, ๋‘ฅ์ง€๋ฅผ ํ‹€์ž.

_Good ๐Ÿ‘๐Ÿป_

```javascript
function someFunction() {
if (condition1) {
if (condition2) {
asyncFunction(params, (result) => {
if (result) {
for (;;) {
if (condition3) {
}
}
}
})
}
}
}
```

_Bad ๐Ÿ‘Ž๐Ÿป_

```javascript
async function someFunction() {
if (!condition1 || !condition2) {
return;
}

const result = await asyncFunction(params);
if (!result) {
return;
}

for (;;) {
if (condition3) {
}
}
}
```

### ๐Ÿ’ฉ ๋“ค์—ฌ์“ฐ๊ธฐ ๋ง์น˜๊ธฐ

๋“ค์—ฌ์“ฐ๊ธฐ๋Š” ์—๋””ํ„ฐ์—์„œ ๋ณต์žกํ•œ ์ฝ”๋“œ์˜ ๊ณต๊ฐ„์„ ๋” ์ฐจ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ํ”ผํ•ฉ์‹œ๋‹ค. ๋งŒ์•ฝ ํ”ผํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๊ทธ๋ƒฅ ๊ทธ๋“ค์„ ์—‰๋ง์œผ๋กœ ๊ฐ€์ง€๊ณ  ๋…ธ์„ธ์š”.

_Good ๐Ÿ‘๐Ÿป_

```javascript
const fruits = ['apple',
'orange', 'grape', 'pineapple'];
const toppings = ['syrup', 'cream',
'jam',
'chocolate'];
const desserts = [];
fruits.forEach(fruit => {
toppings.forEach(topping => {
desserts.push([
fruit,topping]);
});})
```

_Bad ๐Ÿ‘Ž๐Ÿป_

```javascript
const fruits = ['apple', 'orange', 'grape', 'pineapple'];
const toppings = ['syrup', 'cream', 'jam', 'chocolate'];
const desserts = [];

fruits.forEach(fruit => {
toppings.forEach(topping => {
desserts.push([fruit, topping]);
});
})
```

### ๐Ÿ’ฉ dependencies ์ž ๊ทธ์ง€ ์•Š๊ธฐ

์ƒˆ๋กœ์šด ์„ค์น˜๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์ œ์–ด๋˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ dependencies๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜์„ธ์š”. ์™œ ๊ณผ๊ฑฐ์— ์ง‘์ฐฉํ•˜์ฃ , ์ตœ์ฒจ๋‹จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค.

_Good ๐Ÿ‘๐Ÿป_

```
$ ls -la

package.json
```

_Bad ๐Ÿ‘Ž๐Ÿป_

```
$ ls -la

package.json
package-lock.json
```

### ๐Ÿ’ฉ ํ•ญ์ƒ boolean ํƒ€์ž… ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ 'flag'๋กœ ๋งŒ๋“ค๊ธฐ

boolean ๊ฐ’์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๋™๋ฃŒ๋“ค์ด ์ƒ๊ฐํ•  ๊ณต๊ฐ„์„ ๋‚จ๊ฒจ๋‘ก์‹œ๋‹ค.

_Good ๐Ÿ‘๐Ÿป_

```javascript
let flag = true;
```

_Bad ๐Ÿ‘Ž๐Ÿป_

```javascript
let isDone = false;
let isEmpty = false;
```

### ๐Ÿ’ฉ ๊ธธ๊ฒŒ ์“ฐ์ธ function๋“ค์ด ์งง์€ ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ ๋กœ์ง์„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ„์ง€ ๋ง™์‹œ๋‹ค. ๋งŒ์ผ ์—ฌ๋Ÿฌ๋ถ„์ด ์‚ฌ์šฉํ•˜๋Š” IDE์˜ ๊ฒ€์ƒ‰์ด ์ค‘๋‹จ๋˜๊ณ  ํ•„์ˆ˜์ ์ธ ํŒŒ์ผ ๋˜๋Š” function์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๊ฒ ์Šต๋‹ˆ๊นŒ?

- ํ•œ ๊ฐœ์˜ ํŒŒ์ผ์— 10000 ์ค„์˜ ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
- ํ•œ ๊ฐœ์˜ function์— 1000 ์ค„์˜ ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
- ๋งŽ์€ ์„œ๋น„์Šค๋“ค (์จ๋“œํŒŒํ‹ฐ์™€ ๋‚ด๋ถ€๊ธฐ๋Šฅ, ๋ช‡๋ช‡ ํ—ฌํผ๋“ค, ORM๊ณผ jQuery slider๋กœ ์ง์ ‘ ์ž‘์„ฑ๋œ ์ž๋ฃŒ๋“ค ) ์ด `service.js` ํ•˜๋‚˜์— ๋“ค์–ด์žˆ๋‹ค๊ตฌ์š”? ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

### ๐Ÿ’ฉ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ

์ด ๊ฒƒ์€ ์ค‘๋ณต๋˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์ผ์˜ ์–‘์ž…๋‹ˆ๋‹ค.

### ๐Ÿ’ฉ ์ตœ๋Œ€ํ•œ code linter๋“ค์„ ํ”ผํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ธฐ

ํŠนํžˆ ๋‘˜ ์ด์ƒ์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์žˆ๋Š” ํŒ€์ธ ๊ฒฝ์šฐ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ '์ž์œ '์˜ ๊ทœ์น™์ž…๋‹ˆ๋‹ค.

### ๐Ÿ’ฉ README ํŒŒ์ผ์ด ์—†์ด ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ

๊ทธ๋ฆฌ๊ณ  ๋‹น๋ถ„๊ฐ„์€ ๊ทธ๋ ‡๊ฒŒ ์ง€๋‚ด์„ธ์š”.

### ๐Ÿ’ฉ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

์–ดํ”Œ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•˜์ง€ ๋งˆ์„ธ์š”. ๊ธฐ๊ปํ•ด์•ผ, ์ฃผ์„์ •๋„ ์ž…๋‹ˆ๋‹ค.