/ / Защо не се използват глобални променливи (долар-знак $)? - рубин на релси, рубин, рубин на релси-3

Защо не се използват глобални променливи (знак за долар)? - рубини на релси, рубин, рубин на релси-3

Аз сега хакам около Rails вече година и половина и доста ми харесва! :)

В релсите използваме много от локални променливи, например променливи (например @user_name) и константи, дефинирани в инициализаторите (като FILES_UPLOAD_PATH). Но защо никой не използва глобални "доларизирани" променливи ($) като $dynamic_cluster_name?

Дали заради недостатък в дизайна? Свързано ли е с изпълнението? Слабост на сигурността?

Отговори:

40 за отговор № 1

Дали поради проблем с дизайна?

Дизайн... недостатък? Това е дизайнерска благословия, благодат в дизайна, заслуги за дизайн, всичко освен недостатък! Глобални променливи са лошии те са особено лошо в уеб приложенията.

Смисълът да се използват глобални променливи е запазването и промяната на „глобална държава". Работи добре в прости скриптове с една нишка (не, не е добре, работи ужасен, но все пак работи), но в уеб приложенията простоне. Повечето уеб приложения изпълняват едновременни пакети: т.е. няколко екземпляра на сървъра, които отговарят на заявки чрез общ прокси и балансиращ натоварване. Ако промените глобална променлива, тя се променя само в един на екземплярите на сървъра. По същество, променлива за знаци за долар вече не е глобална когато пишете уеб приложение с релси.

Глобалната константа обаче все още работи, защото те са константи, те не се променят, и да има няколко екземпляра от тях на различни сървъри е ОК, защото там винаги ще са равни.

За съхраняване на непостоянен глобална държава, трябва да наемеш повечесложни инструменти, като например бази данни (SQL и noSQL; ActiveRecord е много приятен начин за достъп до DB, използвайте го!), кеширане на резервни копия (запаметени), дори обикновени файлове (в редки случаи те са "полезни"! Но глобалните променливи просто не работи.


5 за отговор № 2

Глобалните променливи често са признак за лош дизайн и могат да бъдат източник на грешки поради проблеми с едновременността. Глобалните константи наистина нямат тези проблеми.

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


1 за отговор № 3

Веднъж ги използвах, за да поддържам FTP връзките живичрез AJAX призовава за уеб базиран FTP клиент. Това позволи на потребителя многократно да взаимодейства със своя FTP сайт, без да се налага да се свързва отново всеки път за всяко извършено действие.

Така че едно хубаво предимство на глобалите в Ruby е, че можете спокойно да съхранявате обекти от тип ресурс в тях.


0 за отговор № 4

Явната липса на глобална употреба е показателна недостатъка на концепцията за глобална променлива, а не на тяхното прилагане на рубина. Всъщност дори не знаех, че рубин има синтаксис на $ глоба. Те не са необходими и затова никога не съм ги търсил. Добрият рубинов код никога не се нуждае от тях.