2016-09-19 13 views
0

говорят, что вам нужно закодировать sw в C++/java, в каком из двух способов ниже вы бы выбрали реализацию большинства функций?функции void без функции arg vs returing с argh

void function(){ 
    //code which uses private/public class variables 
    //it modifies directly variable outside of the function 
} 

xyztype function(a,b,c,d){ 
    //code which uses local variables and args 
    xyztype xyz; 
    return xyz; 
} 

Мой вопрос в терминах:

1. Performance 
2. Good practice in terms of perfomance 

Я не забочусь о читаемости/юзабилити или что-нибудь подобное. В школе мы были использованы для кодирования второго пути, но теперь я склонен использовать 9/10 раз первый метод. Очевидно, что локальные переменные быстрее, но что, если у меня есть 40 функций, действующих на 5 переменных? Устранение всего локально, возможно, может быть контрпродуктивным

+0

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

ответ

0

Производительность не всегда является первым делом (в то время как ваш код не критичен по производительности). Для серьезных проектов вы хотите, чтобы ваш код был четким и выполнял определенную парадигму, чтобы упростить последующую разработку.
Функции, которые обращаются к глобальным переменным, используются для парадигмы процедурного программирования (например, в pascale, assembly ...), и добавление некоторого кода позже будет настолько сложным, если вы будете следовать этому методу, и поэтому рекомендуется использовать объектно-ориентированное программирование ,

Процедура - это функция, которая не имеет возвращаемого значения, так что это то, о чем вы говорите.

А насчет передачи аргументов, вы действительно не хотите, чтобы функция Асесс глобальные переменные по многим причинам:

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

    Этот пример, чтобы повернуть сегмент, есть две возможности, повернуть его над точкой в ​​плане или повернуть по его центру, но оба вызова функций с использованием этого метода будут выглядеть так: «roate_line()» так что вы не можете догадаться об этом.

  • Другая причина заключается в том, что вы можете использовать эту функцию для применения изменений только для определенного набора переменных, и ваш код не будет динамическим, вам действительно нужно реализовать функцию для каждого набора переменных, чтобы применить одинаковые тип обработки (10 функций для вращения 10 сегментов !!!)

Но если говорить о производительности, передавая аргументы осуществляется через дымовую трубу, и каждый пройденный аргумент требует толчок и поп-инструкции и доступ к памяти, так в основном немного медленнее (компьютер на основе стека, как и большинство современных), на самом деле очень быстро выполняет это), поэтому вы не заметите разницы, отметив, что многие программисты исправляют выпуск e путем передачи указателя структуры, так что одна переменная будет передана только (адрес), а не вся структура