C ++: использование '.'оператор выражений и вызовов функций - PullRequest
2 голосов
/ 21 февраля 2011

Мне было интересно, если это хорошая практика, использовать оператор-член ., например:

someVector = (segment.getFirst() - segment.getSecond()).normalize().normalCCW();

Просто сделал это, чтобы показать две разные вещи, которые мне интересны, а именно, если использовать (expressions).member/function()и foo.getBar().getmoreBar() соответствовали духу читабельности и ремонтопригодности.Во всем коде на С ++ и книгах, из которых я узнал, я никогда не видел, чтобы он использовался таким образом, но его опьяняюще легко использовать как таковой.Хотя я не хочу развивать какие-либо вредные привычки.

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

Заранее спасибо!

Ответы [ 8 ]

4 голосов
/ 21 февраля 2011

или непредвиденные ловушки, которые могут привести к ошибкам в программе

Ну, возможные ловушки будут

  1. Сложнее отладить.Вы не сможете просматривать результаты каждого вызова функции, поэтому, если один из них возвращает что-то неожиданное, вам нужно будет разбить его на более мелкие сегменты, чтобы увидеть, что происходит.Кроме того, любой вызов в цепочке может полностью потерпеть неудачу, поэтому вам, возможно, придется разбить его, чтобы выяснить, какой вызов не удался.

  2. Труднее читать (иногда).Цепные вызовы функций могут затруднить чтение кода.Это зависит от ситуации, здесь нет жесткого и быстрого правила.Если выражение даже несколько сложное, это может усложнить понимание.У меня нет проблем с чтением вашего конкретного примера.

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

3 голосов
/ 21 февраля 2011

Да, это вполне приемлемо и фактически было бы совершенно нечитаемым во многих контекстах, если бы вы этого НЕ делали.

Это называется цепочкой методов.

МОЖЕТ бытьувеличение производительности в том, что вы не создаете временные переменные.Но любой компетентный компилятор все равно его оптимизирует.

1 голос
/ 21 февраля 2011

Использование переменной для хранения промежуточных результатов может иногда улучшить читабельность, особенно если вы используете хорошие имена переменных.Чрезмерное сцепление может затруднить понимание происходящего.Вы должны использовать свое суждение, чтобы решить, стоит ли разрывать цепочки, используя переменные.Приведенный вами пример не является чрезмерным для меня.Производительность не должна сильно отличаться, если вы включите оптимизацию.

1 голос
/ 21 февраля 2011
someVector = (segment.getFirst() - segment.getSecond()).normalize().normalCCW();

Не ответ на ваш вопрос, но я должен сказать вам, что поведение выражения (segment.getFirst() - segment.getSecond()) не является четко определенным в соответствии со стандартом C ++. Порядок, в котором оценивается каждый операнд, является неопределенным Стандартом!

Также см. Эту связанную тему: Правильно ли определен этот код?

1 голос
/ 21 февраля 2011

вполне допустимо использовать его так, как вы показали.Он используется в именованном параметре идиома , описанном, например, в C ++ faq lite.

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

my2c

0 голосов
/ 21 февраля 2011

Это зависит от того, что вы делаете.

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

0 голосов
/ 21 февраля 2011

Нет большой проблемы с его использованием таким образом - некоторые API значительно выигрывают от цепочки методов.Плюс вводить переменную в заблуждение, а затем использовать ее только один раз.Когда кто-то читает следующую строку, ему не нужно думать обо всех тех переменных, которые вы сейчас не сохранили.

0 голосов
/ 21 февраля 2011

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

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

...