함수는 한 가지를 해야한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다.
한 가지만 하는 지 판단
해당 함수 아래에서 추상화 수준이 하나인지 판단한다.
1. 페이지가 테스트 페이지인지 판단한다.
2. 그렇다면 설정 페이지와 해제 페이지를 넣는다.
3. 페이지를 HTML로 랜더링한다.
→ 페이지가 테스트 페이지인지 확인 한 후 테스트 페이지라면 설정 페이지와 해제 페이지를 넣는다. 테스트 페이지든 아니든 페이지를 HTML로 렌더링한다.
의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 샘이다.
설정 페이지와 해제 페이지를 포함하려면, 설정 페이지를 포함하고,
테스트 페이지 내용을 포함하고, 해제 페이지를 포함한다.
설정 페이지를 포함하려면, ~
슈트 설정 페이지를 포함하려면, ~
부모 계층을 검색하려면, ~
추상 팩토리 패턴에 꽁꽁 숨긴다
// TypeHandlers.js
class TypeHandler {
getMessage() {
throw new Error("This method should be overridden");
}
}
class TypeAHandler extends TypeHandler {
getMessage() {
return "You selected Type A";
}
}
class TypeBHandler extends TypeHandler {
getMessage() {
return "You selected Type B";
}
}
class TypeCHandler extends TypeHandler {
getMessage() {
return "You selected Type C";
}
}
class DefaultHandler extends TypeHandler {
getMessage() {
return "Unknown type";
}
}
export class TypeFactory {
static createHandler(type) {
switch (type) {
case 'A':
return new TypeAHandler();
case 'B':
return new TypeBHandler();
case 'C':
return new TypeCHandler();
default:
return new DefaultHandler();
}
}
}
// App.js
import React, { useState } from 'react';
import { TypeFactory } from './TypeHandlers';
function App() {
const [message, setMessage] = useState('');
const handleClick = (type) => {
const handler = TypeFactory.createHandler(type);
setMessage(handler.getMessage());
};
return (
<div>
<h1>Select a Type</h1>
<button onClick={() => handleClick('A')}>Type A</button>
<button onClick={() => handleClick('B')}>Type B</button>
<button onClick={() => handleClick('C')}>Type C</button>
<button onClick={() => handleClick('D')}>Unknown Type</button>
<p>{message}</p>
</div>
);
}
export default App;
클린 코드(로버트 C 마틴)