Как я мог переработать этот код, чтобы он не выглядел так, как будто я использую исключения как форму контроля потока?
Я слышал, что исключение и блоки try-catch не должны использоваться для управления потоком, поэтому я хотел бы переработать этот код, чтобы избежать такого появления.
У меня есть метод validateTrainingSets внутри класса neuralNetwork, который делает именно то, что предполагает его название - проверяет предоставленные обучающие наборы (чтобы, среди прочего, чтобы количество входов в обучающих наборах соответствовало количеству входов в нейронную сеть, и что количество выходов на ответ соответствует количеству конечных выходов нейронной сети).
Поскольку существует много разных способов, с помощью которых проверка может потерпеть неудачу, я решил оставить исключение до самого метода проверки, и есть три различных пользовательских исключения, которые можно вызвать из функции.
В методе, который позволяет пользователям класса вручную обновлять число нейронов на слой, последний бит кода проверяет и / или обновляет обучающие наборы (в зависимости от того, были ли предоставлены новые обучающие наборы), и мой вопрос заключается в том, Как бы я улучшить это?
В приведенном ниже коде "истинный" параметр в валидаторе указывает валидатору установить обучающие наборы на ноль в случае сбоя. (Предполагается, что, если пользователь не предоставил новые обучающие наборы, но существующие обучающие наборы соответствуют новому порядку их сохранения, но, если нет, отказываются от них).
Поле fldValidate - это флаг, который ранее был установлен в ложь в коде, и я должен убедиться, что он установлен в значение true без каких-либо ошибок.
try { validateTrainingSets(fldTrainingSets, fldTrainingAnswers, true); }
catch(TrainingSetCardinalityMismatch) { }
catch(InputSetCardinlityMismatch) { }
catch(OutputAnswerCardinalityMismatch) { }
catch {
fldValidate = true;
throw;
}
finally { fldValidate = true; }
1 ответ
Да, я думаю, что большинство рецензентов посчитают это непонятным и попросят внести изменения. Если я правильно понимаю проблему, вы можете использовать enum
такие как:
enum Validity { Valid, TrainingSetCardinalityMismatch, InputSetCardinalityMismatch, OutputAnswerCardinalityMismatch }
class TrainingSet {
Validity Validate(TrainingAnswer[] trainingAnswers) { // ... etc ... }
}
А затем делитесь тем, что вы считаете наиболее интуитивным, например:
var validTrainingSets =
from trainingSet in fldTrainingSets
where trainingSet.Validate(fldTrainingSets) == Validity.Valid
select trainingSet;
Или же:
var validTrainingSets =
fldTrainingSelects.Select(t => t.Validate(fldTrainingAnswers)).Filter(v => v == Validity.Valid);
Или же:
Dictionary<Validity, List<TrainingSet>> groupedTrainingSets =
from trainingSet in fldTrainingSets
group trainingSet by trainingSet.Validate(fldTrainingAnswers) into validityGroup
select new { validityGroup.Key, validityGroup.ToList() }
Если enum
недостаточно, попробуйте интерфейс или абстрактный класс:
interface IValidity {}
class Valid : IValidity { // ... etc ... }
class TrainingSetCardinalityMismatch : IValidity { public int ExpectedCardinality; // etc... }