Paketler ve ad alanları

Paketler ve ad alanları ilişkili kavramlardır. Paketler, kod paylaşımını kolaylaştıracak ve adlandırma çakışmalarını en düşük düzeye indirecek şekilde sınıf tanımlarını bir arada paketlemenize olanak sağlar. Ad alanları, özellik ve yöntem adları gibi tanımlayıcıların görünürlüğünü denetlemenize olanak sağlar ve bir paketin içinde veya dışında da kalsa, koda uygulanabilir. Paketler, sınıf dosyalarınızı organize etmenize olanak sağlarken, ad alanları, tek tek özelliklerin ve yöntemlerin görünürlüğünü yönetmenizi sağlar.

Paketler

ActionScript 3.0'daki paketler, ad alanları ile uygulanır ancak bunlarla eşanlamlı değildir. Bir paket bildirdiğinizde, derleme zamanında bilinmesi garantilenen özel bir ad alanı türünü açıkça oluşturursunuz. Ad alanları açıkça oluşturulduğunda derleme zamanında mutlaka bilinmek zorunda değildir.

Aşağıdaki örnek, tek bir sınıf içeren basit bir paket oluşturmak için package direktifini kullanır:

package samples 
{ 
    public class SampleCode 
    { 
        public var sampleGreeting:String; 
        public function sampleFunction() 
        { 
            trace(sampleGreeting + " from sampleFunction()"); 
        } 
    } 
}

Bu örnekteki sınıfın adı SampleCode'dur. Sınıf örnekler paketinin içinde olduğu için, derleyici otomatik olarak sınıf adını derleme zamanında tam nitelenmiş adına sınıflandırır: samples.SampleCode. Derleyici ayrıca herhangi bir özelliğin veya yönteminde adını sınıflandırır, böylece sampleGreeting ve sampleFunction() sırasıyla samples.SampleCode.sampleGreeting ve samples.SampleCode.sampleFunction() olur.

Geliştiricilerin çoğu, özellikle de Java programlama arka planına sahip olanlar, bir paketin üst düzeyine yalnızca sınıfları yerleştirmeyi seçebilir. Ancak ActionScript 3.0, bir paketin üst düzeyinde yalnızca sınıfları değil, değişkenleri, işlevleri ve deyimleri de destekler. Bu özelliğin gelişmiş bir kullanımı, bir paketin üst düzeyinde bir ad alanını, paketteki tüm sınıflar için kullanılabilir olacak şekilde tanımlamaktır. Ancak bir paketin üst düzeyinde public ve internal olmak üzere iki erişim belirticisine de izin verildiğini unutmayın. Yuvalanmış sınıfları özel olarak bildirmenize olanak sağlayan Java'dan farklı olarak ActionScript 3.0, yuvalanmış veya özel sınıfları desteklemez.

Ancak ActionScript 3.0 paketleri, diğer birçok yönden Java programlama dilindeki paketlere benzer. Bir önceki örnekte gördüğünüz gibi, tam tanımlı paket başvuruları Java'da olduğu gibi, nokta operatörünü ( . ) kullanarak ifade edilir. Kodunuzu diğer programcıların da kullanması için sezgisel bir hiyerarşik yapıda organize etmek üzere paketleri kullanabilirsiniz. Bu, kod paylaşımını kolaylaştırır ve böylece kendi paketinizi oluşturup başkalarıyla paylaşmanıza ve başkaları tarafından oluşturulan paketleri kodunuzda kullanmanıza olanak sağlar.

Ayrıca, paketlerin kullanılması, kullandığınız tanımlayıcı adlarının benzersiz olmasının ve diğer tanımlayıcı adlarıyla çakışmamasının sağlanmasına yardımcı olur. Aslında bazılarına göre, paketlerin birincil avantajı budur. Örneğin, kodlarını birbiriyle paylaşmak isteyen iki programcı, SampleCode adında bir sınıf oluşturabilir. Paketler olmadan bu bir ad çakışması oluşturur ve bunun tek çözümü sınıflardan birinin yeniden adlandırılmasıdır. Ancak paketler sayesinde, paketlerdeki sınıflardan biri veya tercihen ikisi benzersiz adlarla yerleştirilerek ad çakışması kolayca önlenir.

Yuvalanmış paketler oluşturmak için paket adınıza gömülü noktalar da dahil edebilirsiniz. Bu, paketlerin hiyerarşik organizasyonunu oluşturmanıza olanak sağlar. Buna iyi bir örnek, ActionScript 3.0 tarafından sağlanan flash.display paketidir. flash.display paketi, flash paketinin içinde yuvalanmıştır.

ActionScript 3.0'ın çoğu, flash paketi altında organize edilir. Örneğin, flash.display paketi, görüntüleme listesi API'sini içerirken, flash.events paketi de yeni olay modelini içerir.

Paketler oluşturma

ActionScript 3.0, paketlerinizi, sınıflarınızı ve kaynak dosyalarınızı organize etme şeklinizde önemli ölçüde esneklik sağlar. Önceki ActionScript sürümleri, her kaynak dosyası için yalnızca bir sınıfa izin verirdi ve kaynak dosyasının adının, sınıfın adıyla eşleşmesini gerektirirdi. ActionScript 3.0, tek bir kaynak dosyasına birden çok sınıf dahil etmenize olanak sağlar ancak her dosyadaki yalnızca bir sınıf o dosyaya harici olan kod için kullanılabilir duruma getirilebilir. Başka bir deyişle, her dosyadaki yalnızca bir sınıf, paket bildiriminde bildirilebilir. Ek sınıfları paket tanımınızın dışında bildirmeniz gerekir ve böylece bu sınıflar, o kaynak dosyasının dışındaki kod için görünmez olur. Paket tanımının içinde bildirilen sınıfın adı, kaynak dosyasının adıyla eşleşmelidir.

ActionScript 3.0, ayrıca paketleri bildirme şeklinizde de daha fazla esneklik sağlar. Önceki ActionScript sürümlerinde, paketler yalnızca kaynak dosyalarını yerleştirdiğiniz dizinleri temsil ederdi ve siz package deyimiyle paketleri bildirmez, bunun yerine sınıf bildiriminize tam nitelendirilmiş sınıf adının parçası olarak paket adını dahil ederdiniz. Paketler halen ActionScript 3.0'da dizinleri temsil etmeye devam etse de, yalnızca sınıfları değil, daha fazlasını da içerebilir. ActionScript 3.0'da, bir paketi bildirmek için package deyimini kullanırsınız, başka bir deyişle, bir paketin üst düzeyinde değişkenleri, işlevleri ve ad alanlarını da bildirebilirsiniz. Paketin üst düzeyine çalıştırılabilir deyimler de dahil edebilirsiniz. Bir paketin üst düzeyinde değişkenler, işlevler veya ad alanları bildirirseniz, o düzeyde kullanılabilir olan nitelikler yalnızca public ve internal olur ve bildirim bir sınıf, değişken, işlev ya da ad alanı olsa da, her dosya için yalnızca bir paket düzeyi bildirimi, public niteliğini kullanabilir.

Paketler, kodunuzun organize edilmesinde ve ad çakışmalarının önlenmesinde kullanışlıdır. Paket kavramlarını, ilgili olmayan sınıf mirası kavramıyla karıştırmamalısınız. Aynı pakette kalan iki sınıf ortak bir ad alanına sahip olur ancak bu iki sınıfın mutlaka herhangi bir şekilde birbiriyle ilgili olması gerekmez. Aynı şekilde, yuvalanmış bir paketin, üst paketiyle herhangi bir anlamsal ilişkisi olmayabilir.

Paketleri içe aktarma

Bir paketin içindeki sınıfı kullanmak istiyorsanız, paketi veya belirli sınıfı içe aktarmanız gerekir. Bu, sınıfların içe aktarılmasının isteğe bağlı olduğu ActionScript 2.0'dan farklılık gösterir.

Örneğin, daha önce sunulan SampleCode sınıf örneğini düşünün. Sınıf, samples adında bir pakette kalıyorsa, SampleCode sınıfını kullanmadan önce aşağıdaki içe aktarma deyimlerinden birini kullanmanız gerekir:

