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


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

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

5 67

5 ответов:

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

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

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

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

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

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

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

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

вот пример:

myCircle = myDrawing.drawCircle(center, radius);

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

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

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

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

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

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

ИМХО:

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

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

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

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

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

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

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

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