2012-09-27 2 views
1

Рассмотрим двумерный класс Matrix, который имеет перегруженный индексатор, STH, как это:Проверка исключений в DTO - лучшая практика

public class Matrix 
{ 
    private readonly double[,] _matrix; 

    public double this[int i, int j] 
    { 
     get 
     { 
      return _matrix[i, j]; 
     } 
     set 
     { 
      _matrix[i, j] = value; 
     } 
    } 

    public double this[int i, int j] 
    { 
     get 
     { 
      if (i < 0 || i >= _matrix.GetLength(0) || j < 0 || j >= _matrix.GetLength(1)) 
       throw new IndexOutOfRangeException("index was out of range"); 

      return _matrix[i, j]; 
     } 
     set 
     { 
      if (i < 0 || i >= _matrix.GetLength(0) || j < 0 || j >= _matrix.GetLength(1)) 
       throw new IndexOutOfRangeException("index was out of range"); 
      _matrix[i, j] = value; 
     } 
    } 

    public double this[int i, int j] 
    { 
     get 
     { 
      if (i < 0 || i >= _matrix.GetLength(0) || j < 0 || j >= _matrix.GetLength(1)) 
       return 0; 
      return _matrix[i, j]; 
     } 
     set 
     { 
      if (i >= 0 || i < _matrix.GetLength(0) || j >= 0 || j < _matrix.GetLength(1)) 
       _matrix[i, j] = value; 
     } 
    } 
} 

, как вы видите, есть 3 версии индексатор.

1) эта версия не проверяет индексирует

2) эта версия проверяет индексы, и если они из размеров бросить в IndexOutOfRangeException

3) эта версия проверяет индексы и правопреемников/возвращает значения только если индексы действительны.

Так что мой вопрос в том, какая из них лучше всего использовать? Что бы вы предпочли и почему? или я могу создать новое настраиваемое исключение, например «MatrixIndexOutOfRange», и выбросить его вместо исключения IndexOutOfRange?

ответ

1

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

Если значения, которые вы получаете, являются неожиданными, и вы знаете, что делать: сделайте это.

Если вам нужно выбросить исключение, используйте наиболее значимое исключение. то есть. если с точки зрения бизнеса (т. е. задание вашего класса) имеет смысл бросить специальное исключение, то сделайте это. В противном случае, вы в порядке с обычным OutOfRangeException.

1

Версия (1) является лучшей.

Массив double[,] сам будет вызывать IndexOutOfRangeException, поэтому я не вижу никакого значения при выполнении этого теста самостоятельно.

И безмолвно принимая недопустимые параметры (версия 3) на мой взгляд.

1

Версии 1 и 2 предоставят вам одинаковое поведение, поэтому версия 1 лучше, потому что это меньше кода. Если вы идете на версию 2, вы также должны добавить нулевую проверку и исключить исключение, если матрица равна нулю, и, возможно, больше проверок, которые не будут выполнены в версии 1.

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

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