Я пишу плагин для программы геометрического моделирования, и у меня есть абстрактный класс, основанный на объекте Curve. Кривая считается действительной, только если она плоская, замкнутая и не пересекает себя.
Затем у меня есть цепочка других методов, которые ссылаются на эту кривую, которые делают такие вещи, как создание из нее поверхности или выдавливание ее в объем. Эти методы выдают исключение, если они вызываются, когда BaseCurve недопустим. Прямо сейчас моя программа просто падает, если пользователь делает недействительной одну из кривых, и я пытаюсь найти лучший способ, чтобы моя программа обработала этот неверный ввод.
Вот как выглядит мой класс:
public abstract class AbsCurveBasedObject
{
public abstract Curve BaseCurve
{
get;
}
public bool BaseCurveIsValid
{
get
{
Curve c = this.BaseCurve;
...
//checks that curve is valid
...
return true/false;
}
}
public Surface GetSurface()
{
Curve c = this.BaseCurve();
...
//magic that converts c to a surface
//exception is thrown if c is invalid
...
return surface;
}
public Surface GetVolume()
{
Surface s = this.GetSurface();
...
//magic that converts s into a volume
...
return volume;
}
}
Я не уверен, что GetSurface () должен возвращать NULL , если кривая недействительна или я должен вызвать исключение.
Не удивительно, что базовая кривая является недействительной, поскольку я знаю, что в результате пользователь создаст недопустимую кривую при использовании моей программы. Насколько я понимаю, исключения обычно должны создаваться только тогда, когда программа достигает точки, когда происходит что-то неожиданное, и она не знает, как продолжить?
Должен ли я вместо этого просто возвращать NULL из GetSurface (), если кривая недействительна, и затем каждый метод, основанный на GetSurface (), также возвращает null, если GetSurface () делает? Кажется, это будет сложнее отлаживать. Я знаю, что в конечном итоге забуду проверить, является ли возвращаемое значение где-либо NULL, и получу какое-то ArgumentNullException, которое отслеживает весь путь до AbsCurveBasedObject.GetSurface ()
Так лучше ли иметь блоки if / else или try / catch по всему месту отслеживания для обработки, когда пользователь как-то делает недействительным свойство базовой кривой?