본문 바로가기

Refactoring

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

1. 스텝1

 기본적인 기능 구현을 아래 코드로 나타내고자 한다. 코드데이터는 보통 데이터베이스에서 관리하는데 데이터베이스 연결없이 코드데이터 클래스로 대체를 하고자 한다. 실전에서도 데이터베이스에 불려나온 코드를 관리하는 쪽에서는 코드데이터 클래스를 그대로 사용하여 개발을 진행하였고 이 방식이 더 효율적이라고 생각한다.

코드데이터 클래스는 단순히 코드의 구분, 코드, 화면 텍스트값, 참조코드 구분값을 가지고 있는 데이터 클래스이다.

    public class CodeData
    {
        public string CodeDiv    { get; set; } //코드구분
        public string Code       { get; set; } //코드
        public string Caption    { get; set; } //코드명
        public string RefCodeDiv { get; set; } //참조구분
    }

화면소스

namespace LookUpCode_Step1
{
    public partial class Form1 : Form
    {
        private List<CodeData> codeDatas = new List<CodeData>();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            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", RefCode = "01.01", Caption = "계약매입" });
            codeDatas.Add(new CodeData() { CodeDiv = "02", Code = "02.02", RefCode = "01.01", Caption = "현장매입" });
            codeDatas.Add(new CodeData() { CodeDiv = "02", Code = "02.03", RefCode = "01.02", Caption = "본사매출" });
            codeDatas.Add(new CodeData() { CodeDiv = "02", Code = "02.04", RefCode = "01.02", Caption = "현장매출" });
            codeDatas.Add(new CodeData() { CodeDiv = "02", Code = "02.05", RefCode = "01.03", Caption = "기타매입" });
            codeDatas.Add(new CodeData() { CodeDiv = "02", Code = "02.06", RefCode = "01.03", Caption = "기타매출" });

            comboBox1.DisplayMember = "Caption";
            comboBox1.ValueMember = "Code";
            comboBox2.DisplayMember = "Caption";
            comboBox2.ValueMember = "Code";

            comboBox1.Enter += new EventHandler(Event_EnterComboBox1);
            comboBox2.Enter += new EventHandler(Event_EnterComboBox2);

            button1.Click += new EventHandler(Event_ClickButton);
        }

        private string GetComoboBoxValue(ComboBox comboBox)
        {
            string value = string.Empty;

            object selectedObject = comboBox.SelectedItem;

            if (selectedObject != null)
                value = ((CodeData)comboBox.SelectedItem).Code;

            return value;
        }
        private void Event_ClickButton(object sender, EventArgs e)
        {
            string combo1Value = GetComoboBoxValue(comboBox1);
            string combo2Value = GetComoboBoxValue(comboBox2);

            //something...
        }
        private void Event_EnterComboBox1(object sender, EventArgs e)
        {
            comboBox1.DataSource = new BindingSource()
            {
                DataSource = codeDatas.Where(x => x.CodeDiv.Equals("01")).Select(x => x)
            };
        }
        private void Event_EnterComboBox2(object sender, EventArgs e)
        {
            comboBox2.DataSource = new BindingSource()
            {
                DataSource = codeDatas.Where(x => x.CodeDiv.Equals("02") && x.RefCodeDiv.Equals(GetComoboBoxValue(comboBox1))).Select(x => x)
            };
        }
    }
}

기본 소스는 간단하다. 콤보박스에 포커스나 마우스클릭으로 진입이 되면 리스트로 표기되어야 될 코드 데이터를 보여주는 코드이다. ComboBox2는 ComboBox2의 값이 무엇이냐에 따라서 바인딩 되는 데이터가 다르다는 점이 조금의 차이일 뿐이다.