Що робили програмісти перед змінною сферою, де все глобально?


40

Отже, мені доводиться мати справу з начебто мовою серця (так званою PowerOn), де я маю основний метод, кілька типів даних для визначення змінних і має можливість мати підпроцедури (по суті недійсні методи), які не повертають тип не приймає жодних суперечок. Проблема тут полягає в тому, що ВСЕ є глобальним. Я читав про такі типи мов, але більшість книг займає такий вигляд: "Добре, ми використовуємо коня та карету, але тепер, ось машина, тому давайте навчимося працювати над ТОМУ!" Ми НІКОЛИ не переживемо тих днів " . Я мушу визнати, розум намагається мислити поза межами та обсягом .

Ну ось я. Я намагаюся розібратися, як найкраще керувати нічим, крім глобальних змінних, у кількох відкритих методах. Так, навіть ітератори forциклів повинні бути визначені глобально, що я вважаю, що я переробляю в різних частинах свого коду.

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


71
Вони багато молилися.
Роберт Харві

15
Я можу уявити собі безліч божевільних імен змінних, які орієнтувались на область застосування bob_dog_fur_colourтощо - щоб спробувати зменшити ймовірність потрапляння на ті самі імена.
Латті

12
Вони писали програми, що мали менший обсяг, і вони мають багато помилок.
Чарльз Е. Грант

12
@Lattyware, насправді ще в старші дні ви були дуже обмежені в тому, наскільки описово ви можете зробити свої імена змінних. Деякі мови дозволяли використовувати лише 1 або 2 символи змінних символів, інші дозволяли вам аж 8. Це смоктало, але ми тоді не знали, скільки це смоктало. Це дозволило компілятору стиснути в обмеженому обсязі пам'яті.
Чарльз Е. Грант

17
вони винайшли кращі мови програмування ...
Вім

Відповіді:


44

Вам знадобляться якісь розумові прийоми з ведення бухгалтерського обліку (називання конвенцій тощо) для того, щоб це було прямо. Також документ, документ, документ. Оскільки всі змінні є глобальними, майте єдиний документ із усіма переліченими, якщо можете.

Постарайтеся мати невелику кількість змінних, які ви завжди використовуєте для тимчасових країн, і пам’ятайте, що вони є тимчасовими. Постійно використовуючи ті самі, ви ввійдете в звичку слідкувати за тим, де вони дійсні чи ні.

Крім того, ви хочете переглянути документацію та переконатися, що ви знаєте, наскільки довгими можуть бути імена змінних та скільки символів насправді унікальні. Я знаю НІЧЕ про PowerOn, але якщо це досить архаїчно, щоб мати лише глобальний обсяг, то можливо, що він має обмежену довжину унікальності для ідентифікаторів.

Я вже бачив речі з довгими ідентифікаторами, але ідентифікатори яких були унікальними лише у перших 8 символах. Таким чином, ви можете мати RonnyRayGun та RonnyRayBlaster, і вони насправді є однаковою змінною. У таких випадках я рекомендую тримати імена змінних під "унікальним" обмеженням, щоб менше шансів випадково зіткнутися.


4
+1: Під час написання збірки я зазвичай стикаюся з деякими тими ж проблемами в тому, що якщо я називаю регістри, імена є глобальними (я стикаюся з додатковою проблемою, що навіть якщо я створюю більше імен, я не отримую більше регістрів, але це тут не стосується). Наявність декількох регістрів, присвячених тимчасовим значенням, справді допомагає зменшити кількість створених змінних, що полегшує збереження всього в голові. Документування, які змінні використовуватиме кожна функція (найважливіше те, що вона буде модифікована), допомагає отримати глобальну картину правильно.
Лев

53

Словник даних.

У центральному сховищі (як правило, офіс провідного програміста) було в'яжуче полотно, яке містило по одній сторінці для кожної глобальної змінної. Сторінка дала назву, її визначення, її призначення та які підпрограми встановлювала або використовувала.

Ранні вбудовані системи з мікроскопічною оперативною пам’яттю мали подібну проблему та подібне рішення. Провідний програміст підтримував головну карту оперативної пам’яті до окремих байтів, показуючи, яку оперативну пам’ять використовували, які модулі для яких цілей. Програмісти, які потребували виділення оперативної пам’яті, перейшли до головного програміста, який, обговоривши це питання, зробив відповідний запис у зошит і дав хлопцеві свою оперативну пам’ять. (Ви не хотіли бути у взутті програміста, який взяв байт оперативної пам’яті, не очистивши його від головного програміста. Повірте мені це.)

Ця проблема також з’явилася, коли програмістам довелося будувати великі системи в ранніх версіях BASIC. Це виявилося особисто для мене при використанні дуже примітивного менеджера "баз даних" під назвою "Інформація" (продукт компанії Henco, Inc., штат Нью-Джерсі - НАДІЙНІШЕ вже давно!). Обидві ці мови мали дуже обмежену лексику змінної назви.


