Повторный параметр регистрируется в функциях

У меня часто есть иерархии вызовов в тот всем, для методов нужны те же параметры. Если я, dont't хотят поместить их на уровне экземпляра (член класса) затем, я прошу, чтобы я всегда если его многозначительное проверил законность их в каждом методе.

Например:

public void MethodA(object o){
   if(null == o){
      throw new ArgumentNullException("o");
   }
   // Do some thing unrelated to o

   MethodB(o);

   // Do some thing unrelated to o

}

public void MethodB(object o){
   if(null == o){
      throw new ArgumentNullException("o");
   }
   // Do something with o
}

Если Method Использование параметр, затем его ясное, я должен проверить законность там и также в MethdoB. Но, пока MethodA не делает ничего больше с o чем дают его MethodB, это - хорошая практика для проверки законности также в MethodA.

avantage проверки также в MethodA может быть то, что исключение добавляет метод, который назвал вызываемый, который хорош, но действительно ли это необходимо? Стек вызовов укажет это также. Возможно, его многозначительное на публике, внутренний, защищенный, но не в закрытых методах?

Я взял пустую проверку в качестве примера, но также и индексные проверки или проверки диапазона обрушиваются сам вопрос, однако я думаю, что существуют ограничения из-за опасности избыточного кода. Что Вы думаете?

ОБНОВЛЕНИЕ

Через ответ AakashM я видел, что был к мало точному. MethodA не только звонит MethodB, это делает также другие вещи, но не связанное с o. Я добавил пример для разъяснения этого. Спасибо AakashM.

5
задан HCL 14 July 2010 в 11:18
поделиться

3 ответа

Полный код Стива МакКоннелла говорит о концепции « баррикады » - стены защитной способности, за пределами которой данные не являются надежными, а внутри которой данные являются надежными. . Данные, которые хотят попасть на баррикаду, должны пройти процесс проверки, но внутри баррикады данные могут свободно перемещаться, не ограничиваясь кодом проверки.

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

В вашем примере MethodB является общедоступным . Это означает, что у вас нет автоматических будущих гарантий того, что MethodA будет его единственным вызывающим - я бы сказал поэтому, что его код проверки должен остаться. Однако, если бы он был частным для класса, вы могли бы привести аргумент в пользу его удаления.

Что касается MethodA , если он на самом деле не делает ничего, кроме вызова MethodB , его не должно существовать. Если это заглушка для будущего расширения, и в какой-то момент он собирается что-то сделать с o , то его код проверки также должен остаться.

9
ответ дан 13 December 2019 в 19:20
поделиться

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

В целях тестирования вы также можете использовать Debug.Assert (o! = Null) в обоих методах, и проверки будут удалены из кода выпуска, , если производительность является проблемой .

1
ответ дан 13 December 2019 в 19:20
поделиться

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

1
ответ дан 13 December 2019 в 19:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: