bad coding practice (FA Team)
ComboBox 패턴
[ bad coding ]
아래 코드는 유진제지 프로젝트에 ComboBoxEx.cs 파일에 작성된 코드
ComboBoxEx 클래스, ComboBoxExItems 클래스의 정의가 굳이 필요하지 않음
ComboBoxEx 클래스에 findSelectKey, findSelectValue 메서드의 경우 자주 사용되는게 아니라면 정의할 필요가 없고, 자주 사용한다면 [#A03의 예시] 처럼 기능을 조금더 확장시켜 활용 가능
GetKey, GetValue 는 메서드로 정의할 필요 없음 [#A04 예시 참고]
public partial class ComboBoxEx : ComboBox
{
public ComboBoxEx()
{
DisplayMember = "DisplayEx";
ValueMember = "ValueEx";
this.ForeColor = Color.Black;
}
public ComboBoxEx(ComboBoxExItems items)
{
this.DisplayMember = "DisplayEx";
this.ValueMember = "ValueEx";
this.DataSource = items.getItems();
}
public void setDataSource(ComboBoxExItems items)
{
this.DataSource = items.getItems();
}
public void findSelectKey(string _key)
{
foreach (ComboBoxExItem cbitem in this.Items)
{
if (cbitem.DisplayEx.Contains(_key))
{
this.SelectedItem = cbitem;
break;
}
}
}
public bool findSelectValue(string _value)
{
foreach (ComboBoxExItem cbitem in this.Items)
{
if (cbitem.ValueEx == _value)
{
this.SelectedItem = cbitem;
return true;
}
}
return false;
}
public string GetKey()
{
if (this.SelectedItem != null)
return ((ComboBoxExItem)this.SelectedItem).DisplayEx;
return null;
}
public string GetValue()
{
if (this.SelectedItem != null)
return ((ComboBoxExItem)this.SelectedItem).ValueEx;
return null;
}
}
public class ComboBoxExItems
{
List<ComboBoxExItem> items = new List<ComboBoxExItem>();
public void Add(ComboBoxExItem item)
{
items.Add(item);
}
public void Clear()
{
items.Clear();
}
public List<ComboBoxExItem> getItems()
{
return items;
}
}
public class ComboBoxExItem
{
public string DisplayEx { get; set; }
public string ValueEx { get; set; }
}[ good coding ]
#A01 - ComboBox의 Item으로 사용할 자료형 정의
필요에 따라 Property 멤버를 응용할 것
System.Windows.Forms.ComboBox 는 기본적으로 Items에 바인딩된 개체의 ToString 메서드를 호출하여 Item의 값을 화면에 표현하므로, Item으로 사용할 자료형에 ToString 메서드를 재정의하여 사용하면 ComboBox.DisplayMember, ComboBox.ValueMember 속성에 매핑이 필요하지 않음
#A02 - Items 초기화
고정된 항목 세팅 (DB로부터 코드,코드명 정보를 읽어오지 않아도 되는 경우)
DB에 저장된 코드,코드명 정보를 읽어와 항목 세팅
#A03 - ComboBox에서 Item 찾기
#A04 - ComboBox에서 선택된 Item을 캐스팅하여 특정 멤버 참조
#B01 - Form.ShowDialog / 팝업을 통한 값 세팅
아래 코드는 유진제지 프로젝트에 불량 정보를 입력받는 폼(badqty class)에서 불량 유형을 선택하기 위해 불량 유형 폼(bad_NM class)으로부터 값을 처리위해 작성된 코드의 일부
※ 객체지향에서 일반적으로 어떤 객체가 다른 객체를 참조하여 멤버를 직접 업데이트하는 방식은 좋은 코딩이 아님
[ bad coding ]
솔루션팀에서 개발한 거의 모든 코드에 Form 간 데이터 참조 방식이 생성자에서 부모 폼의 객체를 전달하는 방식으로 이루어져 있음
실행하려는 팝업 폼을 클래스의 필드 멤버로 구성할 이유가 없음 (예시의 badqty 클래스에
private bad_NM bad_NM;)캡슐화 위반 : bad_NM 클래스에서 생성자를 통해 전달받은
badqty Home객체의lbl_Bad_NM멤버와lbl_bad_code멤버의 값을 수정하기 위해 public 으로 접근 제한자 지정 (badqty.Designer.cs 참고)DataGridView.CellClick 이벤트가 발생하는 시점에
lbl_Bad_NM와lbl_bad_code의 Text 속성에 값을 변경하고,button4_Click_1이벤트 핸들러에서 불량 유형 선택 판단 조건에lbl_Bad_NM.Text에 값 할당 여부를 확인하는 방식은lbl_Bad_NM.Text속성에 값이 언제 변경되는지를 확인해야 하므로 직관적이지 못함
[ good coding ]
불량 정보 입력 팝업(BadInfoSetPopup class)에서 불량 코드를 세팅하기 위한 팝업(BadCodePopup class)의 객체를 버튼이 클릭되는 시점에 생성하며,
BadCode와BadCodeName멤버의 값을 참조하여 처리DataGridView 컨트롤에 항목 초기화 (InitGridViewItem 메서드)
불량 유형 선택된 여부는 DataGridView.CurrentRow 속성으로 판단
#C01 - Timer
[ bad coding ]
#D01 - 프로그램이 실행중인지 판단하여 중복 실행 제어
Form이 Load 되기 전에 처리하며, 자신의 프로세스ID를 제외한 같은 이름의 프로그램이 실행 중인지를 판단하여 실행된 응용 프로그램을 종료
etc.
Last updated
Was this helpful?