Передача переменных экземпляра класса в качестве параметров

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

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

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);
    }

}

Объедините ваши идеи.

3 ответа

Решение

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам