2012-06-12 2 views
1

Это первый раз, когда я пишу библиотеку (для меня в нескольких играх), поэтому я считаю, что для хорошей практики программирования я должен прокомментировать мой код, добавив обобщение XML и обработчик исключений, когда пользователь этой библиотеки сделал что-то не так, как во многих .NET-классах (пользователь, скорее всего, я или мои товарищи по команде)Путаница о броске и утверждении

Это конструктор класса NoteRow (кстати, я разрабатываю музыкальные игры), который должен определить размер массива по созданию

bool[] l1NoteData; 
public NoteRow(int numberOfNotes) 
{ 
    this.l1NoteData = new bool[numberOfNotes]; 
} 

Теперь у меня есть этот метод, чтобы переключить булевы на l1NoteData массиве.

public void toggleNote(uint index) 
{ 
    l1NoteData[index] = !l1NoteData[index] 
} 

Так вот как оборонительные программирования я хотел бы проверить, что индекс (что пользователь этого класса будет указывать, что мне или, может быть, мои товарищи по команде) находится вне диапазона, указанного при создании данного класса или нет.

Я прочитал MANY throw exception vs. assert vs. return bool и т. Д. И все еще смущен и не может выбрать. Вот моя забота:

  • Должен ли я положить «если» заявление, чтобы проверить, если индекс превышает l1NoteData.length затем огонь исключение, когда он, зная, что исключение будет срабатывать в любом случае, когда эта линия выполнена с «вне диапазона ' индекс? (IndexOutOfRangeException) Если это так, то зачем использовать исключение throwing? Если что-то пойдет не так, в любом случае будет исключение по умолчанию?
  • Я читал, что Assert для программиста. Чтобы заметить программиста, что код не работает как программист , предположим,. И никогда нельзя вводить тестовый пример, чтобы сделать заголовок assert (если он запущен, а код неправильный) по сравнению с исключением исключения, которое должно обрабатывать ненормальный тестовый пример (пользователем). Теперь пользователем этой библиотеки будет я. Значит, меня считают программистом или пользователем? I, как пользователь этого класса, может вызывать toggleNote и индекс ввода, превышающий предел массива, поэтому исключение будет выбрано. Или я, как программист из моих игр (эта библиотека является частью моей игры) должна поставить там утверждение, поэтому я не ошибаюсь при вызове с чрезмерным индексом из моей игры. (которые используют эту библиотеку) Теперь я могу знать, что код игры неверен, потому что assert уволен, а затем исправить его и, наконец, сделать в сборке релиза. (а затем код подтверждения исчезнет)
  • Из вышеприведенного вопроса, если я тщательно тестирую, что я уверен, что больше нет ошибки, вызывающей assert для запуска, а затем выйдите для выпуска сборки. Я знаю, что утверждение не будет в коде в выпуске сборки ... но это действительно хорошо? Вероятно, в программе осталось больше ошибок, поэтому теперь, когда пользователь испытывает эту ошибку, утверждение не существует, чтобы поймать ошибку. Так что утверждать, действительно хорошая вещь, чтобы использовать, когда я могу использовать исключение, а если пользователь вызывает это исключение для пожара, я как разработчик могу получить этот отчет об ошибке, чтобы исправить его и т. Д. (Но пользователь - это я и мои друзья)
  • Исключение броска на 100% лучше, чем возвращение bool для указания успеха/неудачи? В каком примере вы можете думать, что это более подходит для возвращения bool?

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

ответ

2

Утверждай только для тестирования. Утверждения не используются для обработки ошибок в производственном приложении

Вы должны предварительно проверить (если), если вход поступает от пользователя, ожидаются ошибки и т. Д.

Если ошибка совершенно неожиданна, то для чего предназначена обработка исключений.

Если ваша собственная программа предоставляет индексный параметр, то это ошибка, если передано неправильное значение. Исключения для этого прекрасны.

Несколько хороших вопросов были заданы на этом

Are exceptions really for exceptional errors?

Debug.Assert vs Exceptions

Exceptions vs "if" in C#

1

Задайте себе простой вопрос: вы хотите, чтобы остановить его от происходящего?

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

Если нет, то у вас есть варианты.

  • Вы можете использовать System.Diagnostics.Debug или System.Diagnostics.Trace записать неверный индекс, и вернуться молча, ничего не делая.
  • Вы можете игнорировать его, и он все равно выкинет IndexOutOfBoundsException.
  • Вы можете защитить его, чтобы остановить исключение, но в противном случае возвратитесь обычно из метода.
2

Самая большая причина для исключения вашего собственного исключения с предварительной проверкой (простой оператор if в верхней части функции) заключается в том, что вы можете указать собственное очень подробное сообщение об исключении. Вместо стандартного «Index out of array bounds», или как бы то ни было, вы можете явно сказать «Эй, тупица. Вы пытались переключить записку, которая не существовала». Или что угодно.

Другой случай для вашего собственного исключения - для тех, кто просматривает ваш библиотечный код. Вы явно проверяете наличие ошибки, и любой, кто просматривает источник вашей библиотеки, будет предупрежден, что это потенциальная ошибка. Будьте ясны в том, что вы хотите делать в своем коде.

2

Первый. Обычно говорят, что одним преимуществом исключений перед обратными кодами является то, что исключения не могут быть проигнорированы. Это дает вам возможность. Используйте исключения, если вы не хотите, чтобы пользователь (программист) использовал вашу библиотеку, чтобы пропустить что-то важное. Второй. Я думаю, вы не использовали бы утверждение в общем случае в библиотеке ни как программист, ни как пользователь. Я имею в виду, что вы должны использовать assert в коде, который использует вашу библиотеку, чтобы проверить ваши предположения как истинные.

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