Как я мог переработать этот код, чтобы он не выглядел так, как будто я использую исключения как форму контроля потока?

Я слышал, что исключение и блоки 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...  } 
Другие вопросы по тегам