Какой тип имен переменных вы используете для сравнения двух объектов - PullRequest
2 голосов
/ 14 января 2009

Я выполняю множество сценариев анализа данных, сравнивая два объекта или строки, чтобы определить различия или найти пробелы, которые необходимо заполнить.
Когда вы в цикле, сравнивая объект a с объектом b, есть ли у вас предпочтительный стандарт кодирования, который имеет смысл (т. Е. Самодокументируется) и может хорошо переходить в другой код? Или имена переменных не имеют отношения к этому типу кода:

for (String a : TreeMapvar) {  
    // Read b from data source  
    if (a.equals(b)) {  
        // Update a  
    }  else {
        TreeMapvar.add(b);
}

Другой пример:

TreeMap<String, MyObject> TreeMapvar = new TreeMap<String, Object>();
File f = "Somefile";
// Open the file with bufferedReader br  
while ((line=br.readLine)!=null)) {  
    //insert code parse line to get object a  
    if (TreeMapvar.containsKey(a)) {  
        if (TreeMapvar.get(a).somefield.equals(a.somefied)) {  
            //insert code to update a  
        } else {  
            //insert code to insert new object  
        }  
     }  
}

Ответы [ 5 ]

3 голосов
/ 14 января 2009

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

for (String localData : TreeMapvar) {  
    // Read remoteData from data source  
    if (localData.equals(remoteData)) {  
        // Update or add to a counter  
    }  
}

если я понял твой дрейф.

Дело в том, что сравнение становится очевидным благодаря использованию .equals (), поэтому нам не нужно использовать имена переменных (в общем), чтобы сказать, что значения будут сравниваться, что не очевидно (и таким образом, более важным является то, какие значения сравниваются.

РЕДАКТИРОВАТЬ: Ваш второй пример ничего не меняет. Вы по-прежнему используете паршивые имена a и b, где вы должны использовать описательные, показывающие, что на самом деле представляют a и b. Я все еще вижу четкое сравнение, так что это не имеет отношения к именованию.

РЕДАКТИРОВАТЬ (re, ваш комментарий): Это легко. Единственная необходимая вещь - это некоторый контекст, скажем, карта содержит имена пользователей, связанные с тем, что вам нравится, и вы сравниваете их с существующей пользовательской информацией.

for (String a : TreeMapvar) {  
    // Read b from data source  
    if (a.equals(b)) {  
        // Update or add to a counter  
    }  
}

for (String userName : TreeMapvar) {  
    String existingUserName = getNextUserName();
    if (userName.equals(existingUserName)) {  
        // Update or add to a counter  
    }  
}
2 голосов
/ 14 января 2009

Имена переменных должны улучшить читабельность кода, в вашем примере (без попыток изменить код):

  1. a можно назвать как-то как baseValue
  2. b можно назвать как-то как compareToValue или testValue

так что если (a.equals (b)) {
становится if (baseValue.equals (compareToValue)) {

1 голос
/ 14 января 2009

Что ж, если вам нужно 2 имени переменных, давайте назовем их a и b, тогда у вас, вероятно, задействованы 3 объекта: self, a, b.

Теперь, это довольно много для меня, я стараюсь держать вещи меньше.

Итак, рассмотрим ваш первый пример:

for (String a : TreeMapvar) {  
    // Read b from data source  
    if (a.equals(b)) {  
        // Update a  
    }  else {
        TreeMapvar.add(b);
}

Итак, почему бы всему вашему фрагменту не быть частью определения класса b и переименовать b в "this"?

lookAtYourTreeMap() {
    for( String a : TreeMapvar) {
      this.accomodateTreemapIfNecessaryTo(a);
    }
}

И тогда у меня был бы метод

accomodateTreemapIfNecessaryTo(a) {
  if(a .equals( this)) {
     a.update();
  } else {
    TreeMapVar.add(a);
  }
}

Обратите внимание, что изобретатель современного компьютера Кент Бек говорит, что методы должны быть короткими.

Запустите все это в своем третьем компоненте так:

B b = loadBFromSource();
b.lookAtYourTreemap();

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

0 голосов
/ 14 января 2009

Короче говоря, контекст (имя переменной говорит о том, что она содержит) и читабельность - вот, что я думаю, имеет значение.


foreach(Order order in Orders)
{
    if (order.ID == queriedOrderID)....
}

0 голосов
/ 14 января 2009

Если в рассматриваемом языке реализована перегрузка операторов, то я бы реализовал оператор ==. Если это не так, то вы можете либо использовать равно, как указано выше, или реализовать функцию «Сравнить»

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

Функция сравнения выглядит следующим образом:

int Compare(string a, string b)
{
  if(a < b) return -1;
  else if (a == b) return 0;
  else return 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...