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

StackOverflow https://stackoverflow.com/questions/346169

  •  19-08-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

Вот пример:

myCircle = myDrawing.drawCircle(center, radius);

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

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

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

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

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

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

ИМХО:

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top