CleanCode TIL (2022.02.10)

Henry Choยท2022๋…„ 2์›” 10์ผ
0

๋…ธ๊ฐœ๋ถ

๋ชฉ๋ก ๋ณด๊ธฐ
18/31

DAY 20

๐Ÿ”–ย ์˜ค๋Š˜ ์ฝ์€ ๋ฒ”์œ„ : 10. ํด๋ž˜์Šค (185~191p)


๐Ÿค“ย ์ฑ…์—์„œ ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ

๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฌ์šด ํด๋ž˜์Šค

public class Sql {
    public Sql(String table, Column[] columns)
    public String create()
    public String insert(Object[] fields)
    public String selectAll()
    public String findByKey(String keyColumn, String keyValue)
    public String select(Column column, String pattern)
    public String select(Criteria criteria)
    public String preparedInsert()
    private String columnList(Column[] columns)
    private String valuesList(Object[] fields, final Column[] columns) private String selectWithCriteria(String criteria)
    private String placeholderList(Column[] columns)
}
  • SELECT ๋งŒ ์ง€์›ํ•˜๋‹ค๊ฐ€ UPDATE ๋ฌธ์ด ํ•„์š”ํ•˜๋ฉด ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•œ๋‹ค โ†’ SRP์œ„๋ฐ˜
abstract public class Sql {
    public Sql(String table, Column[] columns) abstract public String generate();
}
public class CreateSql extends Sql {
    public CreateSql(String table, Column[] columns) @Override public String generate()
}
public class SelectSql extends Sql {
    public SelectSql(String table, Column[] columns) @Override public String generate()
}
public class InsertSql extends Sql {
    public InsertSql(String table, Column[] columns, Object[] fields) @Override public String generate()
    private String valuesList(Object[] fields, final Column[] columns)
}
public class SelectWithCriteriaSql extends Sql {
    public SelectWithCriteriaSql(
        String table, Column[] columns, Criteria criteria) @Override public String generate()
}
public class SelectWithMatchSql extends Sql {
    public SelectWithMatchSql(
        String table, Column[] columns, Column column, String pattern) @Override public String generate()
}
public class FindByKeySql extends Sql public FindByKeySql(
    String table, Column[] columns, String keyColumn, String keyValue)
@Override public String generate()
}
public class PreparedInsertSql extends Sql {
    public PreparedInsertSql(String table, Column[] columns) @Override public String generate() {
        private String placeholderList(Column[] columns)
    }
    public class Where {
        public Where(String criteria) public String generate()
    }
    public class ColumnList {
        public ColumnList(Column[] columns) public String generate()
    }
}
  • public ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ Sql ํด๋ž˜์Šค์—์„œ ํŒŒ์ƒํ•˜๋Š” ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌ
  • valuList์™€ ๊ฐ™์€ private ๋ฉ”์„œ๋“œ๋Š” ํ•ด๋‹น ํŒŒ์ƒ ํด๋ž˜์Šค๋กœ ์ด๋™
  • ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” private ๋ฉ”์„œ๋“œ๋Š” Where ๊ณผ ColumnList ๋ผ๋Š” ์œ ํ‹ธ ํด๋ž˜์Šค์— ํฌํ•จ
  • UPDATE ๋ฌธ์„ ์ถ”๊ฐ€ํ• ๋•Œ๋„ ์ƒˆ UpdateSql ์ด๋ผ๋Š” ํด๋ž˜์Šค๋งŒ ์ƒ์†๋ฐ›์•„ ๋„ฃ๋Š”๋‹ค โ†’ ๋‹ค๋ฅธ์ฝ”๋“œ๋Š” ๋ง๊ฐ€์ง€์ง€์•Š์Œ
  • SRP ์ง€์›
  • OpenClosedPrinciple ์ง€์›: ํ™•์žฅ์— ๊ฐœ๋ฐฉ์ ์ด๊ณ  ์ˆ˜์ •์— ํ์‡„์ ์ด์–ด์•ผ ํ•œ๋‹ค

๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ๊ฒฉ๋ฆฌ

  • ์ƒ์„ธํ•œ ๊ตฌํ˜„์— ์˜์กดํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ํด๋ž˜์Šค๋Š” ๊ตฌํ˜„์ด ๋ฐ”๋€Œ๋ฉด ์œ„ํ—˜ํ•˜๋‹ค โ†’ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๊ฒฉ๋ฆฌ

์ฃผ์‹ Portfolio ํด๋ž˜์Šค

  • 5๋ถ„๋งˆ๋‹ค ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๋Š” TokyoStockExchange API ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์งœ๊ธฐ ์–ด๋ ต๋‹ค
  • API ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹  StockExchange ๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ฑ ํ›„ ๋ฉ”์„œ๋“œ ์„ ์–ธ
public interface StockExchange {
    Money currentPrice(String symbol);
}
  • StockExchange ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” TokyoStockExchange ํด๋ž˜์Šค ๊ตฌํ˜„
  • Portfolio ์ƒ์„ฑ์ž์—์„œ StockExchange ์ฐธ์กฐ์ž ์ธ์ˆ˜๋กœ ๋ฐ›์Œ
public Portfolio {
    private StockExchange exchange;
    public Portfolio(StockExchange exchange) {
        this.exchange = exchange;
    }
    // ... }
}
  • ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋Š” StockExchange ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ ๊ณ ์ •๋œ ์ฃผ๊ฐ€๋ฅผ ๋ฐ˜ํ™˜(100๋ถˆ)
  • ์ „์ฒด portfolio ์ด๊ณ„๊ฐ€ 500๋ถˆ์ธ์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ๊ฐ€๋Šฅ
public class PortfolioTest {
    private FixedStockExchangeStub exchange;
    private Portfolio portfolio;
    @Before
    protected void setUp() throws Exception {
        exchange = new FixedStockExchangeStub();
        exchange.fix("MSFT", 100);
        portfolio = new Portfolio(exchange);
    }
    @Test
    public void GivenFiveMSFTTotalShouldBe500() throws Exception {
        portfolio.add(5, "MSFT");
        Assert.assertEquals(500, portfolio.value());
    }
}
  • ์‹œ์Šคํ…œ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ท„๊ธฐ ๋•Œ๋ฌธ์— ์œ ์—ฐ์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ ๋†’์•„์ง
  • DIP(Dependency Inversion Principle)๋ฅผ ๋”ฐ๋ฆ„: ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ธํ•œ ๊ตฌํ˜„์ด ์•„๋‹ˆ๋ผ ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค
  • Portfolio ํด๋ž˜์Šค๋Š” TokyoStockExchange ๋ผ๋Š” ์ƒ์„ธํ•œ ๊ตฌํ˜„ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ StockExchange ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๊ฐ€๋ฅผ ์–ป์–ด์˜ค๋Š” ์ถœ์ฒ˜๋‚˜ ๋“ฑ ๊ตฌ์ฒด์ ์ธ ์‚ฌ์‹ค์„ ์ˆจ๊ธฐ๊ณ  ๊ฒฉ๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿค”ย ๋– ์˜ค๋ฅด๋Š” ์ƒ๊ฐ

  • ๊ตฌํ˜„์— ์–ฝ๋งค์ด์ง€ ๋ง๊ณ  ์ถ”์ƒํ™”๋ถ€ํ„ฐ ํ•˜๋Š” ์Šต๊ด€์„ ๊ธธ๋Ÿฌ์•ผํ•œ๋‹ค

๐Ÿ”Žย ์งˆ๋ฌธ

๐Ÿ“ย ์†Œ๊ฐ 3์ค„ ์š”์•ฝ

  • ํด๋ž˜์Šค๋ฅผ ์ž‘๊ฒŒ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฝ๋„๋ก ํ•œ๋‹ค
  • ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„๋ณด๋‹ค๋Š” ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ์œผ๋กœ๋ถ€ํ„ฐ ๊ฒฉ๋ฆฌํ•œ๋‹ค
  • SRP, OCP, DIP ์›์น™ ์ง€ํ‚ค๊ธฐ
profile
Full stack tech visionary

0๊ฐœ์˜ ๋Œ“๊ธ€