import samples.*;

veya

import samples.SampleCode;

Genelde, import deyimleri olabildiğince belirli olmalıdır. samplespaketinden yalnızca SampleCode sınıfını kullanmayı planlıyorsanız, sınıfın ait olduğu paketin tamamını değil, yalnızca SampleCode sınıfını içe aktarmanız gerekir. Paketin tamamının içe aktarılması, beklenmeyen ad çakışmalarına yol açabilir.

Sınıf yolunuzun içine, paketi veya sınıfı tanımlayan kaynak kodunu da yerleştirmeniz gerekir. Sınıf yolu, derleyicinin içe aktarılan paketleri ve sınıfları nerede arayacağını belirleyen yerel dizin yollarının kullanıcı tanımlı bir listesidir. Sınıf yolu bazen oluşturma yolu veya kaynak yolu olarak da adlandırılır.

Sınıfı veya paketi düzgün şekilde içe aktardıktan sonra, sınıfın tam nitelendirilmiş adını (samples.SampleCode) veya yalnızca sınıf adını (SampleCode) kullanabilirsiniz.

Tam nitelendirilmiş adlar, aynı ada sahip sınıflar, yöntemler veya özellikler belirsiz koda neden olduğunda kullanışlıdır ancak tüm tanımlayıcılar için kullanıldığında yönetimleri zor olabilir. Örneğin, bir SampleCode sınıf örneğini başlattığınızda, tam nitelendirilmiş ad kullanılması, ayrıntılı bir kod verir:

var mySample:samples.SampleCode = new samples.SampleCode();

Yuvalanmış paketlerin düzeyleri arttıkça, kodunuzun okunabilirliği de azalır. Belirsiz tanımlayıcıların sorun yaratmayacağından emin olduğunuz durumlarda basit tanımlayıcıları kullanarak kodunuzun okunmasını kolaylaştırabilirsiniz. Örneğin, yeni bir SampleCode sınıf örneğinin başlatılması, yalnızca sınıf tanımlayıcısının kullanılmasına göre daha az ayrıntılıdır:

var mySample:SampleCode = new SampleCode();

Önce uygun paketi veya sınıfı içe aktarmadan tanımlayıcı adlarını kullanmayı denerseniz, derleyici sınıf tanımlarını bulamaz. Diğer yandan, paketi veya sınıfı içe aktarırsanız, içe aktarılmış bir adla çakışan bir adı tanımlama girişiminde bulunulduğunda bir hata oluşur.

Bir paket oluşturulduğunda, o paketin tüm üyeleri için varsayılan erişim belirticisi internal olur, başka bir deyişle, varsayılan olarak paket üyeleri yalnızca o paketin diğer üyelerine görünür. Bir sınıfın, paket dışındaki kod için kullanılabilir olmasını istiyorsanız, o sınıfın public olduğunu bildirmeniz gerekir. Örneğin, aşağıdaki paket iki sınıf içerir: SampleCode ve CodeFormatter:

// SampleCode.as file 
package samples 
{ 
    public class SampleCode {} 
} 
 
// CodeFormatter.as file 
package samples 
{ 
    class CodeFormatter {} 
}

SampleCode sınıfı, public sınıfı olarak bildirildiğinden, paket dışında da görünebilir. CodeFormatter sınıfı ise yalnızca samples paketinin içinde görünebilir. CodeFormatter sınıfına samples paketinin dışında erişmeye çalışırsanız, aşağıdaki örnekte gösterildiği gibi bir hata oluşturur:

import samples.SampleCode; 
import samples.CodeFormatter; 
var mySample:SampleCode = new SampleCode(); // okay, public class 
var myFormatter:CodeFormatter = new CodeFormatter(); // error

Her iki sınıfın da paket dışında kullanılabilir olmasını istiyorsanız, her iki sınıfın public olduğunu bildirmeniz gerekir. Paket bildirimine public niteliğini uygulayamazsınız.

Tam nitelendirilmiş adlar, paketler kullanılırken oluşabilecek ad çakışmalarının çözümlenmesinde kullanışlıdır. Sınıfları aynı tanımlayıcı ile tanımlayan iki paketi içe aktarırsanız böyle bir senaryo gerçekleşebilir. Örneğin, ayrıca SampleCode adında bir sınıfa sahip olan şu paketi göz önünde bulundurun:

package langref.samples 
{ 
    public class SampleCode {} 
}

Her iki sınıfı da aşağıdaki gibi içe aktarırsanız, SampleCode sınıfını ifade ederken bir ad çakışması olur:

import samples.SampleCode; 
import langref.samples.SampleCode; 
var mySample:SampleCode = new SampleCode(); // name conflict

Derleyici, hangi SampleCode sınıfının kullanılacağını bilemez. Bu çakışmayı çözümlemek için, aşağıdaki gibi her sınıfın tam nitelendirilmiş adını kullanmanız gerekir:

var sample1:samples.SampleCode = new samples.SampleCode(); 
var sample2:langref.samples.SampleCode = new langref.samples.SampleCode();
Not: C++ arka planına sahip programcılar genellikle import deyimini #include deyimiyle karıştırır. C++ derleyicileri aynı anda tek bir dosya işlediğinden ve açıkça bir başlık dosyası dahil edilmediyse sınıf tanımları için diğer dosyalara bakmadığından, #include direktifi C++ uygulamasında gereklidir. ActionScript 3.0, bir include direktifine sahiptir ancak bu direktif, sınıfları ve paketleri içe aktarmak için tasarlanmamıştır. ActionScript 3.0'da sınıfları veya paketleri içe aktarmak için, import deyimini kullanmanız ve paketi içeren kaynak dosyasını sınıf yoluna yerleştirmeniz gerekir.

Ad alanları

Ad alanları, oluşturduğunuz özellik ve yöntemlerin görünürlüğü üzerinde denetim elde etmenizi sağlar. public , private , protected ve internal erişim denetimi belirticilerini, yerleşik ad alanları olarak düşünün. Bu önceden tanımlı erişim denetimi belirticileri ihtiyaçlarınıza uymuyorsa, kendi ad alanlarınızı oluşturabilirsiniz.

XML ad alanları hakkında bilginiz varsa, ActionScript uygulamasının sözdizimi ve ayrıntıları XML'dekinden biraz daha farklı olsa da, burada ele alınan konuların çoğu size yabancı gelmeyecektir. Daha önce hiç ad alanlarıyla çalışmadıysanız, kavramın kendisi oldukça anlaşılırdır ancak uygulama için öğrenmeniz gereken belirli terminolojiler vardır.

Ad alanlarının nasıl çalıştığını anlamak için, özellik veya yöntem adının her zaman tanımlayıcı ve ad alanı olmak üzere iki bölüm içerdiğinin bilinmesi yardımcı olacaktır. Tanımlayıcı, genellikle ad olarak düşündüğünüz şeydir. Örneğin, aşağıdaki sınıf tanımında bulunan tanımlayıcılar sampleGreeting ve sampleFunction() şeklindedir:

class SampleCode 
{ 
    var sampleGreeting:String; 
    function sampleFunction () { 
        trace(sampleGreeting + " from sampleFunction()"); 
    } 
}

Tanımların önünde bir ad alanı niteliği olmadığında, tanımların adları varsayılan olarak internal ad alanı şeklinde nitelendirilir, başka bir deyişle bunlar yalnızca aynı paketteki çağıranlara görünür. Derleyici katı moda ayarlanırsa, derleyici, ad alanı niteliği olmayan tüm tanımlayıcılara internal ad alanının uygulandığına dair bir uyarı yayınlar. Bir tanımlayıcının her yerde kullanılabilir olmasını sağlamak için, tanımlayıcı adının başına özel olarak public niteliğini getirmeniz gerekir. Önceki örnek kodda, hem sampleGreeting hem de sampleFunction() , internal ad alanı değerine sahiptir.

Ad alanları kullanılırken izlenmesi gereken üç temel adım vardır. İlk olarak, namespace anahtar sözcüğünü kullanarak ad alanını tanımlamanız gerekir. Örneğin, aşağıdaki kod version1 ad alanını tanımlar:

namespace version1;

İkinci olarak, ad alanınızı bir özellik veya yöntem bildiriminde erişim denetimi belirticisinin yerine kullanarak uygularsınız. Aşağıdaki örnek, version1 ad alanına myFunction() adında bir işlev yerleştirir:

version1 function myFunction() {}

Üçüncü olarak, ad alanını uyguladıktan sonra, use direktifiyle veya bir tanımlayıcının adını bir ad alanıyla niteleyerek bu ad alanına başvurabilirsiniz. Aşağıdaki örnek, use direktifi yoluyla myFunction() işlevine başvurur:

use namespace version1; 
myFunction();

Aşağıdaki örnekte gösterildiği gibi, myFunction() işlevine başvurmak için nitelendirilmiş bir ad da kullanabilirsiniz:

version1::myFunction();

Ad alanlarını tanımlama

Ad alanları, bazen ad alanı adı olarak da adlandırılan tek bir değer (Uniform Resource Identifier (URI)) içerir. URI, ad alanı tanımınızın benzersiz olmasını sağlamanıza yardımcı olur.

İki yöntemden birini kullanarak bir ad alanı tanımı bildirip bir ad alanı oluşturursunuz. Bir XML ad alanı tanımlayacağınızdan, açık bir URI ile bir ad alanını tanımlayabilir veya URI'yi atabilirsiniz. Aşağıdaki örnek, URI kullanılarak bir ad alanının nasıl tanımlanabildiğini gösterir:

namespace flash_proxy = "http://www.adobe.com/flash/proxy";

URI, o ad alanı için benzersiz bir kimlik dizesi görevi görür. URI'yi aşağıdaki örnekteki gibi atarsanız, derleyici URI yerine benzersiz bir dahili kimlik dizesi oluşturur. Bu dahili kimlik dizesine erişiminiz olmaz.

namespace flash_proxy;

Siz URI ile veya URI olmadan bir ad alanını tanımladıktan sonra, o ad alanı aynı kapsamda yeniden tanımlanamaz. Aynı kapsamda önceden tanımlanmış bir ad alanını tanımlama girişimi, bir derleyici hatasına yol açar.

Bir paket veya sınıf içinde bir ad alanı tanımlanırsa, uygun erişim denetimi belirticileri kullanılmadığı sürece, söz konusu ad alanı, o paket veya sınıf dışındaki koda görünmeyebilir. Örneğin, aşağıdaki kod, flash.utils paketinde tanımlanan flash_proxy ad alanını gösterir. Aşağıdaki örnekte, erişim denetimi belirticisinin olmaması, flash_proxy ad alanının yalnızca flash.utils paketindeki koda görüneceği ve bu paket dışındaki kodlara görünmeyeceği anlamına gelir:

package flash.utils 
{ 
    namespace flash_proxy; 
}

Aşağıdaki kod, flash_proxy ad alanını paket dışındaki kodlara görünür duruma getirmek için public niteliğini kullanır:

package flash.utils 
{ 
    public namespace flash_proxy; 
}

Ad alanlarını uygulama

Ad alanı uygulanması, bir ad alanına bir tanımın yerleştirilmesi anlamına gelir. Ad alanlarına yerleştirilebilen tanımlar arasında, işlevler, değişkenler ve sabitler yer alır. (Özel bir ad alanına sınıf yerleştiremezsiniz.)

Örneğin, public erişim denetimi ad alanı kullanılarak bildirilen bir işlevi göz önünde bulundurun. Bir işlev tanımında public niteliği kullanıldığında, o işlev genel ad alanına yerleştirilir ve böylece işlev, tüm kod için kullanılabilir olur. Bir ad alanı tanımladıktan sonra, tanımladığınız ad alanını public niteliğiyle aynı şekilde kullanabilirsiniz ve tanım da özel ad alanınıza başvurabilen kod için kullanılabilir hale gelir. Örneğin, bir ad alanını example1 olarak tanımlarsanız, aşağıdaki örnekte gösterildiği gibi, nitelik olarak example1 öğesini kullanıp myFunction() adında bir yöntemi ekleyebilirsiniz:

namespace example1; 
class someClass 
{ 
    example1 myFunction() {} 
}

