2010-05-12 2 views
5

Хорошо, это, вероятно, очень субъективно, но вот оно:Какой тип подписи вы предпочитаете и почему?

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

  1. Bitmap DoPrintScreen (int x, int y, int width, int height);
  2. Bitmap DoPrintScreen (Прямоугольник прямоугольный);
  3. Bitmap DoPrintScreen (точка точки, размер);
  4. Прочие

Почему?

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

+2

Вы когда-нибудь считали бы наличие непрямоугольных областей? –

+0

Nah, только прямоугольник. –

+1

Тогда номер 2 действительно лучшая абстракция. Просто переименуйте параметр в 'screenArea' или' area'; теперь может быть важно, что C# 4.0 поддерживает именованные параметры. –

ответ

2

Лучший один является

Bitmap DoPrintScreen(Rectangle screenArea); 

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

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

+0

Да, это лучший вариант. хороший блог btw –

1

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

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

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

13

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

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

+1

При прочих равных условиях, ожидая, какие сайты вызова, скорее всего, должны дать ответ. +1 – sbk

1

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

4

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

3

Я бы с 2)

Bitmap DoPrintScreen(Rectangle rect); 

Как знак сказал, что параметры могут быть заменены в следующем:

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

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

Bitmap DoPrintScreen(Point point, Size size); 

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

2

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

3

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

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

1

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

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

0

Оба - 1 и 2. А также один без Params для полного экрана =)

Несколько раз вы отделили х, у, ширину, высоту, несколько раз у вас уже есть прямоугольник. Varian 3 - IMHO очень редко =) Но пользователь всегда может преобразовать значения в прямоугольник или разбить прямоугольник на значения) Я думаю, что это философский вопрос.

Так делают их все или выбрать случайное одно)))

0

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

ура.

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