2011-02-05 2 views
1

Хорошо, это может быть базовым, но я хочу, чтобы хорошие мнения программистов об этом.Объявление переменной Java

Что такое хороший способ обработки переменных в файле небольшого класса?

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

Например:

class Test{ 
    somefunction(int a, int b, int c, int d) { 
     doSomething(a, b, c); 
     doOneMoreThing(a, c, d); 
    } 
    void doSomething(int a, int b, int c) { } 
    void doOneMoreThing(int a, int c, int d) { } 
} 

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

ответ

3

Нужно ли поддерживать переменные между вызовами методов и повторно использовать их стоимость? Если это так, они должны быть членами класса. (По крайней мере, в класс - не обязательно этот.)

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

OTOH, проходящий множество параметров вокруг, может быть неудобным. Вы можете рассмотреть introducing a Parameter Object, чтобы устранить эту проблему.

0

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

+0

ну, я не думал, что кто-то будет искать синтаксические ошибки, я не пытался отлаживать код здесь. Это был всего лишь пример, который заставил бы людей лучше понять, что я ищу. Если вы прочитали вопрос/ответы, вы бы знали, что вам не нужно будет знать детали функции, чтобы ответить на него. – Maximus

+0

@Maxius: Вот почему вы должны опубликовать минимальное компилируемое количество кода, демонстрирующее вашу проблему. Кроме того, ваш вопрос субъективен, поэтому на самом деле информации недостаточно, чтобы дать вам ответ. – Falmarri

1

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

1

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

Test.doSomething(1, 2, 3); 
2

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

Вместо

class Foo { 
    public doSomething(...) { 
    // some setup 
    doSomethingRecursively(a, b, c); 
    } 

    private void doSomethingRecursively(A a, B b, C c) { 
    if (baseCase) { ... } 
    doSomethingRecursively(a + 1, b, c); 
    } 
} 

Я перееду переменные, которые никогда не разница в свойствах на работника.

class Foo { 
    public doSomething(...) { 
    // some setup 
    new AppropriatelyNamedHelper(b, c).doSomethingRecursively(a); 
    } 

    private static final class AppropriatelyNamedHelper { 
    final B b; 
    final C c; 

    AppropriatelyNamedHelper(B b, C c) { 
     this.b = b; 
     this.c = c; 
    } 

    void doSomethingRecursively(A a) { 
     if (baseCase) { ... } 
     doSomethingRecursively(a + 1); 
    } 
    } 
} 

Это дает понять рецензента, что в каждой области инвариантно внутри этой области.

2

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

Однако, хотя вам может потребоваться «модульная» функциональность, прочитайте о связи против сцепления. Существует баланс между наличием слишком большого количества функций в классе, но меньшим количеством зависимостей и наличием очень небольшой, но очень специфичной функциональности и большого количества зависимостей.

+0

Спасибо, я прочитаю связь против когезии, чтобы лучше понять это! – Maximus

1
  • Переменные экземпляра: их значения уникальны для каждого экземпляра класса. Когда объект распределяется в куче, в нем есть слот для каждого значения переменной экземпляра. Поэтому переменная экземпляра создается, когда объект создается и уничтожается при уничтожении объекта.
  • Переменная класса: переменные класса объявляются с помощью статического ключевого слова/модификатора. Существует только одна копия переменной класса независимо от того, сколько раз экземпляр класса создается. Они хранятся в статической памяти.
  • Локальные переменные: доступны только в том способе, который они объявили. Когда вводится метод, область помещается в стек вызовов. Эта область содержит слоты для каждой локальной переменной и параметра. Когда метод вызывается, слоты параметров инициализируются значениями параметров. Когда метод завершает работу, эта область удаляется из стека, и память становится доступной для следующего вызываемого метода.

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

0

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

Смежные вопросы