Nitelik olarak example1 ad alanı kullanılarak myFunction() yönteminin bildirilmesi, yöntemin example1 ad alanına ait olduğu anlamına gelir.

Ad alanlarını uygularken aşağıdakileri göz önünde bulundurmanız gerekir:

  • Her bildirime yalnızca bir ad alanı uygulayabilirsiniz.

  • Aynı anda birden çok tanıma bir ad alanı niteliği uygulanamaz. Başka bir deyişle, ad alanınızı on farklı işleve uygulamak istiyorsanız, on işlev tanımının her birine nitelik olarak ad alanınızı eklemeniz gerekir.

  • Ad alanları ve erişim denetimi belirticileri birbirini dışladığından, bir ad alanı uygularsanız, bir erişim denetimi belirticisi de belirtemezsiniz. Başka bir deyişle, bir işlevi veya özelliği ad alanınıza uygulamanın yanı sıra, public , private , protected ya da internal olarak bildiremezsiniz.

Ad alanlarına başvurma

public , private , protected ve internal gibi herhangi bir erişim denetimi ad alanıyla bildirilmiş bir yöntem veya özellik kullandığınızda, ad alanına açıkça başvurulmasına gerek yoktur. Bunun nedeni, bu özel ad alanlarına erişimin bağlama göre denetlenmesidir. Örneğin, private ad alanına yerleştirilen tanımlar, aynı sınıf içindeki kod için otomatik olarak kullanılabilir olur. Ancak tanımladığınız ad alanları için böyle bir bağlam duyarlılığı yoktur. Özel bir ad alanına yerleştirdiğiniz bir yöntem veya özelliği kullanmak için, ad alanına başvurmanız gerekir.

use namespace direktifiyle ad alanlarına başvurabilir veya ad niteleyicisi ( :: ) işaretini kullanarak ad alanıyla adı niteleyebilirsiniz. use namespace direktifiyle bir ad alanına başvurulması, ad alanını “açar”, böylece ad alanı nitelendirilmiş olmayan herhangi bir tanımlayıcıya uygulanabilir. Örneğin, example1 ad alanını tanımladıysanız, use namespace example1 direktifini kullanarak o ad alanındaki adlara erişebilirsiniz:

use namespace example1; 
myFunction();

Aynı anda birden çok ad alanı açabilirsiniz. Siz use namespace direktifiyle bir ad alanını açtıktan sonra, bu ad alanı, açıldığı kod bloğu boyunca açık kalır. Ad alanını açıkça kapatmanın bir yolu yoktur.

Ancak birden çok ad alanının açılması, ad çakışması olma olasılığını artırır. Bir ad alanını açmamayı tercih derseniz, yöntem veya özellik adını ad alanı ve ad niteleyicisi işaretiyle niteleyerek use namespace direktifini önleyebilirsiniz. Örneğin, aşağıdaki kod, myFunction() adını example1 ad alanıyla nasıl niteleyebileceğinizi gösterir:

example1::myFunction();

Ad alanlarını kullanma

ActionScript 3.0'ın parçası olan flash.utils.Proxy sınıfında ad çakışmalarını önlemek için kullanılan bir gerçek ad alanı örneğini bulabilirsiniz. ActionScript 2.0'daki Object.__resolve özelliğinin yerini alan Proxy sınıfı, bir hata oluşmadan önce tanımsız özellik veya yöntemlere yapılan başvuruları önlemenize yardımcı olur. Ad çakışmalarını önlemek için, Proxy sınıfının tüm yöntemleri, flash_proxy ad alanında bulunur.

flash_proxy ad alanının nasıl kullanıldığını daha iyi anlamak için, Proxy sınıfının nasıl kullanıldığını anlamanız gerekir. Proxy sınıfının işlevselliği, yalnızca Proxy sınıfından miras alan sınıflar için kullanılabilir durumdadır. Başka bir deyişle, bir nesnede Proxy sınıfının yöntemlerini kullanmak isterseniz, nesnenin sınıf tanımının, Proxy sınıfını genişletmesi gerekir. Örneğin, tanımsız bir yöntemi çağırma girişimlerinin tümünü önlemek istiyorsanız, Proxy sınıfını genişletir ve daha sonra Proxy sınıfının callProperty() yöntemini geçersiz kılarsınız.

