Что сказать своему боссу, если они хотят, чтобы вы использовали глобальную переменную

13

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

Как бы вы справились с этим, ведь я профессионально программирую только 4 месяца!

Даррен Янг
источник
4
Ваш начальник технический или нетехнический человек? Если он технический, читал ли он «Чистый код» Роберта С. Мартина?
Джордж Стокер
5
Итак, ваш начальник нанял вас для кодирования, и теперь говорит вам, как кодировать?
Джереми Хейлер
8
Вы сказали в комментарии ниже, что «объект не имеет никакого состояния, кроме множества констант». В этом случае статический класс кажется мне хорошим решением.
Джастин
5
На ум
2
«сказал мне создать один объект, к которому можно получить доступ из любого места. Поэтому мне пришлось создать его как статический объект». Вы говорите так, как будто наличие единственного объекта, доступного из всего приложения, подразумевает, что у вас был Singleton - почему бы вам просто не создать его в корне агрегации, а затем передать его ссылку зависимым классам?
пожрал Элизиум

Ответы:

33

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

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

9000
источник
3
+1: насколько мне не нравится любой ответ "GoF сказал так", право верно.
Хавьер
1
Я действительно думал о Singletons, однако я только видел это как обертку вокруг глобальной переменной, поэтому я не стал ее отслеживать. Сейчас я попробую, так как у объекта нет состояния, кроме множества констант, поэтому все должно быть в порядке. Благодарю.
Даррен Янг
9
Я подозревал, что это может иметь место («объект не имеет никакого состояния ... много констант»). Ваш босс прав. Нет смысла оказывать искусственное давление на сборщик мусора для значений, которые никогда не меняются.
Берин Лорич
3
@ darren-young: примечание: отсутствие состояния - это интересно и позволяет использовать несколько мощных подходов; взгляните на так называемое «функциональное программирование», если вы еще этого не сделали.
9000
8

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

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

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

Joonas Pulakka
источник
1
Видите, java.lang.Systemсодержит ровно три глобальные переменные, и для каждой из них есть метод, чтобы правильно установить его. Но Systemон полон статических методов, которые возвращают глобальные объекты, и в этом нет ничего плохого, спорить не могу.
9000
2
Да; Я рассматриваю глобальные переменные почти так же, как статические методы, которые возвращают глобальные объекты.
Joonas Pulakka
Так Java делает это. Это другой вопрос полностью о том , является ли хорошей идеей. Стандартный генератор случайных чисел C поддерживает глобальное состояние. Но общепризнанно, что это ужасно , и, следовательно, генератор случайных чисел непригоден для использования в определенных приложениях (см., Например, Bentley et al., Разработка функции сортировки ). У Java, в частности, есть множество проблем проектирования (которые были частично улучшены в C #), поэтому я не очень осторожен в использовании его в качестве аргумента, подобного этому.
Конрад Рудольф
@Konrald Rudolph: В конце концов, это дизайнерское решение. У каждого решения есть свои плюсы и минусы. Например, поддержание глобального состояния Systemупрощает, скажем, 99,9% случаев использования за счет возникновения проблем в оставшихся 0,1%. Не существует «правильного» ответа на вопрос, стоит ли этот 0,1% дополнительной сложности.
Joonas Pulakka
5

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

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

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

Берин Лорич
источник
Это стажировка. Ты должен учиться. Слепо делать то, что говорит твой босс, не учиться.
Дэвид Торнли
5
И не слепо против вашего босса. Мой совет, как было написано, состоял в том, чтобы наблюдать за эффектами выбора босса. Мы (на stackexchange) не можем оценить ситуацию, потому что нам не хватает важной информации. Это случай, чтобы сделать небольшой научный метод. У ОП есть гипотеза, босс оспорил ее. Теперь пришло время провести эксперимент.
Берин Лорич
2

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

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

Макс Килланд
источник
1

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

Вот ссылка на объяснение википедии

guiman
источник
Я думаю, что good practiceбудет использовать en.wikipedia.org/wiki/Dependency_injection
Оливер Вейлер