Могут ли имена методов начинаться с Get in .NET - PullRequest
3 голосов
/ 24 февраля 2009

Я натолкнулся на недавний аудиторский отчет в нашей компании для поддерживаемого нами кода, в котором говорится, что мы не должны использовать Get в методе (а не в свойствах) именования, как в GetSearchResults или GetXyzInformation. Я посмотрел руководство MS (http://msdn.microsoft.com/en-us/library/4df752aw(VS.71).aspx)) для именования методов и согласно тому, что Get разрешен, так что вы думаете об этом, можем ли мы иметь это или нет со стандартной точки зрения, если не почему?

Дополнительная информация
Я добавляю больше информации после первого набора ответов. Методы, на которые я ссылаюсь, относятся к типу, который включает взаимодействие с базой данных, поэтому, очевидно, свойства не являются идеальными вариантами.

Ответы [ 8 ]

14 голосов
/ 24 февраля 2009

Да, они, конечно, могут - в стандартном API есть множество примеров (например, Delegate.GetInvocationList ).

Однако, как правило, стоит подумать, действительно ли вы хотите свойство при создании метода GetFoo.

9 голосов
/ 24 февраля 2009

Это совершенно законно (даже законно писать методы вида "get_Foo", которые будут конфликтовать с синтезированным методом компилятора методом get, если вы объявите свойство Foo с помощью метода get).

Что касается хорошей вещи:

  1. Если метод выполняет серьезную работу, имеет побочный эффект или может вызвать исключение, возможно ли, что он не является подходящим кандидатом для свойства, а имя носит описательный характер, поэтому его не нужно менять без необходимости
  2. Если метод не выполняет серьезных действий, сделать его свойством, вероятно, хорошая вещь, поскольку с ним будет проще работать при вызове кода.
  3. если метод на самом деле ничего не 'получает', то имя плохое и его следует изменить

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

9 голосов
/ 24 февраля 2009

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

Из Руководства по проектированию структуры :

НЕ имеет свойства, соответствующие названию «Get method», как в следующем примере:

public string TextWriter { get {...} set {...}}
public string GetTextWriter(int value) {...}
3 голосов
/ 24 февраля 2009

Если ваш Get-метод принимает параметры , абсолютно нормально присвоить ему соответствующее имя.

Если он не принимает параметры, переименуйте его в SearchResults { get; }

И намного-намного лучше, чем использовать параметрические свойства, как в VB.NET:

.
ReadOnly Property Foo(ByVal i As Integer, ByVal j As Integer) As String
  Get
    Return ""
  End Get
End Property

На самом деле, в IL это будет метод GetFoo(int, int), но VB.NET - замечательный язык!

2 голосов
/ 24 февраля 2009

Да, я бы действительно использовал GetXyz, если метод имеет некоторые побочные эффекты, медленно выполняется или требует аргументов (во всех случаях, когда вам определенно не следует использовать свойство Xyz).

Лично я смешиваю и сопоставляю GetXyz и FindXyz в тех случаях, когда возврат null может быть неправильным для get . get может выделить новый объект, если он не найдет того, что ищет, тогда как find вернет, например, null.

1 голос
/ 24 февраля 2009

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

Упрощенно, свойства - это существительные, а методы - глаголы.

1 голос
/ 24 февраля 2009

Абсолютно вы можете использовать Get в названии метода. Лично я использую это, чтобы сделать это различие:

Не называется Получить:

public string GetSomeString()
{
     return _someMemberVariable;
}

Редактировать: Кажется, я не совсем понял здесь, я хотел показать, что свойства с Get в имени вводят в заблуждение, если они не обрабатывают.

Слово Получить в имени метода подразумевает требуемое усилие.

public string GetSomeString()
{
     //Some code that does processing or includes logic.
}

Я считаю, что это упоминается в Чистом коде как хорошая практика (чтобы пояснить, что это не просто возврат значения).

0 голосов
/ 24 февраля 2009

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

...