2010-01-25 2 views

ответ

1

Я не думаю, что здесь есть большая проблема, потому что вызов Any() не является дорогостоящей операцией.

Существует незначительная проблема в том, что ответственность и поведение ToggleVisibility не объявлены. ToggleVisibility должен позволить вызывающим абонентам знать, как он будет себя вести, если формы пусты или null. Лучший способ сделать это - через комментарии XML, чтобы он появился в Intellisense. Это позволит вызывающим абонентам ToggleVisibility решить, нужно ли проверять, является ли коллекция пустой или нулевой.

0

Если вы добавляете эти утверждения для тестирования и отладки, конечно, это имеет смысл.

В таких ситуациях вы хотите, чтобы вам сказали, когда все идет не так, как вы ожидаете, что они всегда будут идти.

В производстве, однако, вы, вероятно, не хотите танковать все приложение, совершив вызовы несуществующим членам коллекции фигур.

0

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

0

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

Со своей стороны я бы проверил его внутри ToggleVisibility, потому что он делает код вызывающего абонента более чистым, и если вы вызываете функцию ToggleVisibility из 50 разных мест, то у вас значительно меньше кода.

0

Я бы предположил, что ответ ... как обычно ... «это зависит». Хотя вызов Any на IEnumerable не стоит дорого, действительно ли это необходимо? Это зависит от того, что вы планируете делать с вашей коллекцией в методе.

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

Вы используете GetShapes() в качестве примера рамки для ответа. Чтобы расширить мою идею, действительно ли это незаконно до ToggleVisibility() на пустой коллекции? Очевидно, это не будет сделано, но если пользователь выделил пустой набор фигур, а затем нажал на функцию видимости переключения, будет ли он делать что-нибудь плохое?

0

Если ToggleVisibility(IEnumerable<Shape>) - частный метод (таким образом, SomeMethod() должен быть в той же библиотеке), то я обязательно включу проверку только один раз в сборке Release. Является ли проверка одним способом или другим, зависит от того, что имеет смысл для того, что происходит. Если ожидается, что коллекция не будет пуста при правильном выполнении, то, возможно, проверка не требуется. Если ToggleVisibility(IEnumerable<Shape>) вызывается из десяти разных мест, и любой из них может иметь пустую коллекцию, то я бы определенно избавил вызывающего от обязанности выполнять проверку каждый раз и просто вставлял ее внутри самого метода.

Если ToggleVisibility(IEnumerable<Shape>) является частью общедоступного API, то он определенно должен сделать все необходимые проверки параметров, поскольку пользователи API могут что-либо сделать, и все параметры должны быть проверены в любое время. Если в документации для метода указано, что пустые коллекции будут игнорироваться, то SomeMethod() не нужно беспокоиться об этом, очевидно. В противном случае SomeMethod() должен сделать все возможное, чтобы убедиться, что сбор, который он передает, действителен, даже если это означает, что выполняются избыточные проверки.

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