Я в дуже схожій ситуації, оскільки він більше "менеджер баз даних", де мова безпосередньо взаємодіє з базою даних, поряд з деякими програмами, такими як функціональність. Це дуже корисно
Чад Гаррісон

1
Це нагадує мені ще назад, коли я вивчав ОСНОВНІ і змінні не могли мати імена довше двох символів, і відслідковувати їх у значній програмі ...
Кевін Рубін

@KevinRubin, не нагадуй мені. Ну, відчуваю біль, як казав Білл Клінтон ...
Джон Р. Стром

8

Зростання мов програмування з блоком дії збіглося з появою більш швидких, великих машин, і це не випадково. На ранніх комп'ютерах оперативна пам'ять вимірювалася в МБ, кБ або навіть у байтах; просто не було можливості навіть мати стільки змінних, які б їх плутали, коли програма набула великого розміру, оскільки програми ніколи не мали такого великого розміру . Досягнення мов програмування зазвичай досягалися тоді, коли люди визнавали, що їхні старі навички програмування не зростали, коли арена стала значно більшою; Блок блоку був винайдений як механізм захисту програмістів проти їх обмеженої пам'яті.

Обчислювальна техніка була також набагато більш рідкісною та екзотичною діяльністю, коли комп’ютери були фантастично дорогими, і цілком можливо, що лише спеціально схильні до математики та геніальність люди в першу чергу стали програмістами (хоча такі порівняння не доцільно перевіряти і, безумовно, політично запалюють). У перші дні програмне забезпечення зазвичай постачалося безкоштовно з комп'ютером, щоб переконати людей купувати його в першу чергу; думка, що інституційні користувачі навіть намагатимуться писати власні програми, спочатку була невідома.


Як далеко назад ти говориш? Я особисто бачив пару міні-комп’ютерів з початку 80-х, які мали "пул даних" (тобто глобальний список змінних), що містив понад 60 тис. Міток.
Еван Плейс

-1: У перші дні ви не тільки сплачували щомісячну оренду, щоб мати доступ до комп'ютера, ви сплачували за цикли процесора та пам'ять, яку використовує програма. Програмне забезпечення було далеко не безкоштовним, а програмне забезпечення ще менше.
mattnz

1
@mattnz: Ще деякий час тому програмне забезпечення часто постачалося в комплекті, що дещо відрізняється від безкоштовного. Як правило, підприємство, яке потребувало комп’ютера, купувало або орендувало його, а не платило за роботу машини, хоча за це користувачі часто платять. Я також здивований твердженням ОП, що від людей не очікували писати власне програмне забезпечення, оскільки це, безумовно, не було моїм досвідом. Якщо ви могли дозволити собі комп’ютер, ви могли дозволити собі персонал з розробки, а насправді не було багато програмного забезпечення, що консервується.
Девід Торнлі

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

4

Мій боже, це багато років тому (бурхливі спогади :)).

Я не знаю мови, якою ви говорите, але загалом ми адаптувались до того, що ми мали. Це насправді не було величезним питанням. Вам потрібно було більше уваги приділяти іменам var, які часто містили (у короткій формі, в ті дні кількість байтів було дорогоцінним) посилання на підрозділ або функцію, наприклад, mIORead1якщо у вас був обробник для читання даних з файлу 1 або у вас були різні лічильники vars, такі як я, j, k і т. д., які за власною системою ви знали, для чого вони були, якщо їх можна повторно використовувати тощо. Це було більш хардкор (тоді не було ні шоломів, ні рукавичок) :-)


3

Це досить схоже на програмування PLC, хоча сучасні PLC тепер дозволяють вам мати "теги" (ака-змінні), локальні для програми. Тим не менш, багато людей просто програмують, використовуючи всі глобальні теги.

Я виявив, що якщо ви збираєтеся це робити, вам потрібно використовувати структуровану конвенцію про іменування. Наприклад: Motor1_DriveContactor_Run. Якщо ваш язик відбувається зі структурами підтримки (іноді відомі як визначені користувачем типи) , то ви можете також використовувати їх для створення ієрархії структурованих даних, таких як: Motor[1].DriveContactor.Run.

Це тримає все організовано, і, як правило, інтелігенція є достатньо гідною, щоб допомогти вам.


2

Я насправді навчився програмувати мовою Authorware, де все було глобальним. На щастя, у нього були масиви і після певного моменту щось називалося списками, які були схожі на загальні об’єкти.

Програма Authorware насправді мала фізичну структуру (Authorware базувалася на метафорі діаграми), а її мова сценаріїв базувалася на старому стилі Pascal. Що ми зробили, це пов’язати фізичну структуру з індексами в масиві, і часто індекси масиву містили б списки, які ми би розглядали як локальний об'єкт для фізичної частини, яку ми використовували.

