어느 방법을 선호하십니까?

chadr의 이미지
chadr의 이미지

내용을 요약하기가 너무 애매해서 제목을 저렇게 지은점 죄송합니다. :oops:

투표를 하시기 전에 이 글을 꼭 읽고 해주세요.!

이런 상황이 있다고 해봅시다..

this->m_LifeCount = Pinfo.Life;

this->m_GUI.SetWindowText(MAIN_TABLE, this->m_LifeCount);
.
.
.
.
.

여기서 this->m_GUI.SetWindowText 이후로 ui를 세팅하는 부분이 꽤나 많고 이곳저곳에서 자주 사용되기 때문에 저 부분을 아래와 같이 함수로 분리를 해본다고 하면..

void MyClass::UpdateUI()
{
  this->m_GUI.SetWindowText(MAIN_TABLE, this->m_LifeCount);
  .
  .
  .
  .
  .
}

와 같이 될 것입니다.

ui를 업데이트 하는데 필요한 값은 this->m_LifeCount이 값 뿐입니다. 이때 이를 구현하는 방법은 아래와 같이 두가지를 생각할 수 있습니다.

첫번째 방법

this->m_LifeCount = Pinfo.Life;
this->UpdateUI();

void MyClass::UpdateUI()
{
  this->m_GUI.SetWindowText(MAIN_TABLE, this->m_LifeCount);
  .
  .
  .
  .
  .
}

두번째 방법

this->UpdateUI(Pinfo.Life);

void MyClass::UpdateUI(int Life)
{
  this->m_GUI.SetWindowText(MAIN_TABLE, Life);

  this->m_LifeCount = Life;

  .
  .
  .
  .
  .
}

이 두가지 방법중 어느것을 선호하십니까?

투표와 같이 여러분께서 생각하시는 각각의 장단점을 같이 적어주세요. :)

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

uriel의 이미지

두 번째 방법 아닌가요?

1번째 방법의 경우 사용자가 UpdateUI를 부르기 전에 항상

this->m_LifeCount = Pinfo.Life;

을 설정 해 주어야 하는데 까먹을 수 있죠.

제가 비슷한 코드를 만든다면, UpdateUI()는 여러 변경 사항이 있을 경우 한꺼번에 변경 사항을 적용 하는 경우에 사용하고, UpdateUI((int ...)은 이름을 UpdateUILine(int ...)로 해서 라인만 업데이트 하는 경우에 사용하겠습니다.

gimmesilver의 이미지

제시하신 조건만을 놓고 본다면 두 번째 방법이 더 좋다고 생각합니다.
첫 번째 방법의 경우 UpdateUI()함수가 m_LifeCount라는 멤버의 존재 및 m_LifeCount변수값을 변경하는 루틴에 의존하게 되는 문제가 있습니다.
따라서 유지 보수 시 m_LifeCount라는 멤버의 삭제 혹은 변경이 일어날 경우 모든 UpdateUI()함수 호출부 및 UpdateUI()자체의 수정이 필요합니다.
반면 두 번째 방법의 경우 UpdateUI(int)함수 자체만 수정해줘도 되므로 캡슐화나 모듈화가 더 잘된 구조인 것 같습니다.

------------------------
http://agbird.egloos.com

YGM의 이미지

MyClass내의 함수가 많고 멤버변수들을 많이 참조할수록 전자가 유리해집니다.

예를 들어 메일을 보내는 클래스라고 할때 제목, 내용, 받을사람 등 여러가지 값을 세팅해둔후 마지막에 send를 해야겠죠. send안에 여러가지 값을 다 넣을것 같으면 클래스와 멤버변수를 만든 의미가 없죠.

제시하신 예에서도 값들 세팅할것 있으면 다 세팅하고 마지막에 UpdateUI를 해주는게 맞다고 봅니다.

세팅할게 많지 않다면 setAutoUpdate(true) 같은 함수를 마련해두고 setXxxx(xx) 함수를 만들어서 이 함수에서 멤버값을 세팅한후 바로 autoUpdate여부에 따라서 Update를 해주는것도 좋겠죠.

rainmon의 이미지

c#이라면 8)

private int m_LifeCount = 0;

public int LifeCount { get { return m_LifeCount; } set { m_LifeCount = value; }
.
.
protected void UpdateUI()
{ 
    this.m_GUI.Text = LifeCount.ToString();
}
.
.
protected void Main(int life)
{
    this.LifeCount = life;
.
.
    this.UpdateUI();
}