Какой стиль возврата я должен использовать? - PullRequest
10 голосов
/ 05 июня 2009

Это связано с соглашениями, используемыми в C #.

У меня есть метод, который имеет два параметра (координаты X и Y). Эти координаты представляют положение, в котором может находиться «тайл». Если плитка находится в этих координатах, метод возвращает ее номер. Если в этих координатах нет плитки, мне интересно, как должен вести себя метод.

вижу три варианта:

  1. Используйте исключения. Я могу выдавать исключение каждый раз, когда Метод не находит плитки. Однако, поскольку такая ситуация не редкость, этот вариант является худшим.
  2. Сделайте это старомодным способом C ++ и верните -1, если плитки нет.
  3. Сделайте номер плитки ссылочным параметром и измените тип возвращаемого значения метода на логическое значение, чтобы показать, есть ли плитка или нет. Но это кажется мне немного сложным.

Итак, что мне делать?

Ответы [ 12 ]

0 голосов
/ 05 июня 2009

Я бы разбил его на два метода. Есть что-то вроде CheckTileExists(x,y) и GetTile(x,y). Первый возвращает логическое значение, которое указывает, есть ли плитка с заданными координатами. Второй метод, по сути, тот, о котором вы говорите в исходном сообщении, за исключением того, что он должен выдавать исключение, когда ему даны недопустимые координаты (поскольку это означает, что вызывающий абонент сначала не вызвал CheckTileExists(), поэтому это законно исключительная ситуация. Ради скорости вы, вероятно, захотите, чтобы эти два метода совместно использовали кэш, так что в случае, если они вызываются один за другим, накладные расходы на функцию GetTile() будут незначительными. Я не знаю если у вас уже есть подходящий объект для размещения этих методов или, возможно, вам следует сделать их двумя методами для нового класса. ИМХО, снижение производительности при таком подходе незначительно, а увеличение ясности кода намного превышает его.

0 голосов
/ 05 июня 2009

Если метод является частью низкоуровневой библиотеки, то ваш стандартный дизайн .NET, вероятно, требует от вас исключения из вашего метода.

Вот как обычно работает .NET Framework. Ваши абоненты более высокого уровня должны поймать ваши исключения.

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

...