методы считывания и стиль методов set

Я бы использовал readlines и split.

cc = 'CARTESIAN_COORDINATES.txt'

with open(cc) as data:
    lines = data.readlines()[2:] # skip first two lines
    for line in lines:
        ls = line.split()
        a, b, c, d, e = int(ls[0]), ls[1], float(ls[2]), float(ls[3]), float(ls[4])
        print(a, b, c, d, e)

Вывод:

1 C 0.011987266 -0.003842185 0.006578784
2 H 1.097152909 -0.003956163 0.01333931
3 H -0.349612312 1.019316731 0.001903075
4 H -0.344276148 -0.517463019 -0.880495291
5 H -0.355315644 -0.513266496 0.891567896
23
задан 2 revs, 2 users 100% 26 April 2011 в 09:14
поделиться

13 ответов

Я бы предпочел версии get / set, потому что это более понятно, что происходит. Если я увидел rate () и rate (10), как я узнаю, что rate (10) не просто использует 10 в расчете для возврата показателя? Я не знаю, так что теперь я должен начать искать, чтобы выяснить, что происходит. Одно имя функции должно делать одно, а не две противоположные вещи.

Кроме того, как уже отмечали другие, некоторые предпочитают опускать «get» и оставлять «set», т. Е.

int Rate( );
void SetRate( int value );

Это соглашение также довольно ясно, я бы не стал любая проблема с чтением.

32
ответ дан 29 November 2019 в 01:10
поделиться

Как насчет int rate(); и void setRate(int value);? Это имеет то преимущество, что две функции с одним и тем же именем не выполняют разные функции, и все же позволяет period() * rate().

6
ответ дан 29 November 2019 в 01:10
поделиться

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

Когда я начал изучать C ++, я искал руководства по стилю, и Google был хорош для некоторых моментов:

  • Методы в верхнем регистре (это просто красивее).
  • геттеры явно и в нижнем регистре (rate).
  • устанавливает явно и в нижнем регистре (setRate).
4
ответ дан 29 November 2019 в 01:10
поделиться

Существует несколько уровней «Получение» и «Настройка»

  • Я использую «Get» и «Set» для «быстрых» операций.
  • Если для выполнения чего-либо требуется больше времени, то это часто будет Calc, так как эти имена означают, что для получения результата необходимо проделать определенную работу.
  • Для более длительных операций вы начинаете получать префиксы, такие как Загрузка / Сохранение, Запрос / Хранение, Чтение / Запись, Поиск / Поиск и т. Д.

Таким образом, Get / Set может быть приписан полезному значению и быть частью более крупной, последовательной стратегии именования.

2
ответ дан 29 November 2019 в 01:10
поделиться

Лично я думаю, что геттеры и сеттеры, найденные в парах, являются запахом кода, перенесенным из «визуальных» языков и их «свойств». В «хорошем» классе члены данных доступны только для чтения или только для чтения, но не для чтения / записи.

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

Возможно, есть исключения, но я просто ненавижу смотреть на класс и находить "getX / setX, getY / setY и т. Д. И т. Д." Просто кажется, что недостаточно было продумано, как ДОЛЖЕН использоваться класс, и, скорее, автор сделал класс ЛЕГКИМ, чтобы получить доступ к данным, чтобы ему не пришлось думать о том, как этот класс следует использовать.

Естественно, я прав.

1
ответ дан 29 November 2019 в 01:10
поделиться

Я применяю соглашение, согласно которому метод всегда должен быть глаголом, а класс всегда должен быть существительным (за исключением функторов по очевидным причинам). В этом случае префикс get / set должен использоваться для согласованности. Тем не менее, я также полностью согласен с Эдом Свангреном. Для меня это сводится к тому, что использование этих префиксов не составляет труда.

0
ответ дан 29 November 2019 в 01:10
поделиться

Если ваш получатель просто rate(), ваш компилятор будет жаловаться, что это переопределение вашего другого символа rate, при условии, что вы дали своему полю хорошее понятное имя, подобное этому. В этом случае вам нужно сделать что-то глупое, например, назвать вашего члена _rate или какой-то другой подобный подход. Я лично ненавижу видеть / печатать эти подчеркивания, поэтому склоняюсь к подходу getRate().

Это, очевидно, субъективно, и это просто мои личные предпочтения.

0
ответ дан 29 November 2019 в 01:10
поделиться

I have always preferred to omit the 'get' on my getters, as you do, with rate() instead of getRate(). But overloading for the setter does not seem like a very good idea to me, since the name rate doesn't convey that the object is being mutated. Consider:

total(period() * rate()); // awesome, very clear

rate(20); // Looks like it computes a rate, using '20'...but for what?  And why ignore the return value?
6
ответ дан 29 November 2019 в 01:10
поделиться

While Ed's comment is true, I do prefer actual properties over the setter/getter antipattern. When 1/3rd of the methods in your domain graph are dummy methods that have been generated by eclipse, there's something wrong.

Without first class properties, however, I believe the antipattern makes the most sense.

Furthermore, it makes code completion easier.

obj.set (control shift space) for setters
obj.get (control shift space) for getters

1
ответ дан 29 November 2019 в 01:10
поделиться

A few years ago, I would have agreed completely. More recently, a doubt began to make its way, because that makes taking the address of a getter or setter ambiguous. With tools like tr1::bind, this is really annoying.

For example:

struct A
{
   void Foo(int);
   int Foo()const;
};

std::vector<A> v = ....;
std::vector<int> foos;
// Extract Foo
std::transform(
   v.begin(), v.end(), 
   std::back_inserter(foos), 
   //Ambiguous
   // std::tr1::bind(&A::Foo)
   //must write this instead. Yuck!
   std::tr1::bind(static_cast<int(Foo::*)()>(&A::Foo));
);

Leaving aside the question of should you have them at all ;-)

5
ответ дан 29 November 2019 в 01:10
поделиться

Being concise is important, but not at the cost of being incomplete or misleading. For that reason, I prefer GetFoo() and SetFoo() to Foo() and Foo(int foo).

2
ответ дан 29 November 2019 в 01:10
поделиться

Еще одна проблема, о которой никто не упомянул, - это случай функции перегрузка. Возьмем этот (надуманный и неполный) пример:

class Employee {
    virtual int salary() { return salary_; }
    virtual void salary(int newSalary) { salary_ = newSalary; }
};

class Contractor : public Employee {
    virtual void salary(int newSalary) {
        validateSalaryCap(newSalary);
        Employee::salary(newSalary);
    }
    using Employee::salary; // Most developers will forget this
};

Без этого с использованием предложения пользователи Подрядчик не могут запросить зарплату из-за перегрузки. Недавно я добавил -Woverloaded-virtual в набор предупреждений проекта, над которым я работаю, и, о чудо, это обнаружилось повсюду.

2
ответ дан 29 November 2019 в 01:10
поделиться

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

могут возникнуть проблемы:

class Stuff {
  void widget( int something ); // 'special' setter
  const Widget& widget( int somethingelse ) const; // getter
}
Stuff a; 
a.widget(1); // compiler won't know which widget you mean, not enough info
0
ответ дан 29 November 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: