본문 바로가기

Refactoring

.net Winform 에서 코드 룩업하기 리펙토링 step4

Step4

 Step3 문제점

 콤보박스에 코드를 바인딩하는 부분은 나름 괜찮게 클래스로 빠져나간듯 하다. 다른 화면에서도 생성시 어떤 콤보박스가 어떤 코드를 참조하는지 데이터만 넘겨주면 바인딩은 앞으로 문제 없이 될 것 같다. 화면소스에서 바로 한가지 걸리는 것이 코드 데이터를 다루는 부분이 여전히 존재한다.

 Step3 해결

 코드를 데이터를 다루는 부분을 CodeRepository라는 클래스로 빼내도록 하겠다. 이렇게 됨으로서 화면과 관련되지 않은 처리를 CodeRepository 클래스가 처리하도록 분리하였다.

 추가된 클래스 및 화면소스

    public class CodeDataRepository
    {
        private List<CodeData> codeDatas = new List<CodeData>();
        public CodeDataRepository()
        {
            codeDatas.Add(new CodeData() { CodeDiv = "01", Code = "01.01", Caption = "매입" });
            codeDatas.Add(new CodeData() { CodeDiv = "01", Code = "01.02", Caption = "매출" });
            codeDatas.Add(new CodeData() { CodeDiv = "01", Code = "01.03", Caption = "기타" });

            codeDatas.Add(new CodeData() { CodeDiv = "02", Code = "02.01", RefCodeDiv = "01.01", Caption = "계약매입" });
            codeDatas.Add(new CodeData() { CodeDiv = "02", Code = "02.02", RefCodeDiv = "01.01", Caption = "현장매입" });
            codeDatas.Add(new CodeData() { CodeDiv = "02", Code = "02.03", RefCodeDiv = "01.02", Caption = "본사매출" });
            codeDatas.Add(new CodeData() { CodeDiv = "02", Code = "02.04", RefCodeDiv = "01.02", Caption = "현장매출" });
            codeDatas.Add(new CodeData() { CodeDiv = "02", Code = "02.05", RefCodeDiv = "01.03", Caption = "기타매입" });
            codeDatas.Add(new CodeData() { CodeDiv = "02", Code = "02.06", RefCodeDiv = "01.03", Caption = "기타매출" });
        }
        public IEnumerable<CodeData> GetCodeDatas(string codeDiv)
        {
            return codeDatas.Where(x => x.CodeDiv.Equals(codeDiv)).Select(x => x);
        }
    }
public partial class Form1 : Form
{
    private ComboBoxCodeBinder comboBoxCodeBinder1;
    private ComboBoxCodeBinder comboBoxCodeBinder2;
    private CodeDataRepository codeDataRepository;
    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        this.codeDataRepository  = new CodeDataRepository();
        this.comboBoxCodeBinder1 = new ComboBoxCodeBinder(comboBox1, codeDataRepository.GetCodeDatas("01") );
        this.comboBoxCodeBinder2 = new ComboBoxCodeBinder(comboBox2, codeDataRepository.GetCodeDatas("02"), this.comboBoxCodeBinder1);

        button1.Click += new EventHandler(Event_ClickButton);
    }
    private void Event_ClickButton(object sender, EventArgs e)
    {
        string combo1Value = this.comboBoxCodeBinder1.GetCode();
        string combo2Value = this.comboBoxCodeBinder2.GetCode();

        //something...
    }
}

 화면과 관련없었던 코드데이터를 관리해주는 코드가 빠지고 나니 화면구동 소스가 매우 깔끔해졌다. 유관상으로 보기에는 코드가 간결해졌으면 재사용을 하기도 편리하게 만들어진 것으로 보인다.