2008-12-06 3 views
64

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

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

+1

Если у вас есть конкретные примеры, вы можете получить более полезные ответы – Brabster 2008-12-06 10:46:09

ответ

34

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

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

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

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

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

+0

Мой ответ будет добавить этот ответ на ответ H-Man2 (lifetime). Он должен быть атрибутом участника тогда и только тогда, когда он является постоянным состоянием объекта. То есть, значение само по себе само по себе выходит за рамки текущего стека методов. – 2008-12-06 10:59:09

+0

Моя реакция кишки заключается в том, чтобы согласиться с Дэвидом и H-MAn2. Однако я читаю «чистый код» Роберта Мартина и в главе 3 он реорганизует код, чтобы переместить что-то из параметра метода в переменную-член, потому что наличие большого количества параметров является плохим.В целом, я думаю, если ваш класс имеет только одну ответственность, то время жизни объекта совпадает с временем жизни этого вычисления, поэтому, возможно, фактический ответ заключается в том, что если вы должны задать этот вопрос, то ваш класс слишком велик? – Andy 2015-11-13 14:18:13

32

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

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

3

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

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

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

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

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

+0

Вы часто хотите, чтобы методы были общедоступными, поэтому вы можете их тестировать. – obesechicken13 2015-12-16 18:59:39

4

ИМХО:.

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

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

Надеется, что это помогает

13

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

Вот пример:

myCircle = myDrawing.drawCircle(center, radius); 

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

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

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

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

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

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