|
53 / 53 / 19
Регистрация: 09.12.2015
Сообщений: 215
|
|||||||||||
Локальные переменные или прямое обращение к get-объекта класса?06.01.2016, 10:04. Показов 3660. Ответов 33
Метки нет (Все метки)
Собственно, что лучше? Создавать локальные переменные и хранить там значения, полученные из экземпляра или напрямую обращаться к полям объекта?
Например:
0
|
|||||||||||
| 06.01.2016, 10:04 | |
|
Ответы с готовыми решениями:
33
переменные в структуре. локальные или глобальные? Запретить прямое обращение к скрипту, но разрешить обращение через RewriteEngine Переменные или обращение к методам |
|
252 / 158 / 118
Регистрация: 26.11.2012
Сообщений: 384
|
|
| 06.01.2016, 10:11 | |
|
Первый вариант лучше, если в функции getSize() есть вычисления, то они будут производится каждый раз при вызове функции, также вызов функции требует времени, поэтому лучше записать эти значения в переменные.
0
|
|
|
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
|
|
| 06.01.2016, 10:14 | |
|
Зачем тут, вообще, get-ы? У тебя оператор член класса, он и без get-ов имеет доступ к приватным данным класса.
0
|
|
|
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
|
|||||||
| 06.01.2016, 10:26 | |||||||
|
Добавлено через 5 минут
0
|
|||||||
| 06.01.2016, 10:28 | |
|
0
|
|
| 06.01.2016, 10:30 | |
|
0
|
|
|
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
|
||||||||||||||||||||||||||||||||||||||||||||||
| 06.01.2016, 11:21 | ||||||||||||||||||||||||||||||||||||||||||||||
|
Ghost Writter, С Новым годом! В первую очередь, задаваясь вопросом как лучше делать, следует исходить из того, какую цель Вы преследуете. В знаменитой книге Мартина Фаулера - Рефакторинг, присутствуют оба рефакторинга, как "Замена переменной вызовом метода", подробнее с примером:
https://refactoring.guru/ru/re... with-query , так и "Извлечение переменной" подробнее с примером: https://refactoring.guru/ru/extract-variable Конечно оба этих рефакторинга чаще всего применяются в более сложных ситуациях (когда становится очевидной польза сокрытия информации) В первом случае - за вызовом метода скрывается некоторое вычисление, во втором случае - результат выражения скрывается за переменной имя которой поясняет суть выражения. Переходя применительно к Вашему случаю следует отметить следующее. Непосредственно по поставленному вопросу: 1) Читаемость: Вы создаете не константные локальные переменные, которые (теоретически) могут быть изменены, а значит при последующем чтении реализации данного метода придется думать о том, не произошел ли этот досадный казус. Как минимум следовало сделать их константными 2) Run time производительность: Если сложность вычисления размера вашего контейнера оценивается как O(1) - т.е. имеет константную сложность, то в принципе, по сравнению с операциями копирования элементов( В общем случае её сложность O(N) - линейная относительно числа элементов) - наличие 2х или 4х или даже 8х вызовов метода getSize() не приведет к явной потере производительности. В любом случае вопрос производительности во-первых решается на уровне оценки сложности алгоритма (просто так вызывать size-ы у листов - не лучшая идея) - а далее - если производительность остается под вопросом - выясняется путем измерения производительности и оценки наиболее узких мест программы, на которых тратится большинство циклов работы. Преждевременная оптимизация есть зло. Но преждевременная пессимизация зло так-же. 3) Алгоритм: Не совсем понятна суть алгоритма, который вы собираетесь применять. Почему для сложения двух массивов требуется 3 разные пути выполнения для случаев разного соотношения их размеров? С методологической точки зрения это не верно. Я исхожу из следующего: Если Вы подразумеваете семантику типа массив {1, 4, 7} + {2, 5} => {1, 4, 7, 2, 5} - то в таком случае нас интересует просто сумма размеров. Если Вы подразумеваете семантику типа {1, 2, 3} + {3, 2, 1,} => {4, 4, 4} - то в этом случае обрабатываемые диапазоны должны быть одинакового размера в любом случае (как пример из стандартной библиотеки: http://www.cplusplus.com/refer... transform/ , явное указание ограничения : first2 Input iterator to the initial position of the second range. The range includes as many elements as [first1,last1).) - Если переводить из понятия итераторов на понятие размера - пользователь должен был бы гарантировать равный размер массивов. Подводя промежуточный итог, я бы предпочел увидеть код типа:
Если это не возможно, а проблемы производительности нас не волнуют, тогда более чистую версию:
Наконец при явной необходимости явно вводить переменные для каких-то целей (должно быть четкое представление зачем они введены), я бы предпочел четкие имена у данных переменных в сочетании с константностью:
1) В любом случае следовало передавать складываемый контейнер по константной ссылке, сейчас происходит полное копирование value при вызове метода, а правильнее:
Кроме того, операция сложения НЕ изменяет текущие складываемые значения, она ПОРОЖДАЕТ новое значение как сумму складываемых. Каноничная форма сложения выглядела бы как свободная friend(при необходимости) функция с сигнатурой:
http://www.cplusplus.com/reference/string/string/ 4) В общем случае, если сложение двух массивов (статических) производится по правилам {1, 2, 3} + {4 , 5} => {1, 2, 3, 4, 5} то размер нового массива нужно вычислять статически на этапе компиляции. 5) Ни для статического массива, ни для его динамической версии не определяется оператор сложения, это связано с теорией типов. Ни для array ни для vector: http://ru.cppreference.com/w/cpp/container/array http://www.cplusplus.com/reference/vector/vector/ Оператор + не определен. Кроме того сами элементы вектора или массива не обязаны реализовывать оператор +. При необходимости каким-либо образом воздействовать на элементы, используются отдельные алгоритмы, работающие на итераторах, как уже приведенный мною transform: http://www.cplusplus.com/refer... transform/ Подробнее по поводу регулярных типов читайте в книге от создателя stl: Александр Степанов, Пол Мак-Джоунс - Начала программирования.
3
|
||||||||||||||||||||||||||||||||||||||||||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||
| 06.01.2016, 11:31 | |||||||
0
|
|||||||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|||
| 06.01.2016, 11:57 | |||
|
0
|
|||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||||||||||||||||||||
| 06.01.2016, 12:27 | ||||||||||||||||||||||
0
|
||||||||||||||||||||||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||
| 06.01.2016, 12:54 | ||
|
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||||||
| 06.01.2016, 13:30 | ||||||||
0
|
||||||||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
| 06.01.2016, 13:38 | |
|
Ну в таком случае, возвращается не сумма, а слагаемое. Что мы, оказывается, видим и в исходном методе. Прозреваю, что если в local_variable_method возвращать всё же сумму, то и ассемблерный выхлоп окажется неотличим.
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 06.01.2016, 14:03 | ||
|
2
|
||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
||
| 06.01.2016, 16:28 | ||
|
0
|
||
|
53 / 53 / 19
Регистрация: 09.12.2015
Сообщений: 215
|
||||||||||||||||
| 09.01.2016, 08:09 [ТС] | ||||||||||||||||
|
Melg, ну, вообще. Задание такое:
Задание 1) Создать поток расчёта сложной функции по случайным входным данным. 2) Создать поток вывода результатов расчёта через каждые 3 сек. 3) Синхронизировать потоки. 4) Реализовать операции полного останова потоков, перевода потоков в режим ожидания, запуска потоков. Дополнительные требования: - потоки работают бесконечно. Сам код у меня получился:
Суть в чем, сложной функцией является здесь, по сути, любая, которая делает какие-либо вычисления. Я сделал создание и инициализацию массива. Затем помещаю в стек и так далее, пока не пройдет три секунды и из стека все это выгружаем и удаляем. Это мой первый опыт написания класса. Насчет getSize() или getArray(). Как минимум в двух книгах по программированию читал то, что необходимо использовать именно такой подход. Он более выгоден. Теперь насчет использование полей или сохранение их в переменную. Недавно на одном комьюнити возник спор, на простую тему как выходить лучше из цикла, использовать для этого булевую переменную или оператор break. Тут код. Как оказалось, это одинаково на ЯА. Так и здесь хотелось бы узнать. Возможно value.getSize() ничего плохо в себе не несет на уровне ЯА и можно спокойно использовать данный метод.
0
|
||||||||||||||||
|
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
|
||
| 09.01.2016, 08:28 | ||
|
0
|
||
|
53 / 53 / 19
Регистрация: 09.12.2015
Сообщений: 215
|
|
| 09.01.2016, 08:37 [ТС] | |
|
0
|
|
|
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
|
|
| 09.01.2016, 08:42 | |
|
0
|
|
| 09.01.2016, 08:42 | |
|
Помогаю со студенческими работами здесь
20
Передача объекта класса в другой класс и обращение к этому объекту. (Потоки)
Глобальные и локальные переменные: что лучше (или что для чего и в чем конкретная разница)? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|