Когда передавать параметр и когда использовать переменную экземпляра

Как вы, ребята, решаете, как отслеживать что-то локально, а затем просто передавать его каждому методу, который вы вызываете, или объявлять переменную экземпляра и использовать ее в методах?

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

Ответ 1

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

  • Переменные экземпляра обычно считаются атрибутами класса. Подумайте об этом как о прилагательных объектах, которые будут созданы из вашего класса. Если данные экземпляра могут использоваться для описания объекта, то, вероятно, безопасно ставить его хорошим выбором для данных экземпляра.

  • Локальные переменные используются в рамках методов, чтобы помочь им выполнить свою работу. Обычно метод должен иметь целью получить некоторые данные, вернуть некоторые данные и/или выполнить/запуск алгоритма для некоторых данных. Иногда это помогает думать о локальных переменных, как о способах оказания помощи от начала до конца.

  • Область переменных экземпляра предназначена не только для безопасности, но и для инкапсуляции. Не предполагайте, что "цель должна состоять в том, чтобы сохранить все переменные конфиденциальными". В случаях наследования создание переменных как защищенных обычно является хорошей альтернативой. Вместо того, чтобы маркировать все данные экземпляра public, вы создаете геттеры/сеттеры для тех, к которым необходимо получить доступ к внешнему миру. Не делайте их доступными - только те, которые вам нужны. Это будет происходить на протяжении всего жизненного цикла разработки - трудно догадаться с самого начала.

Когда дело доходит до передачи данных вокруг класса, трудно сказать, что вы делаете, это хорошая практика, не видя какой-то код. Иногда, работа непосредственно с данными экземпляра в порядке; в других случаях, нет. На мой взгляд, это то, что приходит с опытом - вы будете развивать некоторую интуицию по мере улучшения ваших объектно-ориентированных навыков мышления.

Ответ 2

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

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

Ответ 3

По-моему, переменные экземпляра необходимы только тогда, когда данные будут использоваться во всех вызовах.

Вот пример:

myCircle = myDrawing.drawCircle(center, radius);

Теперь для создания образа myDrawing класс использует 15 вспомогательных функций для создания объекта myCircle, и для каждой из этих функций потребуется центр и радиус. Они все равно не должны быть установлены как переменные экземпляра класса myDrawing. Потому что они больше никогда не понадобятся.

С другой стороны, класс myCircle должен хранить как центр, так и радиус как переменные экземпляра.

myCircle.move(newCenter);
myCircle.resize(newRadius);

Чтобы объект myCircle знал, каков его радиус и центр, когда эти новые вызовы сделаны, они должны быть сохранены как переменные экземпляра, а не просто переданы им функции.

В основном, переменные экземпляра - это способ сохранить "состояние" объекта. Если переменная не требуется знать состояние объекта, то она не должна быть переменной экземпляра.

А как сделать все публичным. Это может сделать вашу жизнь проще в данный момент. Но он вернется, чтобы преследовать вас. Пейз не делает.

Ответ 4

ИМХО:

Если переменная формирует часть состояния экземпляра, то это должна быть переменная экземпляра - classinstance HAS-A instancevariable.

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

Надеюсь, что это поможет

Ответ 5

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

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

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

Об отправке параметров все, что происходит до стека, это может стать очень уродливым. Эмпирическое правило заключается в том, чтобы ваши сигнатуры методов были чистыми и элегантными. Если вы видите много методов, использующих одни и те же данные, определите, достаточно ли он достаточно для того, чтобы быть членом класса, а если нет, реорганизовать свой код, чтобы он имел больше смысла.

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