2010-03-19 2 views
2

У меня есть функция, которая нарисовать изображение на графике:, где должна идти эта логика проверки?

private void DrawSmallImage(Graphics g) 
{ 
      if (this.SmallImage == null) return; 

      var smallPicHeight = this.Height/5; 

      var x = this.ClientSize.Width - smallPicHeight; 
      var y = this.ClientSize.Height - smallPicHeight; 

      g.DrawImage(this.SmallImage, x, y, smallPicHeight, smallPicHeight); 
} 

чек if (this.SmallImage == null) return; должен быть в функции DrawSmallImage или должны быть в вызывающем? что лучше?

ответ

2

Лучшее место, чтобы поставить проверку логики будет в вызывающем методе.

Обычно считается, что лучше всего разработать метод для единой конкретной цели. Это не только упрощает вашу конструкцию, но и уменьшает сцепление с методом и делает его многоразовым.

1

Я бы поместил его в вызывающий. Метод DrawSmallImage не должен знать ничего о состоянии класса. Это цель DrawSmallImage.

0

Я оставил там чек и передал SmallImage в качестве параметра в метод DrawSmallImage.

Этот способ может быть использован для любого изображения.

Что-то вроде

private void DrawSmallImage(Graphics g, Image smallImage) 
{ 
      if (smallImage == null) return; 

      var smallPicHeight = this.Height/5; 

      var x = this.ClientSize.Width - smallPicHeight; 
      var y = this.ClientSize.Height - smallPicHeight; 

      g.DrawImage(smallImage, x, y, smallPicHeight, smallPicHeight); 
} 
+0

Зачем вам передавать нулевое изображение функции для рисования изображения? Как это помогает определить, нужно ли рисовать изображение маленьким? – codemonkeh

+0

Никогда не говорил, что вы ДОЛЖНЫ передать нуль, но я сказал, что ваш метод должен проверить, что он НЕ НУЛЛ. И передача smallImage в качестве параметра позволит вам повторно использовать этот метод с другими изображениями. Возможно, вы даже захотите передать коэффициент роста в качестве параметра, если хотите. –

0

Вы можете бросить исключение, когда это произойдет:

if (this.SmallImage == null) 
    throw new NullReferenceException("Small image can't be null"); 

Затем ожидать вызывающий проверить свойство, как:

bool HasSmallImage 
{ 
    get { return this.SmallImage!=null; } 
} 
+0

Не нужно явно бросать это исключение. –

0

SmallImage является полем член. На мой взгляд, лучший дизайн - тот, который не позволяет ему когда-либо быть нулевым (например, он инициализируется в каждом конструкторе и бросает исключение ArgumentException, если он должен быть установлен в null). Конечно, вы не уделяли много внимания, поэтому это может быть невозможно. Но это определенно нужно рассмотреть.

В любом случае вы можете определенно указать, что при вызове этого метода он должен быть не пустым. Это тип предварительного условия.

+0

SmallImage исходит извне, возможно быть нулевым. – Benny

+0

Это публичное поле, или вам требуется свойство setter/set? Если последнее, вы можете выбросить исключение, если кто-то попытается установить его в null. –

Смежные вопросы