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


13

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

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


4
Ваш начальник технический или нетехнический человек? Если он технический, читал ли он «Чистый код» Роберта С. Мартина?
— Джордж Стокер

5
Итак, ваш начальник нанял вас для кодирования, и теперь говорит вам, как кодировать?
— Джереми Хейлер

8
Вы сказали в комментарии ниже, что «объект не имеет никакого состояния, кроме множества констант». В этом случае статический класс кажется мне хорошим решением.
— Джастин

5
На ум

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

Ответы:


33

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

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


3
+1: насколько мне не нравится любой ответ "GoF сказал так", право верно.
— Хавьер

1
Я действительно думал о Singletons, однако я только видел это как обертку вокруг глобальной переменной, поэтому я не стал ее отслеживать. Сейчас я попробую, так как у объекта нет состояния, кроме множества констант, поэтому все должно быть в порядке. Благодарю.
— Даррен Янг

9
Я подозревал, что это может иметь место («объект не имеет никакого состояния ... много констант»). Ваш босс прав. Нет смысла оказывать искусственное давление на сборщик мусора для значений, которые никогда не меняются.
— Берин Лорич

3
@ darren-young: примечание: отсутствие состояния - это интересно и позволяет использовать несколько мощных подходов; взгляните на так называемое «функциональное программирование», если вы еще этого не сделали.
— 9000

8

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

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

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


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. Это очень хорошая практика, когда вам нужно получить доступ к определенному объекту из нескольких экземпляров.

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


Я думаю, что good practiceбудет использовать en.wikipedia.org/wiki/Dependency_injection
— Оливер Вейлер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.