<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>web-dev.info &#187; Перевод</title>
	<atom:link href="http://web-dev.info/category/perevod/feed/" rel="self" type="application/rss+xml" />
	<link>http://web-dev.info</link>
	<description>Информация о web-разработке для web-разработчиков.</description>
	<lastBuildDate>Tue, 02 Sep 2008 19:55:08 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Использование пространств имен для организации JavaScript-кода</title>
		<link>http://web-dev.info/2008/06/javascript-namespaces/</link>
		<comments>http://web-dev.info/2008/06/javascript-namespaces/#comments</comments>
		<pubDate>Tue, 03 Jun 2008 14:59:37 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Перевод]]></category>
		<category><![CDATA[namespace]]></category>

		<guid isPermaLink="false">http://web-dev.info/2008/06/javascript-namespaces/</guid>
		<description><![CDATA[На текущий момент большинство web-приложений состоят из большого числа библиотек, виджетов и сниппетов из многих и многих источников. Следует помнить, что код других разработчиков может взаимодействовать с вашим кодом в случае, если происходит подключение обоих их на одной странице. А если вы оперируете глобальными переменными, то это и вовсе небезопасно.
Почему необходимо использовать пространства имен?
Возьмем, в [...]]]></description>
			<content:encoded><![CDATA[<p>На текущий момент большинство web-приложений состоят из большого числа библиотек, виджетов и сниппетов из многих и многих источников. Следует помнить, что код других разработчиков может взаимодействовать с вашим кодом в случае, если происходит подключение обоих их на одной странице. А если вы оперируете глобальными переменными, то это и вовсе небезопасно.</p>
<h3 class="floatBar">Почему необходимо использовать пространства имен?</h3>
<p>Возьмем, в качестве примера, форум Ext JS, который использует три совершенно различных набора скриптов, созданных разными производителями: Ext JS используется нами для расширения функционала, Google Analytics для отслеживания использования сайта плюс обычные скрипты форума vBulletin. На рисунке представлено каким образом весь этот код из различных источников включается в тело страницы. Вообразите себе количество возможных противоречий с еще большим ростом подключаемых файлов.</p>
<p class="image"><img src="http://web-dev.info/wp-content/uploads/2008/06/diffsources.png" alt="Включаемые файлы" /></p>
<p>Если взглянуть на закладку DOM отладчика Firebug, можно увидеть сотни переменных контекста window, созданных подключенными скриптами. В тоже самое время Ext JS объединяет все свои классы в едином пространстве имен Ext и далее организует их в виде отдельных пакетов.</p>
<p class="image"><img src="http://web-dev.info/wp-content/uploads/2008/06/domwindow.png" alt="Обзор DOM" /></p>
<p>Когда вы пишете собственный срипт, вам следует помещать все свои классы и синглтоны (singletone) в некие пространства имен чтобы предотвратить противоречия с кодом других разработчиков. Термин «пространство имен» определяется в Википедии (<a href="http://en.wikipedia.org/wiki/Namespace">EN</a>, <a href="http://ru.wikipedia.org/wiki/Namespace">RU</a>) следующим образом: «… абстрактный контейнер предоставляющий контекст для содержащихся в нем элементов (имена, термины или слова) и позволяющий предотвратить возникновение неоднозначностей в случае существования элементов с одинаковыми именами…».</p>
<p>Пространства имен это важный инструмент разработчика, гарантирующий невозможность перезаписи одного кода другим. Ведь если иной разработчик определит переменную с таким же, как у вас именем, то существовавшее до этого определение будет перезаписано. Последний подключенный, в таком случае, фрагмент кода будет всегда одерживать верх.</p>
<p>Так как JavaScript является языком с функциональными областями видимости<sup>*</sup>, то создание функции или/и переменной не «обернутых» в функцию приводит к появлению их в глобальной области видимости (в контексте window). Чтобы предотвратить это разработчики помещают свои классы в объекты.</p>
<h6><sup>*</sup> примечание переводчика:</h6>
<p class="notice">вероятно, автор имеет ввиду создание различных областей видимости, что достижимо в этом языке лишь с помощью функций (прим. пер.)</p>
<h3 class="floatBar">Пространства имен без Ext JS</h3>
<p>Без Ext JS вы можете создать пространство имен следующим образом:</p>
<pre name="code" class="js">
if (!App) App = {};
if (!App.form) App.form = {};
if (!App.data) App.data = {};</pre>
<h3 class="floatBar">Ext.namespace</h3>
<p>Объект Ext предоставляет метод <a href="http://extjs.com/deploy/dev/docs/?class=Ext&amp;member=namespace">Ext.namespace</a> (или его шоткат Ext.ns), который проверяет создаваемое пространство имен на существование и создает его, если такового еще нет. Сначала следует определить первоначальный уровень пространства, а затем можно создавать различные подуровни-пакеты. Например, создадим пространство имен <em>App</em> и входящие в него пакеты <em>form</em> и <em>data</em>:</p>
<pre name="code" class="js">
/* Ext.namespace создаст объекты с переданными именами, если они еще не существуют */
Ext.namespace('App', 'App.form', 'App.data');

/* Теперь можно определять новый класс, например SampleForm, внутри пакета App.form */
App.form.SampleForm = Ext.extend(Ext.form.FormPanel, {
    initComponent: function() {
        /* код настройки компонента */
       App.form.SampleForm.superclass.call(this);
   }
});
/* Определение MySingleton внутри пакета App.data */
App.data.MySingleton = function() {
    return {
        sampleStaticMethod: Ext.emptyFn
    };
}();</pre>
<h3 class="floatBar">В завершение</h3>
<p>Используемый в web-приложениях на стороне клиента код JavaScript становится все более сложным и сложным. Поэтому важность правильной организация совместной работы вашего кода и кода третьих сторон также вырастает. Использование пространств имен гарантирует защиту вашему коду от перезаписи другим, находящимся в глобальной области видимости, кодом.</p>
<h3>От переводчика</h3>
<p>Автор оригинала: Aaron Conran</p>
<p>Оригинал статьи: <a href="http://extjs.com/blog/2008/05/28/use-namespaces/">Use Namespaces to organize your JavaScript code</a></p>
]]></content:encoded>
			<wfw:commentRss>http://web-dev.info/2008/06/javascript-namespaces/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
