2013-06-26 2 views
3

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

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

public class Example{ 

    private String attribute1; 

    public void setAttribute1(String att){ 
     this.attribute1 = att; 
    } 

    private void processAttribute(){ 
     //do something with attribute1 
    } 

    public void executeExample(){ 
     processAttribute(); 
    } 

} 

Где processAttribute() использует значение attribute1 внутренне. Тем не менее, многие док говорит, что мы должны попытаться ограничить использование глобальных переменных. Будет ли это более многоразовым и хорошо продуманным способом написать что-то вроде этого?

public class Example{ 

    private String attribute1; 

    public void setAttribute1(String att){ 
     this.attribute1 = att; 
    } 

    private void processAttribute(String att){ 
     //do something with attribute1 
    } 

    public void executeExample(){ 
     processAttribute(this.attribute1); 
    } 

} 

Объедините свои идеи.

+0

Это не случай глобальных переменных, а первый стиль - правильный стиль. Чтобы быть глобальным, вам нужно сделать переменную 'public static' или что-то в этом роде. –

ответ

2

Многие из аргументов против глобального государства применять здесь:

  • это труднее рассуждать о корректности программ, если атрибут используется в других местах, кроме метод processAttribute
  • сложнее распараллелить код, который использует глобальное состояние: что должно произойти, если атрибут изменен во время его обработки?
  • более
  • : http://c2.com/cgi/wiki?GlobalVariablesAreBad

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

+0

Вот к чему я хочу добраться. Итак, на ваш взгляд, следует ли использовать параметры здесь? –

+0

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

1

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

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

+0

как это переменная класса ?? !!! – stinepike

+1

Очевидно, что ему НЕ НУЖНО передать его. Вопрос в том, что лучший дизайн. – Goatcat

+0

Это атрибут класса Example. Если объявлено что-то вроде public static, вы можете считать его глобальной переменной. –

0

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

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

Итак, в вашем примере переменная attribute1 не является глобальной переменной. Это только переменная-член класса.

Следовательно, я не вижу большой разницы между двумя разными кодами.

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

+0

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

+0

Я не вижу разницы в производительности между этими двумя реализациями – stinepike

+0

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