2010-10-04 7 views
2

Другой вопрос новичков; Считается ли плохой вкус использовать множество глобальных переменных в C? Я предполагаю, что ответ, вероятно, да, с другой стороны, с использованием основной или какой-либо другой функции в качестве «базовой функции» для хранения указателей/значений с глобальной областью создает целый беспорядок с указателями на указатели и т. Д. Any мысли?Глобальные переменные в C

+3

Вы должны принять ответы. Я вижу, вы не сделали этого для своего предыдущего вопроса. Если вы найдете ответ, который работает, вы должны его принять. – 2010-10-04 02:32:04

ответ

3

Одна проблема с глобальными переменными заключается в том, что везде, где они используются, у вас может не быть referential transparency. И хорошо знать, что при определенном вводе функция будет выдавать определенный результат по нескольким причинам.

This page is a good resource по ряду других причин, почему глобальные переменные тоже плохие.

0

Хотя C дает вам полную свободу декларировать все глобальное, это поможет вам в кодировании и обслуживании, если вы считаете, что это «abstract data type», который также может быть реализован на процедурных языках.

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

1

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

2

Обычно большинство программистов ожидают, что функции будут pure, что означает, что выход функции будет полностью определен его входом. Предоставляя им состояния, вы можете ввести много путаницы для других, которые будут использовать ваш код. Это относится к переменным static, объявленным в функциях.

И для реальных глобальных переменных (объявленных вне функций) это то, что сказал Рюэль. Будьте осторожны, хотя и многопоточность.

+0

+1 То же самое относится к переменным-членам класса. –

1

Устранение ситуации, вызванной ярким беспорядком глобалов, похоже на нормализацию схемы реляционной базы данных.

Всегда есть возможность скомпоновать все глобалы в одну большую структуру и передать эту структуру вокруг. Но тогда, в чем смысл?

Вы хотите сгруппировать их в структуры, а затем начать поиск: «Эй, мне нужна эта информация в другой структуре, потому что нужна одна глупая функция». Тогда вы решили, что решили проблему, объединив две структуры. Затем вы обнаружили, что, наконец, вы все еще придерживаетесь большой части структуры.

Почему? Так как нормализация базы данных, ваша нормализация структуры должна выполняться согласованно, в заговоре с процессами (иначе говоря, вашими функциями). Вы должны построить отношения сущности о своей информации. Несмотря на то, что вы не используете язык oop, вы все равно должны использовать методы системного анализа, граничащие с oop. Разница между программистом-аналитиком и простым ванильным программистом заключается в том, что программист-аналитик выполняет строгий анализ данных и процессов проекта. В то время как простой ванильный программист делает счастливое программирование.

Например, я хотел бы написать рутину для управления принтерами в компании. Есть

  • старых ленты отдача телетайпы (святая корова!),
  • Матричные (они до сих пор используют те?),
  • цветовые струи,
  • серые форсунки,
  • серые-лазеры и,
  • цветные лазеры
  • факс/комбо сканирования струй и лазеров.

И это функциональность

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

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

Или вы можете упростить свою жизнь и изучить простые приемы нормализации сущности. Помните, что сущность - это не только данные, но и процесс/функции. В конце такого упражнения вы удивитесь, как бы вы дожили до сих пор в жизни без такого языка, как C++.

Приведем пример с упрощенной (возможно, неполной) реализацией. Когда вы планируете свой проект в ER и документируете его, это упрощает программирование и улучшение. В этот век гибкой инженерии вы должны иметь возможность выпускать частичную реализацию проекта. например, вы бы сказать своему менеджеру проекта следующие этапы

  • Week1: Используется маршрутизация принтеров для струйных и лазерных принтеров
  • Week2: Используется маршрутизация принтеров для принтеров архаических воздействия
  • week3: Используемые задания сканирования
  • week5-7: Используемые задания факса
  • week8: Полувыпеченная работа переразводка
  • week9: 90% запеченной работы
  • перенаправление
  • week9- 11: полупеченое техническое обслуживание

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

Затем, если вы не пишете встроенный или код ядра, вы очень скоро перейдете на C++, гарантированный.

struct Printer{ 
    id, 
    printType, 
    location, 
    *maintenance, 
    *driver 
} 

struct Job{ 
    type, 
    requestor, 
    location 
} 

struct Location{ 
    building, 
    floor, 
    suite, 
    lane 
} 

struct PrintType{ 
    ink, 
    colour 
} 

struct JobStatus{ 
    job, 
    location, 
    endStatus 
} 

struct Maintenance{ 
    inkLevel, 
    schedule 
} 

union InkLevel{ 
    HPDeskJetInk, 
    HPLaserJetInk, 
    OlivettiFabric, 
    BrotherCellophane, 
    etc, etc 
} 

enum Ink{ 
    FABRICImpact, 
    CELLOPHANEImpact, 
    INKJet, 
    LASER 
} 

enum Colour{ 
    GREY, 
    COLOUR 
} 

enum EndStatus{ 
    PRINTING, 
    COMPLETED, 
    FAILED, 
    REROUTED 
} 

/* print will look at Job to determine the appropriate location */ 
JobStatus* print(job); 

/* a callback to requestor indicating completion status */ 
JobStatus* printCallback(); 

/* a fax send event detected and fax function will find the appropriate server for the Job */ 
JobStatus* fax(job); 

/* a photocopy to file job */ 
JobStatus* scan(job); 

Maintenance* maintain(Printer); 
-6

Плохо использовать любые глобальные переменные на любом языке.

+1

omg lawlz !!!!!! –

+0

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

Смежные вопросы