Я действительно разрываюсь на эту проблему. Я думаю, что использование второго метода более надежно и легче для отладки. Каждая функция становится очень четким черным ящиком. Ошибки легче отлавливать, потому что вы можете перехватывать входные ошибки внутри функции. Наличие флага вне области действия, кажется, вносит дополнительную двусмысленность в код. При каких условиях была вызвана моя функция? Где и почему был установлен мой флаг? Возникла ли логическая ошибка, из-за которой флаг был установлен неправильно? Это также заставляет вас проверять правильность флага, прежде чем вызывать функцию, которая может быть сложной. Я думаю, что удаление флага может привести к лучшей инкапсуляции внутри функции, и обработка ошибок состояния может последовательно решаться внутри функции.
Но, как я уже сказал, я разорван, первый метод может быть действительно удобным, и если у вас действительно сложная логика внутри функции, она может обеспечить согласованность из-за СУХОГО. Не нужно повторять действительно хрупкие и сложные функциональные возможности.
Я думаю, это зависит от того, где вы в конечном итоге хотите проверить входные параметры. Я думаю, что избегание флагов позволяет очень четко определить местонахождение проблем. Внутри черного ящика.
Также, помимо флагов, иногда я хочу знать, кто и что вызывает мою функцию. Поэтому иногда я добавляю ссылочный идентификатор в качестве дополнительного параметра.
void Submit(object data, bool isDraft, string referenceId);
Тогда я смогу узнать больше о том, кто вызывает submit, и может немного упростить отслеживание ошибок, если вы захотите навязать правила о том, кто должен вызывать вашу функцию и понимать, когда в логическом потоке она вызывается.