Що сказати своєму начальнику, якщо вони хочуть, щоб ти використовував глобальну змінну


13

В даний час я проходжу стажування 4 місяці, і, переглядаючи свій код, моєму начальнику не сподобалось, що я зберігав певний об'єкт, локальний у кількох методах, протягом декількох окремих класів в межах однієї асамблеї. Йому не сподобалось, що мені кожен раз створювали новий об’єкт, і замість цього він сказав мені створити єдиний об’єкт, до якого можна отримати доступ з будь-якого місця. Тому мені довелося створити його як статичний об'єкт у статичному класі, і просто посилатись звідси, я хочу його використовувати!

Як би ти справився з цим, адже я займався професійним програмуванням лише 4 місяці!


4
Ваш начальник - це технічна особа чи нетехнічна особа? Якщо він технічний, чи читав "Чистий код" Роберта К. Мартіна?
Джордж Стокер

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

8
Ви сказали в коментарі нижче, що "об'єкт не має жодного стану, крім великої кількості констант". У цьому випадку статичний клас здається мені хорошим рішенням.
Джастін

5
"Так бос"

2
"сказав мені створити єдиний об'єкт, доступ до якого можна отримати з будь-якого місця. Тому я повинен був створити його як статичний об'єкт". Це неправдиві міркування. Ви говорите так, ніби маючи один об'єкт, доступний з усієї програми, мається на увазі, що у вас був Singleton - чому б вам просто не створити його в корені агрегації і потім не передати його посилання на залежні класи?
пожирав елізіум

Відповіді:


33

Якщо одного об’єкта вистачає, щоразу створювати об’єкт - це марно, і ось ваш начальник може мати рацію.

Проблема полягає в належному доступі до цього об’єкта. Фабрично схожий метод із належною видимістю, який завжди повертає цей статичний об'єкт - це перше рішення, яке спадає на думку. Інші, безумовно, існують.


3
+1: стільки, скільки мені не подобається будь-яка відповідь "Гоф сказав так", правильно.
Хав'єр

1
Я думав про Singletons, однак я просто бачив це як обгортку навколо глобальної змінної, тому я не дотримувався цього. Я спробую це спробувати зараз, оскільки об'єкт не має жодного стану, крім великої кількості констант, так що це повинно бути добре. Спасибі.
Даррен Янг

9
Я підозрював, що це може бути так ("об’єкт не має стану ... багато констант"). Ваш начальник правий. Немає сенсу чинити штучний тиск на збирач сміття за значеннями, які ніколи не змінюються.
Берин Лорич

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

8

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

Але взагалі, якщо ви думаєте, що ви праві, а ваш начальник помиляється, то чому б вам не попросити свого начальника пояснити, чому він вважає глобальну змінну кращим рішенням? Простий "мені це не подобається" такий же розпливчастий, як "глобальні змінні - це зло". Ви повинні вимагати більше від свого начальника!

Якщо він не може навести причин своєї позиції, а ви можете пояснити свою позицію, або навпаки, то це гарна можливість навчання. Якщо ви обидва можете виправдати свої позиції, то, мабуть, це питання смаку - чи питання досвіду: ваш начальник, мабуть, професійно програмував більше 4 місяців, я думаю?


1
Дивіться, java.lang.Systemмістить рівно три глобальних змінних, і для кожної з них існує метод її правильного встановлення. Але Systemповний статичних методів, які повертають глобальні об'єкти, і в цьому немає нічого поганого, не можна сперечатися.
9000

2
Так; Я вважаю глобальні змінні майже однаковими як статичні методи, що повертають глобальні об'єкти.
Joonas Pulakaka

Тож Java робить це. Це інше питання повністю про те , чи є хорошою ідеєю. Стандартний генератор випадкових чисел C зберігає глобальний стан. Але загальновизнано, що це жахливо , і тому генератор випадкових чисел тому непридатний у певних програмах (див., Наприклад, Bentley et al., Engineering a function function ). Зокрема, у Java є безліч проблем із дизайном (які були частково покращені в C #), тому я не буду дуже обережно використовувати це як такий аргумент.
Конрад Рудольф

@Konrald Rudolph: Зрештою, це дизайнерське рішення. У кожного рішення є плюси і мінуси. Наприклад, збереження глобального стану Systemспрощує, скажімо, 99,9% випадків використання ціною, що викликає проблеми у решті 0,1%. Немає «правильної» відповіді на те, чи варто 0,1% вартості додаткової складності.
Joonas Pulakaka

5

Як хтось, хто займає ваше становище, найбільше ви можете вчитися. Якщо об'єкт по суті є постійною (тобто він не може змінюватися і не підтримує стан), то ваш начальник може мати рацію. Немає шкоди мати статичний постійний об’єкт. Зрештою, скільки існує визначень ПІ?

Деякі люди захищають мислення "без глобальних об'єктів" до точки зору релігійного пагорба. Це з однієї з двох причин: їм було важко відслідковувати помилки або крихкість системи через надмірне використання глобальних змінних / об'єктів, або вони чули, що це погано, і вони не можуть думати про себе. Я особисто потрапляю до групи людей, яких сильно постраждали крихкість і важко відслідковувати помилки - але я також навчився тут деякої рівноваги.

Якби я був у твоїх черевиках, я б пішов наперед і зробив те, що каже начальник - все-таки його зад на лінії. Тоді я б спостерігав і бачив наслідки цього вибору з часом. Це ефективний інструмент навчання.


Це стажування. Ви повинні вчитися. Сліпо робити те, що говорить ваш начальник, не вчиться.
Девід Торнлі

5
Також сліпо не йде проти вашого начальника. Моя порада, як було написано, полягала в тому, щоб дотримуватися наслідків вибору начальника. Ми (на stackexchange) не можемо оцінити ситуацію, оскільки нам не вистачає важливої ​​інформації. Це справа, щоб зробити трохи науковий метод. В ОП є гіпотеза, бос оскаржив її. Тепер прийшов час виконати експеримент.
Берін Лорич

2

Залежно від конкретної ситуації глобальна змінна може бути найкращим рішенням. У вбудованому програмуванні глобальні мережі не займають місця для стеків і тому є хорошим вибором.

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


1

Можливо, те, що хотів твій бос, - це ти використовувати шаблон Singleton. Це дуже хороша практика, коли вам потрібно отримати доступ до певного об'єкта з декількох примірників.

Ось посилання на пояснення wikipedias


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