Какой тип подписи метода вы предпочитаете и почему? - PullRequest
5 голосов
/ 12 мая 2010

Хорошо, это, вероятно, очень субъективно, но вот оно:

Давайте предположим, что я пишу метод, который будет использовать экран печати некоторой области экрана. Какой метод подписи вы бы предпочли и почему?

  1. Растровое изображение DoPrintScreen (int x, int y, int width, int height);
  2. Растровое изображение DoPrintScreen (прямоугольник);
  3. Растровое изображение DoPrintScreen (точка, размер, размер);
  4. Другое

Почему?

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

Ответы [ 11 ]

13 голосов
/ 12 мая 2010

Это зависит. Если это библиотека общего пользования, обязательно добавьте все три. .NET Framework, особенно GDI +, полон примеров этого. Если преобразование тривиально, это не так много усилий, и ваши пользователи будут благодарны.

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

4 голосов
/ 12 мая 2010

Rectangle лучше всего описывает поведение функции (по крайней мере, я на это надеюсь!) X & Y ассоциируются с width & height, чтобы определить прямоугольник; они не являются произвольными не связанными переменными.

3 голосов
/ 12 мая 2010

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

В конкретном случае метода захвата экрана перегрузка с параметром Rectangle, вероятно, будет наиболее удобной, поскольку с формами всегда связан прямоугольник. Кроме того, если вам нужно повторно захватывать одну и ту же область экрана, проще сохранить одну переменную (a Rectangle), чем четыре (x, y, ширина и высота).

3 голосов
/ 12 мая 2010

Я бы пошел с 2)

Bitmap DoPrintScreen(Rectangle rect); 

Как указано, параметры можно поменять местами следующим образом:

Bitmap DoPrintScreen(int x, int y, int width, int height); 

Я бы не выбрал это, поскольку это не так явно, как 2) для кого-то еще, кто читает это. В то время как нет чьей-то двусмысленности читать 2)

Bitmap DoPrintScreen(Point point, Size size);

Конечно, это только мое мнение, конечно !!!

2 голосов
/ 12 мая 2010

Лучший из них

Bitmap DoPrintScreen(Rectangle screenArea);

Если вы считаете, что параметры метода являются частью «концепции», в данном случае концепции области экрана, то другие опции не достаточно хорошо абстрагируют эту концепцию.

Кроме того, используйте хорошее имя для параметра, поскольку это может сделать вызывающий код даже более четким при использовании именованных параметров в C # 4.0.

2 голосов
/ 12 мая 2010

Я бы лично включил три из них, позволяя пользователю выбирать, какой из них он / она предпочитает использовать, и все, чтобы предложить пользователю наибольшую свободу использования. Никто не любит быть в наручниках. Ну не в программировании! ;)

1 голос
/ 12 мая 2010

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

... так что это удобство для ваших пользователей без особых усилий с вашей стороны.Win / Win.

1 голос
/ 12 мая 2010

Я думаю, вам следует выбрать версию, которая лучше всего соответствует другим методам, которые будут использоваться вместе с вашим кодом. Я имею в виду методы и методы .Net из других стандартных или распространенных сторонних библиотек. Таким образом, код выглядит одинаково, и те же самые объекты могут быть напрямую переданы другим методам.

1 голос
/ 12 мая 2010

Rectangle, вероятно, наиболее ясно, потому что аргумент не зависит от позиции. Для пользователя было бы легко случайно поменять x и y или width и height.

Point / Size также лучше, чем x-y-width-height, и иногда дополнительная ясность может быть немного более понятной для чтения.

Но, в конечном счете, нет веских оснований для не использовать все три перегрузки.

0 голосов
/ 12 мая 2010

Все 3. Как вы сказали, вы собираетесь перенаправить их на 2-х, кто так, почему бы не оставить все три? Я действительно думаю, что вы должны изменить имя параметра Rectangle на что-то более значимое - например, printArea.

веселит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...