Ad alanlarının uygulanmasının genellikle ad alanını tanımlama, uygulama ve ad alanına başvurma olmak üzere üç adımlık bir işlem olduğunu hatırlayabilirsiniz. Ancak, Proxy sınıfı yöntemlerinden herhangi birini asla açıkça çağırmadığınızdan, flash_proxy ad alanı yalnızca tanımlanır ve uygulanır fakat bu ad alanına asla başvurulmaz. ActionScript 3.0, flash_proxy ad alanını tanımlar ve bunu Proxy sınıfında uygular. Kodunuzun yalnızca Proxy sınıfını genişleten sınıflara flash_proxy ad alanını uygulaması gerekir.

flash_proxy ad alanı, flash.utils paketinde aşağıdakine benzer şekilde tanımlanır:

package flash.utils 
{ 
    public namespace flash_proxy; 
}

Aşağıdaki Proxy sınıfı alıntısında gösterildiği gibi, ad alanı, Proxy sınıfının yöntemlerine uygulanır:

public class Proxy 
{ 
    flash_proxy function callProperty(name:*, ... rest):* 
    flash_proxy function deleteProperty(name:*):Boolean 
    ... 
}

Aşağıdaki kodda gösterildiği gibi, ilk olarak hem Proxy sınıfını hem de flash_proxy ad alanını içe aktarmanız gerekir. Daha sonra, Proxy sınıfını genişletecek şekilde sınıfınızı bildirmeniz gerekir. (Katı modda derleme yapıyorsanız, ayrıca dynamic niteliğini de eklemeniz gerekir.) callProperty() yöntemini geçersiz kıldığınızda, flash_proxy ad alanını kullanmanız gerekir.

package 
{ 
    import flash.utils.Proxy; 
    import flash.utils.flash_proxy; 
 
    dynamic class MyProxy extends Proxy 
    { 
        flash_proxy override function callProperty(name:*, ...rest):* 
        { 
            trace("method call intercepted: " + name); 
        } 
    } 
}

MyProxy sınıfının bir örneğini oluşturur ve aşağıdaki örnekte çağrılan testing() yöntemi gibi tanımsız bir yöntem çağırırsanız, Proxy nesneniz yöntem çağrısını önler ve geçersiz kılınan callProperty() yönteminin içinde deyimleri çalıştırır (bu durumda, basit bir trace() deyimi).

var mySample:MyProxy = new MyProxy(); 
mySample.testing(); // method call intercepted: testing

flash_proxy ad alanının içinde Proxy sınıfı yöntemlerinden birinin bulunmasının iki avantajı vardır. İlk olarak, ayrı bir ad alanının bulunması, Proxy sınıfını genişleten herhangi bir sınıfın genel arabiriminde karmaşıklığı azaltır. (Proxy sınıfında, geçersiz kılabileceğiniz yaklaşık bir düzine yöntem vardır ve bunların hiçbiri doğrudan çağrılmak üzere tasarlanmamıştır. Bunların tümünün genel ad alanına yerleştirilmesi kafa karıştırıcı olabilir.) İkinci olarak, flash_proxy ad alanının kullanılması, Proxy alt sınıfınızın herhangi bir Proxy sınıfı yöntemiyle eşleşen adlara sahip örnek yöntemler içermesi durumunda ad çakışmalarını önler. Örneğin, kendi yöntemlerinizden birine callProperty() adını vermek isteyebilirsiniz. callProperty() yöntemi sürümünüz farklı bir ad alanında olduğundan, aşağıdaki kod kabul edilebilir:

dynamic class MyProxy extends Proxy 
{ 
    public function callProperty() {} 
    flash_proxy override function callProperty(name:*, ...rest):* 
    { 
        trace("method call intercepted: " + name); 
    } 
}

