Гаразд, це справді дещо питання захисника чортів.
Коли глобальні змінні нормальні, і якщо ніколи, що б ви використовували як альтернативу?
Цікавий бік цього питання, чим суспільне поле статичного класу відрізняється від глобального?
Гаразд, це справді дещо питання захисника чортів.
Коли глобальні змінні нормальні, і якщо ніколи, що б ви використовували як альтернативу?
Цікавий бік цього питання, чим суспільне поле статичного класу відрізняється від глобального?
Відповіді:
Наскільки я знаю, публічне статичне поле в основному є глобальним, враховуючи, що його можна викликати з будь-якого місця, за винятком того, що воно не засмічує простір імен.
Єдиний раз, коли я особисто використовую «глобальні» змінні у своєму коді, є у вигляді публічних статичних полів, незмінних. У цьому випадку не потрібно турбуватися про те, що значення накручується іншими частинами програми, і, звичайно, це набагато приємніше, ніж мати десяток змінних з однаковими постійними значеннями в кожному класі.
Особисто я використовую глобалі для конфігурації виконання - якщо властивість конфігурації завантажується під час запуску програми і змінюється нечасто (і лише потім з одного місця), це жахливо і схильне до помилок передавати її навколо кожного методу, який може знадобитися використовувати це в якийсь момент. Краще використовувати щось, що може бути введено в сферу застосування з будь-якого місця, де потрібно його використовувати, оскільки це не захаращує та не затьмарює ваші підписи методів та сайти для викликів.
CONFIG_
або CFG_
префіксом.
Виключаючи системи в реальному часі / вбудовані системи, вам слід використовувати лише глобальні точки для постійних значень. Якщо ви відчуваєте, що не можете вирішити свою проблему без них, напевно, ви робите щось не так.
Крім того, погляньте на схему Singleton , холодне забезпечення кращого рішення для глобальних мереж у тих ситуаціях, коли вам потрібно щось мати глобальну точку доступу.
TIMES_TO_ITERATE_THROUGH_THIS_PARTICULAR_LOOP
доречна лише в одному файлі / класі / розділі, де відображається "цей певний цикл".
Проблема глобальних змінних полягає в тому, що вам потрібно знати про них скрізь у своєму коді. Однак після того, як ви вирішили, що вам потрібно знати про певний глобальний, в його значній мірі втрачається мало. Тому, на мою думку, у вас має бути дуже мало глобальних змінних, але декілька, які у вас є, вам слід отримати максимальний пробіг.
Ще один приклад того, що я відчуваю таким чином, подивіться на використання міксинів у Ruby.
Вся справа в просторах імен.
Уявіть на мить, що всі в світі мали одне і те ж прізвище. Який безлад.
(В Індії у сикхів все те ж прізвище: Сінгх - Поглянь)
Коротка версія: коли це полегшує міркування про програму. Зазвичай випадки - це якийсь тип глобального стану або статичний ресурс, який широко використовується.
Довга версія: Том Хоутін сказав: "з моторошними діями на відстані" ... саме в цьому проблема глобалів - ви повинні знати, де це використовується і як, або ви можете отримати справді дивне і важке для відстеження клопи. Місцеві жителі - це ні що інше, як стратегія зменшення обсягу того, що потрібно зрозуміти програмісту, щоб розмірковувати про програму.
Інша сторона проблеми з тим, щоб знати, де вони використовуються, полягає в тому, що ви можете отримати дублікати глобальних мереж - у цьому випадку речі можуть стати справді дивними, оскільки більшість програм отримує і встановлює var1, а в двох місцях var2 використовується для утримання та сама інформація. Особливо, коли над одним і тим же кодом працює кілька людей. IDE можуть бути корисними для пошуку використання, зменшуючи вартість глобальних компаній, але вони нічого не роблять для дублікатів.
Чим більше глобалів, тим важче вам слідкувати за тим, що з ними відбувається. Їх повинно бути мало і далеко між ними.
Два ґетчі з глобальними та одинарними - це перевірка та розгорнутість.
Для тестування я бачив занадто багато надмірно складних джгутів для тестування, щоб боротися з погано запланованими глобальними та одиночними життями. Переконайтеся, що в будь-якому такому об’єкті є чіткі та прості правила запуску та руйнування.
Що стосується розгортання, то слід розглянути два випадки. По-перше, як буде жити ваш глобальний об’єкт? Чи є в статичній чи динамічній бібліотеці? Якщо цей глобальний об’єкт буде повторно використаний для плагіна, ви отримаєте додаткові копії? По-друге, що відбувається, коли цей глобальний об'єкт потрапляє в паралельну програму? Це безпечно для ниток?
В цілому, я вважаю, що ці причини означають, що глобали та одинаки використовуються лише винятково.
У жахливій базі коду VB6, яка зловживає глобалами, як ні завтра, я винен у введенні нового:
Global CsExt As New TheAppBeingRewrittenInCSharpWhileVb6CodeIsStillBeingMaintained
Я думаю, що це один з небагатьох дійсних випадків використання глобального об’єкта.