Есть ли причины не использовать слово «это» («Я», «Я», …)?

StackOverflow https://stackoverflow.com/questions/333291

Вопрос

Я читаю этот ответ и его комментарии, и мне любопытно:Есть ли причины не использовать this / Self / Me ?

КСТАТИ:Извините, если об этом уже спрашивали, похоже, невозможно найти слово this на СО.

Это было полезно?

Решение

Предупреждение: чисто субъективный ответ ниже.

Я думаю, что лучшая "причина" не использовать это / self / me - это краткость. Если это уже переменная / функция-член, зачем добавлять избыточный префикс?

Лично я избегаю использования этого / self / me, если нет необходимости устранять неоднозначность определенного выражения для компилятора. Многие люди не согласны с этим, но у меня никогда не было, чтобы это было камнем преткновения в любой группе, в которой я работал.

Другие советы

Я думаю, что большинство общих сценариев были рассмотрены в двух уже упомянутых сообщениях; в основном краткость и избыточность по сравнению с ясностью - незначительное дополнение: в C # требуется использовать «this» чтобы получить доступ к «методу расширения»; для текущего типа - т.е.

this.Foo();

где Foo () внешне объявлен как:

public static void Foo(this SomeType obj) {...}

В некоторых случаях это разъясняется, как, например, этот пример в c #:

public class SomeClass
{
    private string stringvar = "";

    public SomeClass(string stringvar)
    {
        this.stringvar = stringvar;
    }
}

Если вы используете StyleCop со всеми правилами, это заставляет вас вставить this. . Поскольку я начал использовать его, я считаю, что мой код более читабелен, но это личное предпочтение.

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

Для некоторых языков, таких как PHP, даже обязательно ставить префикс $ this- > если вам нужно использовать поля или методы класса.

Мне не нравится тот факт, что некоторые строки излишне длиннее, чем они могли бы быть, если бы в PHP был какой-то способ ссылаться на членов класса без него.

Я лично считаю, что this.whither менее читабельно. Вы можете не заметить разницу в двухстрочном методе, но подождите, пока вы не получите this.variable и this.othervariable везде в классе.

Кроме того, я думаю, что использование this. было найдено в качестве замены части очень ненавистной венгерской нотации. Некоторые люди там узнали, что читателю все еще понятнее видеть, что переменная является членом класса, и this. добились цели. Но зачем обманывать себя и не использовать для этого старый добрый " m_ " или просто " _ " , если нам нужна дополнительная ясность? Это 5 символов против 2 (или даже 1). Меньше печатать, тот же результат.

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

хорошо, eclipse делает цветовые поля, аргументы и локальные переменные разными цветами, поэтому, по крайней мере, работая в среде eclipse, нет необходимости синтаксически различать поля, чтобы специально пометить их как " поля " для себя и будущих поколений.

Об этом раньше спрашивали в переменной " в java " контекст:

Вы ставите префикс переменной вашего экземпляра с & # 8216; this & # 8217; в Яве?

Основная причина, по-видимому, такова:

  

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

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

Это звучит как чепуха для меня. Использование «this» может сделать код лучше, и я не вижу проблем с ним. Такая политика глупа (по крайней мере, когда вы даже не говорите людям, почему они на месте).

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

Я, конечно, в этом виноват, однако я их потом из чисто тщеславных соображений удаляю.

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

Квалификация переменной

string name; //should use something like _name or m_name

public void SetName(string name)
{
     this.name = name;
}

что касается меня, я использую this для вызова методов экземпляра объекта, тогда как self для статического метода

В VB.NET одной из распространенных практик, которую я использую, является следующий код:

Class Test
    Private IntVar AS Integer
    Public Function New(intVar As Integer)
       Me.Intvar = intvar
    End Function    
End Class

Не всегда, но в основном Я / это / я очень полезно. Разъясняет область, о которой вы говорите.

В типичном методе установки (взятом из ответа Лагердалека):

string name;

public void SetName(string name)
{
     this.name = name;
}

Если вы не используете его, компилятор не узнает, что вы ссылаетесь на переменную-член.
Использование this. говорит компилятору о том, что вам нужен доступ к переменной-члену, что выходит за пределы непосредственной области применения метода. Создание переменной внутри метода, имя которой совпадает с именем переменной-члена, является абсолютно допустимым, точно так же, как переопределение метода в классе, который расширил другой класс, является совершенно допустимым.
Однако, если вам все еще нужно использовать метод суперкласса, вы используете super. По моему мнению, используйте это. не хуже, чем при использовании супер. и дает программисту больше гибкости в их коде.

Насколько я понимаю, читаемость даже не влияет на это, все зависит от доступности ваших переменных.

В конце концов, это всегда вопрос личного выбора.Лично я использую следующее соглашение о кодировании:

public class Foo
{
  public string Bar
  {
    get
    {
      return this.bar;
    }
    /*set
    {
      this.bar = value;
    }*/
  }
  private readonly string bar;

  public Foo(string bar)
  {
    this.bar = bar;
  }
}

Так что для меня «это» на самом деле необходимо, чтобы конструктор оставался читаемым.

Редактировать:точно такой же пример был опубликован пользователем «sinje», когда я писал код выше.

Я не только часто использую «это».Я иногда использую «это».

class Foo
{
    private string bar;

    public int Compare(Foo that)
    {
        if(this.bar == that.bar)
        {
            ...

И так далее.«Это» в моем коде обычно означает другой экземпляр того же класса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top