Програмне забезпечення було розроблено для eLearning, тому однією з ікон ми були Сторінка. Сторінки будуть додані до Рамки. Отже, для сторінки 1 ми заглянемо в якийсь масив в індексі 1 (авторське програмне забезпечення було індексовано 1) і витягнемо дані для цієї сторінки, в якій буде зберігатися список, який буде виконувати роль псевдооб'єкта. Тоді Сторінка матиме логіку, яка виводить "властивості" об'єкта на ім'я. Якщо у вас немає нічого подібного до «Об’єктів», але у вас є масиви, ви можете просто домовитися про те, які дані куди йдуть.

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

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


Я також працював з Macromedia Authorware, @ amy-blankenship. Я не пам'ятаю, в якій версії це було, коли я востаннє працював з ним, можливо, 3. Чи його замінили Flash / Showckwave чи він все ще існує?
Tulains Córdova

Це були різні речі. Macromedia викликала багато плутанини у версії 5 (обох), називаючи все Shockwave, включаючи директора, під час упаковки для Інтернету. Adobe заборонила Adobe після придбання, Flash все одно продовжує працювати.
Емі Бланкенсіп

1

Коли я був в університеті, нас детально вчили про "Глобальну змінну проблему" - сукупність помилок та проблем з підтримкою коду, викликаних безліччю глобальних змінних.

Деякі змінні небезпечніші за інші.

Безпечний : Змінні, які не впливають на потоковий контроль, наприклад LastName

Небезпечно : будь-яка змінна, яка впливає на потік управління програмою, наприклад, DeliveryStatus

Найнебезпечніший перший:

  • Статус з'єднання (режим та підрежим)
  • Значення сполук (загальне, загальне)
  • Одномісний статус (режим)
  • Одиничні значення (кількість)

Щоб уникнути "глобальної проблеми змінної", вам потрібно

  • Документуйте кожну змінну та функцію.
  • Зберігайте пов'язані змінні близько (разом із кодом, який їх використовує) у тому ж розділі вихідного коду.
  • Сховати «небезпечні» змінні, щоб інші програмісти не знали про їх існування. Уникайте їх використання безпосередньо, особливо в інших розділах коду.
  • Надайте функції, які читають / записують небезпечні змінні (тому іншим програмістам не потрібно).

Щоб структурувати свій код , коли жодна структура не доступна мовою, використовуйте коментарі та умови іменування:

/* --------------------------- Program mode ------------------------ */

var Mode_Standard = 1;      // Normal operation (SubMode unused)
var Mode_Backup   = 2;      // Backup mode      (SubMode is backup device)

var BackupMode_Disk = 1;    // SubMode: Backup to disk
var BackupMode_Tape = 2;    // SubMode: Backup to tape

var MainMode = Mode_Standard;
var SubMode = 0;

function Mode_SetBackup(backupMode)
{
    MainMode = Mode_Backup;
    SubMode = backupMode;
}

function Mode_SetStandardMode()
{
    MainMode = Mode_Standard;
    SubMode  = 0;
}

function Mode_GetBackupMode()
{
    if (MainMode != Mode_Backup)
        return 0;

    return SubMode;
}

/* --------------------------- Stock Control ------------------------ */

var Stock_Total =  123;      // Total stock       (including RingFenced)
var Stock_RingFenced = 22;   // Ring-fenced stock (always less than total)

// Adds further ring-fenced stock 
function Stock_AddRingFenced(quantity)
{
    Stock_Total      += quantity;
    Stock_RingFenced += quantity;
}

/* ------------------------- Customers ----------------------- */

var Customer_FirstName = "Tony";
var Customer_LastName  = "Stark";

0

Не знаю, як вони зробили.

Але я думаю, що сучасні мови OOP мали дуже схожу проблему щодо зіткнення імен .

Рішення полягає у прийнятті простору імен . Це абстрактне поняття, але широко прийняте декількома реалізаціями (пакети Java, простір імен .NET, модулі Python).

Якщо мова, якою ви користуєтесь, має не надто вузьке обмеження щодо довжини імен, тоді ви можете застосувати простір імен до хорошої іменної змінної.

Отже, назва змінної також представляє область змінної.

Спробуйте визначити шаблон іменування , як це: order_detail_product_code, order_detail_product_unit_price. Або для тимчасових лічильників або свопів: tmp_i, tmp_swap.


0

У мовах усі змінні були глобальними (я використав пару), ми використовували конвенцію про іменування змінної. Наприклад: якщо я насправді хотів використовувати змінну як глобальну, я можу використовувати префікс "m_" або "_". Звичайно, це все ще покладається на розробників, щоб мати цю дисципліну

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