2024. 8. 10. 15:21ใํ๊ณ
๊ฐ์ง ์ค๋ณต์ด๋?
๊ฐ์ง ์ค๋ณต(Accidental Duplication)์ด๋ ๋ ๊ฐ์ ์ฝ๋ ์์ญ์ด ์ค์ ๋ก๋ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ํ์ง๋ง, ๊ฒ๋ณด๊ธฐ์๋ ์ค๋ณต์ฒ๋ผ ๋ณด์ด๋ ์ํฉ์ ์๋ฏธํ๋ค. ์ด๋ฌํ ๊ฐ์ง ์ค๋ณต์ ์ ๋๋ก ์ธ์งํ์ง ๋ชปํ๊ณ ํ๋์ ๋ฉ์๋๋ก ๋ฌถ๊ฒ ๋๋ฉด, ์๋ก ๋ค๋ฅธ ๋งฅ๋ฝ์ ๊ฐ์ง ์ฝ๋๊ฐ ๊ฐ์ ๊ณต๊ฐ์ ๋ค์์ฌ ์๊ฒ ๋์ด ์ ์ง๋ณด์์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๊ฒ ๋๋ค. ํ๋ก์ ํธ๋ฅผ ํ๋ค๋ณด๋ฉด ์ด๋ฐ ๊ฐ์ง ์ค๋ณต์ฝ๋๋ฅผ ์ง์ง ์ค๋ณต์ฝ๋๋ก ํ๋ณํ์ฌ ๋ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์์ ์ํฉ
์ด๋ค ํต๊ณ ํ์ด์ง๋ฅผ ๋ง๋ ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ด ํ์ด์ง์์๋ ์กฐํ ์ ๋น๊ต ๊ธฐ์ค์ผ๋ก '๊ธฐ์ค๋ ๋'์ '์ฌ์ ๊ณํ'์ด ์กด์ฌํฉ๋๋ค. ๋น๊ต ๊ธฐ์ค์ด ๋ฌด์์ด๋ ์์ ์ธก๋ฉด์์ ๋ณด๋ฉด ๊ทธ๋ฆฌ๋์ ์ฐจํธ๋ฅผ ๊ทธ๋ฆฌ๋ ๊ฒ์ ๋์ผํ๋ค.
๋ฐ๋ผ์ ์ด ๋์ ๊ณตํต๋ก์ง์ผ๋ก ์์ฑํ๋ค.
AS-IS: ํ๋์ ๋ฉ์๋์์ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ
scwin.fn.createGridView = (searchType) => {
// ๊ทธ๋ฆฌ๋ id ์์ฑ
// ๊ทธ๋ฆฌ๋ ํค๋, Body ์์ฑ
if (searchType == "๊ธฐ์ค๋
๋") {
// ...
} else if (searchType == "์ฌ์
๊ณํ") {
// ...
}
// ๊ทธ๋ฆฌ๋ subTotal ์์ฑ
// ๊ทธ๋ฆฌ๋ footer ์์ฑ
if (searchType == "๊ธฐ์ค๋
๋") {
// ...
} else if (searchType == "์ฌ์
๊ณํ") {
// ...
}
}
์ด ๋ฐฉ์์ ๋ฌธ์ ์ :
- ํ๋ผ๋ฏธํฐ๊ฐ ์ฌ๋ฌ ๊ฐ ์ถ๊ฐ๋๋ค๋ฉด if (searchType == "์ฌ์ ๊ณํ" && isGroup == true && ...) ์ ๊ฐ์ด ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๋ค.
- ์ถํ ์ฌ์ ๊ณํ๋ง ์์ ํด์ผ ํ๋ค๋ฉด, ๊ธฐ์ค๋ ๋์ ๋ํ ๋ก์ง์ ๊ฑด๋๋ฆด ์ํ์ด ์์ด ์์ ์ด ์ด๋ ค์์ง๋ค.
- ์๋ก์ด ์กฐํ ๊ธฐ์ค์ด ์ถ๊ฐ๋๋ค๋ฉด, if๋ฌธ ๊ฐ์๋งํผ ๋ถ๊ธฐ๋ฅผ ์ถ๊ฐํด์ผ ํ๊ณ ํ๋์ ๋ฉ์๋ ์์ ๋ชจ๋ ์กฐํ ๊ธฐ์ค ๋ก์ง์ด ์์ด ๋ณ๊ฒฝ์ ์ฌํ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
TO-BE: ํด๊ฒฐ ๋ฐฉ์
๋ณํ์ง ์๋ ๋ถ๋ถ๊ณผ ๋ณํ๋ ๋ถ๋ถ์ ๋ถ๋ฆฌํ๋ค.
scwin.fn.createGridView = (searchType) => {
// ๊ณตํต๋ก์ง
// 1. ๊ทธ๋ฆฌ๋ id ์์ฑ
// 2. ๊ทธ๋ฆฌ๋ css ์ค์
// 3. ๊ทธ๋ฆฌ๋ ๋ ์ด์์ ์ค์
if (searchType == "๊ธฐ์ค๋
๋") {
({ header, body, footer_row } = scwin.fn.getBaseYearGridViewTemplate(service, isGroup));
} else if (searchType == "์ฌ์
๊ณํ") {
({ header, body, footer_row } = scwin.fn.getGoalYearGridViewTemplate(service, isGroup));
}
// ๊ณตํต๋ก์ง
// 4. ๊ทธ๋ฆฌ๋ ์์ฑ
}
scwin.fn.getBaseYearGridViewTemplate = (service, isGroup) => {
// ๊ทธ๋ฆฌ๋ ํค๋, ๋ฐ๋, ํธํฐ ์์ฑ ํ ๋ฐํ
}
scwin.fn.getGoalYearGridViewTemplate = (service, isGroup) => {
// ๊ทธ๋ฆฌ๋ ํค๋, ๋ฐ๋, ํธํฐ ์์ฑ ํ ๋ฐํ
}
์ด ๋ฐฉ์์ ์ฅ์ :
- ์ฌ์ ๊ณํ์ ๋ํ ์์ ์ getGoalYearGridViewTemplate ๋ฉ์๋๋ง ์์ ํ๋ฉด ๋๋ค.
- ๊ธฐ์ค๋ ๋์ ๋ํ ๋ณ๊ฒฝ ์ฌํ๋ฅผ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์๋ค.
- ์๋ก์ด ์กฐํ ๊ธฐ์ค ์ถ๊ฐ ์ ๋ค๋ฅธ ๊ธฐ์ค์ ๋ํ ๋ณ๊ฒฝ ์ฌํ๋ฅผ ๊ณ ๋ คํ์ง ์์๋ ๋๋ค.
Java์์์ ์ ์ฉ: ๋คํ์ฑ ํ์ฉ
Java์์๋ ๋คํ์ฑ์ ํ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. ๋คํ์ฑ์ด๋ ํ๋์ ๊ฐ์ฒด์ ์ฌ๋ฌ ๊ฐ์ง ํ์ ์ ๋์ ํ ์ ์๋ ๊ฒ์ ๋งํฉ๋ค.
abstract class ComparisonRuleService {
public void getGridView() {
// ๊ณตํต๋ก์ง ์คํ
// ์ถ์๋ฉ์๋ getGridViewTemplate ํธ์ถ.
}
public abstract void getGridViewTemplate();
}
class BaseYearRuleService extends ComparisonRuleService {
@Override
public void getGridViewTemplate() {
// ๊ธฐ์ค๋
๋ ๊ทธ๋ฆฌ๋ ๋ทฐ ๋ฐํ
}
}
class GoalYearRuleService extends ComparisonRuleService {
@Override
public void getGridViewTemplate() {
// ์ฌ์
๊ณํ ๊ทธ๋ฆฌ๋ ๋ทฐ ๋ฐํ
}
}
ํด๋ผ์ด์ธํธ ์ฝ๋
class Client {
private final ComparisonRuleService comparisonRuleService;
public Client(ComparisonRuleService service) {
// Public ๋ฉ์๋ ํธ์ถ.
service.getGridView();
}
}
์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์๋ก์ด ๊ท์น(์: ์์ธก๋ ๋, ํ๊ฐ๋ ๋)์ ์ถ๊ฐํ๊ณ ์ถ์ ๋ ComparisonRuleService๋ฅผ ์์๋ฐ๋ ์๋ก์ด ํด๋์ค๋ฅผ ์์ฑํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ด๋ ํ์ฅ์ฑ์ ํฌ๊ฒ ํฅ์์ํจ๋ค
์ด๋ฌํ ํํ๋ฅผ ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ด๋ผ๊ณ ํ๋ค.
๊ฒฐ๋ก
์๊ตฌ์ฌํญ์ ์ฝ๋๋ก ๊ตฌํํ ๋๋ ์ต์ํ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ๊ณผ ํ์ฅ ๊ฐ๋ฅ์ฑ์ ์ผ๋์ ๋๊ณ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค. ์ด๋ฅผ ํตํด ๋ฏธ๋์ ๋ณ๊ฒฝ์ฌํญ์ ๋ ์ ์ฐํ๊ฒ ๋์ํ ์ ์๊ณ , ์ฝ๋์ ์ ์ง๋ณด์์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ค.