Dört erişim denetimi belirticisiyle ( public , private , internal ve protected ) gerçekleştirilemeyecek şekilde yöntemlere veya özelliklere erişim sağlamak istediğinizde de ad alanları yardımcı olabilir. Örneğin, birçok pakete yayılmış birkaç yardımcı program yönteminiz olabilir. Bu yöntemlerin, tüm paketleriniz için kullanılabilir olmasını ancak genel olarak herkese açık olmamasını istersiniz. Bu işlemi gerçekleştirmek için, bir ad alanı oluşturabilir ve bunu kendi özel erişim denetimi belirticiniz olarak kullanabilirsiniz.

Aşağıdaki örnekte, farklı paketlerde bulunan iki işlevi birlikte gruplandırmak için kullanıcı tanımlı bir ad alanı kullanılmaktadır. Bunları aynı ad alanında gruplandırarak tek bir use namespace deyimini kullanıp her iki işlevi bir sınıf veya paket için görünebilir duruma getirebilirsiniz.

Bu örnekte tekniği göstermek için dört dosya kullanılmaktadır. Tüm dosyaların sınıf yolunuzda yazılması gerekir. Birinci dosya olan myInternal.as, myInternal ad alanını tanımlamak için kullanılır. Dosya, example adındaki bir pakette bulunduğundan, dosyayı example adındaki bir klasöre yerleştirmeniz gerekir. Ad alanı, diğer paketlere içe aktarılabilmesi için public olarak işaretlenir.

// myInternal.as in folder example 
package example 
{ 
    public namespace myInternal = "http://www.adobe.com/2006/actionscript/examples"; 
}

İkinci ve üçüncü dosyalar olan Utility.as ve Helper.as, diğer paketler için kullanılabilir olması gereken yöntemlerin bulunduğu sınıfları tanımlar. Utility sınıfı, example.alpha paketindedir, başka bir deyişle, example klasörünün alt klasörü olan alpha adında bir klasörün içine dosyanın yerleştirilmesi gerekir. Helper sınıfı, example.beta paketindedir, başka bir deyişle, example klasörünün alt klasörü olan beta adında bir klasörün içine dosyanın yerleştirilmesi gerekir. Bu her iki example.alpha ve example.beta paketinin de ad alanını kullanmadan önce içe aktarması gerekir.

// Utility.as in the example/alpha folder 
package example.alpha 
{ 
    import example.myInternal; 
     
    public class Utility 
    { 
        private static var _taskCounter:int = 0; 
     
        public static function someTask() 
        { 
            _taskCounter++; 
        } 
         
        myInternal static function get taskCounter():int 
        { 
            return _taskCounter; 
        } 
    } 
} 
 
// Helper.as in the example/beta folder 
package example.beta 
{ 
    import example.myInternal; 
     
    public class Helper 
    { 
        private static var _timeStamp:Date; 
         
        public static function someTask() 
        { 
            _timeStamp = new Date(); 
        } 
         
        myInternal static function get lastCalled():Date 
        { 
            return _timeStamp; 
        } 
    } 
}

Dördüncü dosya olan NamespaceUseCase.as, ana uygulama sınıfı olup example klasörünün bir eşdüzeyi olması gerekir. Flash Professional'da bu sınıf, FLA'nın belge sınıfı olarak kullanılır. NamespaceUseCase sınıfı ayrıca myInternal ad alanını içe aktarır ve diğer paketlerde bulunan iki statik yöntemi çağırmak için bu ad alanını kullanır. Bu örnek yalnızca kodu basitleştirmek için statik yöntemleri kullanır. myInternal ad alanına hem statik yöntemler hem de örnek yöntemleri yerleştirilebilir.

// NamespaceUseCase.as 
package 
{ 
    import flash.display.MovieClip; 
    import example.myInternal; // import namespace 
    import example.alpha.Utility;// import Utility class 
    import example.beta.Helper;// import Helper class 
     
    public class NamespaceUseCase extends MovieClip 
    { 
        public function NamespaceUseCase() 
        { 
            use namespace myInternal; 
             
            Utility.someTask(); 
            Utility.someTask(); 
            trace(Utility.taskCounter); // 2 
             
            Helper.someTask(); 
            trace(Helper.lastCalled); // [time someTask() was last called] 
        } 
    } 
}