2013-06-07 3 views
0

사실, 좀 더 일반적인 문제의 예가되는 특정 문제를 해결하려고했습니다.객체 소비 패턴

Bitmap AnImage; // Several instances of this object are possible: an image is loaded; then is discarded; then a new image is loaded, and so on. 

Public class PixelSelection  
{ 
    string GenericAttribute; 
     int X; 
     int Y; 

    public PixelSelection(string myAttribute, int x, int y) 
    { 
      GenericAttribute = myAttribute; 
      X = x; 
      Y = y; 
    } 
} 

두 번째 개체 :

  1. 이 방법으로 생성됩니다 : 새로운 PixelSelection ("무엇이든", AnImage.Width '을 하나의 객체가 다른에 따라 우리가 어디 개체의 커플을 가정 해 봅시다 , AnImage.height) 따라서 AnImage 객체에 따라 달라집니다.
  2. 주 응용 프로그램이 구독 할 수있는 이벤트를 노출합니다.

은 각 클래스의 단일 인스턴스가 필요하고 두 개체는 사용자가 필요에 따라 생성됩니다 : 당신이 Bitmap 인스턴스없이 PixelSelection를 사용할 수 있지만, 사용자가 PixelSelection와 상호 작용해야 할 때 인스턴스에 대한 필요성이 발생한다 목적.

제가 처리중인 문제는 비트 맵으로 PixelSelection을 동기화하는 방법입니다. 다음과 같은 시나리오를 고려할 수 있습니다.

  1. PixelSelection을 기본 폼의 속성으로 선언하고 새 비트 맵을 만들 때마다 인스턴스를 만듭니다. 새로운 비트 맵 생성이 필요할 때마다 개발자는 다른 코드 섹션에서 참조 된 새 PixelSelection 객체를 인스턴스화해야하기 때문에 매번 새로운 이벤트 등록이 필요하고 코드가 오류가 발생하기 쉽습니다.
  2. 시작시 PixelSelection 객체를 인스턴스화합니다. 모든 Bitmap 인스턴스에 대해 동일한 객체를 사용하여 코드에서 실제로 사용되는 X 및 Y 속성 만 업데이트합니다. 비트 맵을 사용할 수 없으므로 x 및 y 매개 변수가없는 새 생성자가 필요하며 적절한 초기화없이 인스턴스에서 작업을 수행하려고 할 때 PixelSelection에서 불일치를 관리하는 코드가 필요합니다.
  3. Bitmap 및 PixelSelection 객체가있는 래퍼 객체는 Bitmap이 할당 될 때 PixelSelection 객체를 올바르게 작성하거나 업데이트하는 데에만 사용되는 속성으로 사용하십시오. 이 래퍼가 솔루션 도메인 모델에 맞지 않기 때문에 매우 부 자연스러운 (또는 더러워진) 것처럼 들리지만 매우 구체적인 문제를 해결하기위한 해결 방법 일뿐입니다.
  4. PixelSelection을 속성으로 사용하는 Bitmap에서 파생 된 클래스를 만들어 수명주기를 명백한 방식으로 관리합니다. 이것은 아마도 무언가를 모델링하지 않고 객체 라이프 사이클 요구 및 사용 패턴을 처리하기위한 많은 수의 객체로 채워지는 초고 품질 클래스로 이어질 수 있습니다.

내가 초안을 작성한 4 가지 임시 시나리오는 추상화에서 매우 다르며 다른 도구 세트를 사용하려고합니다. 더 나쁜 것은, 그들이 객체 라이프 사이클 문제와 객체 지향 모델링에 대한 혼란을 보여줌으로써 객체 모델에 대한 이해가 부족하다는 증거를 줄 수 있다고 생각합니다. 누군가가 문제 해결을위한 최선의 방법을 모색하는 데 도움을 줄 수 있습니까? 모범 사례의 관점에서 솔루션이 적절한 대답 인 이유는 무엇입니까? 감사.

답변

0

나를 위해 적합한 해결책을 찾았습니다. 실제 요구 사항은 불필요한 종속성을 만들지 않고 두 객체를 동기화 상태로 유지하는 데 필요한 모든 작업을 수행 할 수있는 단일 코드 섹션을 갖는 것입니다. 그 대답은 사건들입니다. 솔루션은 PictureBox 컨트롤에서 그림을로드 할 책임이 메서드에있는 클래스 (싱글 톤)를 만드는 것입니다. 클래스가 이벤트를 발생 업데이트를 수행 할 수있는 방법이 있습니다

/* 
* Load the picturebox in the control 
*/ 
     public void UpdatePictureBox(Bitmap BitmapToBeLoaded, PictureBox CurrentPictureBox) 
     { 
      /* 
      * If the Bitmap or the picturebox are null there is nothing to update: so exit keeping loaded the previous image 
      */ 
      if (BitmapToBeLoaded == null) return ; 

      CurrentPictureBox.Image = BitmapToBeLoaded;    // Assign the Bitmap to the control 
      /* 
      * When loading, adapt the control size to the image size to avoid any distortion 
      */ 
      CurrentPictureBox.Width = BitmapToBeLoaded.Width;   // Adapth width of the control size 
      CurrentPictureBox.Height = BitmapToBeLoaded.Height;  // Adapth height of the control size  

      /* 
      * Publish events defensively: Book .Net Components, pag. 108 
      */ 
      try 
      { 
       if (null != ImageUpdated) ImageUpdated(); // Fire the event 
      } 
      catch 
      { 
      } 
      return ;   
     } 

새로운 이미지 이후에 수행하는 모든 작업을 사용할 수 있습니다이 방법을 쉽게 찾을 코드 한 섹션에서 이벤트를 구독 수행하고 문서화. 나는 이것이 최선의 해결책이라고 주장하지 않는다. 그러나 나를 행복하게 만드는 것은 디자인이 더 깨끗해 보인다는 사실입니다.

0

내가 어떻게 왜 PixelSelectionBitmap에 대한 참조를 추가하지 않는 비트 맵

와 동기화 PixelSelection을 유지하기위한 것입니다 처리하고 문제?

public class PixelSelection  
{ 
    string GenericAttribute; 
    int X; 
    int Y; 
    private readonly Bitmap bitmap; 

    public PixelSelection(string myAttribute, int x, int y, Bitmap bitmap) 
    { 
      GenericAttribute = myAttribute; 
      X = x; 
      Y = y; 
      this.bitmap = bitmap; 
    } 
} 
0

그것은 매우 추상적 인 질문에 절대 대답을하는 것은 불가능합니다, 당신은 정말 나 관련되지 않을 수도 뭔가에 정의 된 문제에 대한 구체적인 조언이 아니라 일반적인 가이드 라인을 찾고되지 않습니다 당신의 문제.

이 특정 시나리오에서는 PixelSelection 클래스와 비트 맵 사이에 "강제 연결"이 실제로 표시되지 않습니다. PixelSelection의 너비와 높이가 필요하지만 비트 맵이 필요하지 않으며 필요없는 경우 추가 종속성을 추가하는 것은 좋지 않습니다.

또한 PixelSelection의 비트 맵 1 인스턴스와 인스턴스 1 개만 필요하다고 명시했습니다. 따라서 정적 요소/싱글 톤으로 생성 한 다음 필요에 따라 업데이트하면 모두 좋을 것입니다.

순수 OO 설계 관점에서 솔루션 3을 찾는 것이 더 일반적입니다. 물론 특정 시나리오에서 다른 방법을 사용하는 것이 더 적합하지 않은 한. 또는 PixelSelection에 비트 맵에 대한 참조를 추가하십시오.

완전한 그림없이 우리가 어떤 유형의 제한 사항을 알고 있는지 확실한 답을 내리는 것은 불가능합니다.