2009-03-14 2 views

답변

5

개체에 양식에 대한 참조를 제공하는 것은 좋지 않은 (원형) 디자인입니다. 인터페이스 또는 대리자 (콜백)를 사용하십시오.

// untested code 
class MyObjectClass 
{ 
    public delegate void Reportback(int percentage); 

    public void DoSomething(Reportback callBack) { ...; callback(i*100F/total); ...} 
} 


class Form1: Form 
{ 
    private void reportProgress(int percent) { ...; progressbar1.value = percent; } 

    void SomeMethod() { myObject1.DoSomething(reportprogress); } 
} 
0

내가 헹크 동의 ...하지만 당신이 컨트롤의 가시성을 변경하는 경우 어쨌든, 당신이 양식에 항목을 수정할 수 있습니다, 심지어이 작업을 수행하는 속성이있다.

+0

가시성으로 범위 (개인, 보호 된, 공개)에 대해 이야기하고 있습니까? – HardCode

+0

예. 공개 또는 내부로 변경하면 액세스 할 수 있습니다. 프로젝트에서이 접근법을 사용하지만 지저분하므로 오늘 Henks 솔루션을 사용하여 리펙토링합니다. –

+0

그래, 내가 말할거야. 폼 컨트롤 자체를 공개하는 것은 끔찍한 이상입니다. 최악의 경우 개인/보호 된 양식 컨트롤을 설정하는 양식 코드에서 공용 함수를 작성해야합니다. – HardCode

1

일반적으로 말해서 한 객체가 다른 객체의 비공개 필드를 조작해야하는 필요성을 느끼면 설계가 올바르게 작동해야합니다.

예를 들어, 일종의 장기 실행 비즈니스 로직을 수행하는 클래스는 ProgressBar을 업데이트하지 않아야합니다. 첫째, 그건 그 직업이 아닙니다. 둘째, 비즈니스 로직의 기능과 사용자 인터페이스의 구현 세부 사항을 결합합니다.

클래스가 장기 실행 작업을 수행 할 때 단순히 이벤트를 발생시키는 것이 훨씬 좋습니다. 예를 들어,이 클래스를 보면 :

이 클래스의 모든 메소드는 Progress 속성을 설정 때마다
public class BusinessLogic 
{ 
    public event EventHandler ProgressChanged; 

    private int _Progress; 
    public int Progress 
    { 
     get { return _Progress; } 
     private set 
     { 
      _Progress = value; 
      EventHandler h = ProgressChanged; 
      if (h != null) 
      { 
       h(this, new EventArgs()); 
      } 
     } 
    } 
} 

이는 ProgressChanged 이벤트가 발생됩니다. 양식에서이 같은 논리로 객체를 생성 할 수 있습니다

private BusinessLogic Task; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    Task = new BusinessLogic(); 
    Task.ProgressChanged += Task_ProgressChanged; 
} 

void Task_ProgressChanged(object sender, EventArgs e) 
{ 
    taskProgessBar.Value = ((BusinessLogic) sender).Progress; 
} 

이제 모든 시간은 Task 객체의 방법은 Progress 속성을 설정, 형태로 ProgressBar 업데이트 얻을 것이다.

이 코드는 객체를 ProgressBar으로 업데이트하는 것보다 쓰기가 훨씬 쉽습니다. 그러나 당신이 그것에서 벗어나는 것을보십시오. 양식을 두 가지 양식으로 리팩토링하고 작업을 새 양식으로 이동해야하는 경우 BusinessLogic 클래스를 만질 필요가 없습니다. ProgressBar을 양식의 컨트롤에서 ToolStripToolStripProgressBar으로 이동하면 BusinessLogic 클래스를 만질 필요가 없습니다. 진행보고가 중요하지 않다고 결정하면 BusinessLogic 클래스를 만질 필요가 없습니다.

기본적으로이 접근법은 BusinessLogic 클래스가 사용자 인터페이스에 대해을 알아야하는 것을 방지합니다. 따라서 프로그램이 발전함에 따라 비즈니스 로직과 사용자 인터페이스를 쉽게 변경할 수 있습니다.

관련 문제