// 아래 구조는 파생 클래스를 생성하는 방식으로 새 기능에 개방적인 동시에 다른 클래스를 닫아놓는 방식으로 수정에 폐쇄적이다.
public abstract class Sql()
{
public void Sql(string table, Column[] columns);
public abstract string Generate();
}
public class CreateSql : Sql
{
public void CreateSql(string table, Column[] columns);
public override string Generate();
}
public class SelectSql : Sql
{
public void SelectSql(string table, Column[] columns);
public override string Generate();
}
public class InsertSql : Sql
{
public void InsertSql(string table, Column[] columns, object[] fields);
public override string Generate();
private string valuesList(object[] fields, Column[] columns);
}
낮은 시스템 결합도
// 주식 기호를 받아 현재 주식 가격을 반환한다는 추상적인 개념 표현
// 이와 같은 추상화로 실제로 주가를 얻어오는 출처나 알아오는 방식 등의 구체적인 사실들을 모두 숨김
public interface IStockExchange
{
Money CurrentPrice(string symbol);
}
// Portfolio는 IStockExchange 인터페이스에 의존
public class Portfolio
{
private IStockExchange exchange;
public Portfolio(IStockExchange exchange)
{
this.exchange = exchange;
}
//...
}
// Test code
public class PortfolioTest
{
private FixedStockExchangeStub exchange;
private Porfolio portfolio;
protected void SetUp()
{
exchange = new FixedStockExchangeStub();
exchange.fix("MSFT", 100);
portfolio = new Portfolio(exchange);
}
// Test Method
public void GivenFiveMSFTTotalShouldBe500()
{
try
{
portfolio.add(5, "MSTF");
Assert.assertEquals(500, portfolio.value());
}
catch
{
Assert.Fail($"예외 발생: {ex.Message}");
}
}
}