• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Adobe actionscript 3.0 programlama türkçe
 

Adobe actionscript 3.0 programlama türkçe

on

  • 1,406 views

Adobe actionscript 3.0 programlama türkçe

Adobe actionscript 3.0 programlama türkçe

Statistics

Views

Total Views
1,406
Views on SlideShare
1,344
Embed Views
62

Actions

Likes
0
Downloads
10
Comments
0

4 Embeds 62

http://denizarmutlu.com 34
http://www.denizarmutlu.com.tr 13
http://www.denizarmutlu.com 11
http://denizarmutlu.com.tr 4

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Adobe actionscript 3.0 programlama türkçe Adobe actionscript 3.0 programlama türkçe Document Transcript

    • ADOBE®ACTIONSCRIPT®3.0ıProgramlama
    • Telif Hakkı© 2008 Adobe Systems Incorporated. Tüm hakları saklıdır.ActionScript™ 3.0ı ProgramlamaBu kılavuz son kullanıcı sözleşmesini içeren bir yazılımla birlikte verilmişse bu kılavuz ve onda anlatılan yazılım lisanslıdır ve yalnızca bu lisansa uygun şekildekullanılabilir veya kopyalanabilir. Bu türde bir lisans tarafından izin verildiği durumlar dışında, bu kılavuzun hiçbir bölümü Adobe Systems Incorporatedşirketinden önceden yazılı izin alınmadan çoğaltılamaz, geri alma sistemlerinde depolanamaz veya elektronik, mekanik, kayıt yoluyla veya diğer herhangi birşekilde veya herhangi bir yöntemle aktarılamaz. Lütfen bu kılavuzun içeriğinin, kılavuz son kullanıcı lisans sözleşmesine sahip bir yazılımla birlikte verilmemişolsa dahi, telif hakkı yasalarıyla korunduğunu unutmayın.Bu kılavuzun içeriği yalnızca bilgi amaçlıdır, önceden haber verilmeden değiştirilebilir ve Adobe Systems Incorporated şirketinin bir taahhüdü olarakyorumlanmamalıdır. Adobe Systems Incorporated bu kılavuzdaki bilgilerin hatalı veya yanlış olması durumunda hiçbir sorumluluk veya yükümlülük kabuletmez.Projenize dahil etmek isteyebileceğiniz mevcut resimlerin ve görüntülerin telif hakkı yasalarıyla korunuyor olabileceğini unutmayın. Bu türde malzemenin yeniçalışmanıza yetkisiz olarak katılması, telif hakkı sahibinin haklarını ihlal etmek anlamına gelebilir. Lütfen telif hakkı sahibinden gerekli tüm izinleri aldığınızdanemin olun.Örnek şablonlarda şirket adlarına yapılan tüm referanslar yalnızca tanıtım amaçlıdır ve hiçbir gerçek kuruluşla ilgili değildir.Adobe, the Adobe logo, Adobe AIR, ActionScript, Flash, Flash Lite, Flex, Flex Builder, MXML, and Pixel Bender are either registered trademarks or trademarksof Adobe Systems Incorporated in the United States and/or other countries.ActiveX and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and other countries. Macintosh is atrademark of Apple Inc., registered in the United States and other countries. Java is a trademark or registered trademark of Sun Microsystems, Inc. in the UnitedStates and other countries.All other trademarks are the property of their respective owners.This product includes software developed by the Apache Software Foundation (http://www.apache.org/).MPEG Layer-3 audio compression technology licensed by Fraunhofer IIS and Thomson Multimedia (http://www.mp3licensing.com)Speech compression and decompression technology licensed from Nellymoser, Inc. (www.nellymoser.com).Video compression and decompression is powered by On2 TrueMotion video technology. © 1992-2005 On2 Technologies, Inc. All Rights Reserved.http://www.on2.com.This product includes software developed by the OpenSymphony Group (http://www.opensymphony.com/).This product contains either BSAFE and/or TIPEM software by RSA Security, Inc.Sorenson Spark™ video compression and decompression technology licensed from Sorenson Media, Inc.Adobe Systems Incorporated, 345 Park Avenue, San Jose, California 95110, USANotice to U.S. government end users. The software and documentation are “Commercial Items,” as that term is defined at 48 C.F.R. §2.101, consisting of“Commercial Computer Software” and “Commercial Computer Software Documentation,” as such terms are used in 48 C.F.R. §12.212 or 48 C.F.R. §227.7202,as applicable. Consistent with 48 C.F.R. §12.212 or 48 C.F.R. §§227.7202-1 through 227.7202-4, as applicable, the Commercial Computer Software andCommercial Computer Software Documentation are being licensed to U.S. Government end users (a) only as Commercial items and (b) with only those rightsas are granted to all other end users pursuant to the terms and conditions herein. Unpublished-rights reserved under the copyright laws of the United States.Adobe Systems Incorporated, 345 Park Avenue, San Jose, CA 95110-2704, USA. For U.S. Government End Users, Adobe agrees to comply with all applicableequal opportunity laws including, if appropriate, the provisions of Executive Order 11246, as amended, Section 402 of the Vietnam Era Veterans ReadjustmentAssistance Act of 1974 (38 USC 4212), and Section 503 of the Rehabilitation Act of 1973, as amended, and the regulations at 41 CFR Parts 60-1 through 60-60,60-250 ,and 60-741. The affirmative action clause and regulations contained in the preceding sentence shall be incorporated by reference.
    • iiiİçindekilerBölüm 1: Bu kılavuz hakkındaBu kılavuzu kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1ActionScript belgelerine erişim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2ActionScript öğrenme kaynakları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3Bölüm 2: ActionScript 3.0a girişActionScript hakkında . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4ActionScript 3.0ın avantajları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4ActionScript 3.0daki yenilikler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5Önceki sürümlerle uyumluluk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Bölüm 3: ActionScript ile çalışmaya başlamaProgramlama temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Nesnelerle çalışma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Ortak program öğeleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19Örnek: Animasyon portföy parçası . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21ActionScript ile uygulamalar oluşturma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23Kendi sınıflarınızı oluşturma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27Örnek: Temel bir uygulama oluşturma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Sonraki örnekleri çalıştırma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34Bölüm 4: ActionScript dili ve sözdizimiDile genel bakış . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37Nesneler ve sınıflar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38Paketler ve ad alanları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38Değişkenler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48Veri türleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51Sözdizimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63Operatörler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68Koşullar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73Döngü . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75İşlevler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78Bölüm 5: ActionScriptte nesne tabanlı programlamaNesne tabanlı programlama temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89Sınıflar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90Arabirimler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104Miras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106Gelişmiş başlıklar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114Örnek: GeometricShapes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121Bölüm 6: Tarih ve saatlerle çalışmaTarih ve saat temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129Takvim tarih ve saatlerini yönetme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
    • ivACTIONSCRIPT 3.0I PROGRAMLAMAİçindekilerZaman aralıklarını denetleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132Örnek: Basit analog saat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134Bölüm 7: Dizelerle çalışmaDizelerin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138Dizeler oluşturma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139length özelliği . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140Dizelerdeki karakterlerle çalışma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140Dizeleri karşılaştırma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141Diğer nesnelerin dize halinde temsilini alma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142Dizeleri bitiştirme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142Dizelerdeki alt dizeleri ve desenleri bulma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142Dizeleri büyük harfe veya küçük harfe dönüştürme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146Örnek: ASCII art . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146Bölüm 8: Dizilerle çalışmaDizilerin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152Dizinlenmiş diziler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154İlişkilendirilebilir diziler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164Çok boyutlu diziler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168Dizileri klonlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169Gelişmiş başlıklar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170Örnek: PlayList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175Bölüm 9: Hataları işlemeHata işlemenin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179Hata türleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181ActionScript 3.0da hata işleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183Flash Player ve AIR uygulamalarının hata ayıklayıcı sürümleriyle çalışma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184Bir uygulamada eşzamanlı hataları işleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185Özel hata sınıfları oluşturma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189Hata olaylarını ve durumunu yanıtlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190Error sınıflarını karşılaştırma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193Örnek: CustomErrors uygulaması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197Bölüm 10: Normal ifadeler kullanmaNormal ifadelerin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202Normal ifade sözdizimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204Dizelerle normal ifadeleri kullanma yöntemleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216Örnek: Wiki ayrıştırıcı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217Bölüm 11: XML ile çalışmaXML temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222XML işlemeye yönelik E4X yaklaşımı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225XML nesneleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227XMLList nesneleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229XML değişkenlerini başlatma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230XML nesnelerini birleştirme ve dönüştürme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
    • vACTIONSCRIPT 3.0I PROGRAMLAMAİçindekilerXML yapılarında geçiş yapma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233XML ad alanlarını kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237XML tür dönüştürmesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238Harici XML belgelerini okuma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239Örnek: Internetten RSS yükleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240Bölüm 12: Olayları işlemeOlay işleme temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243ActionScript 3.0 olay işleme, önceki sürümlerden nasıl farklılık gösterir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245Olay akışı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247Olay nesneleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249Olay dinleyicileri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253Örnek: Alarm Clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259Bölüm 13: Görüntü programlamaGörüntü programlama temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265Çekirdek görüntüleme sınıfları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269Görüntüleme listesi yaklaşımının avantajları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270Görüntüleme nesneleriyle çalışma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273Görüntüleme nesnelerini işleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284Nesnelere animasyon uygulama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302Görüntüleme içeriğini dinamik olarak yükleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304Örnek: SpriteArranger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307Bölüm 14: Çizim APIsini kullanmaÇizim APIsini kullanma temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313Graphics sınıfını anlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315Çizgi ve eğriler çizme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315Yerleşik yöntemleri kullanarak şekiller çizme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317Degrade çizgiler ve dolgular oluşturma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318Çizim yöntemleriyle Math sınıfını kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322Çizim APIsi ile animasyon uygulama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323Örnek: Algoritmik Görsel Efekt Oluşturucu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323Çizim APIsinin ileri düzey kullanımı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325Yol Çizme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326Sargı kurallarını tanımlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328Grafik verisi sınıflarını kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330drawTriangles() öğesini kullanma hakkında . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332Bölüm 15: Geometriyle çalışmaGeometri temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333Point nesnelerini kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335Rectangle nesnelerini kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337Matrix nesnelerini kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340Örnek: Görüntüleme nesnesine matris dönüştürmesi uygulama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
    • viACTIONSCRIPT 3.0I PROGRAMLAMAİçindekilerBölüm 16: Görüntüleme nesnelerine filtre uygulamaGörüntüleme nesnelerine filtre uygulama temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345Filtreler oluşturma ve uygulama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346Kullanılabilir görüntü filtreleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353Örnek: Filter Workbench . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368Bölüm 17: Pixel Bender gölgelendiricileriyle çalışmaPixel Bender gölgelendiricilerinin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376Gölgelendirici yükleme veya gömme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378Gölgelendirici meta verilerine erişme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379Gölgelendirici girdisi ve parametre değerlerini belirtme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380Gölgelendirici kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385Bölüm 18: Film klipleriyle çalışmaFilm kliplerinin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397MovieClip nesneleriyle çalışma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399Film klibi oynatımını denetleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399ActionScript ile MovieClip nesneleri oluşturma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402Harici bir SWF dosyasını yükleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404Örnek: RuntimeAssetsExplorer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405Bölüm 19: Ara hareketlerle çalışmaAra Hareket Temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409Ara hareket komut dosyalarını kopyalama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410Ara hareket komut dosyalarını birleştirme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411Animasyonu açıklama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411Filtreler ekleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414Ara hareketi görüntüleme nesneleriyle ilişkilendirme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415Bölüm 20: Ters kinematikle çalışmaTers Kinematik temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417IK Armatürlerine Animasyon Uygulamaya Genel Bakış . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418IK armatürü hakkında bilgi alma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420IK Taşıyıcısını Başlatma ve IK Taşıyıcısının Hareketini Sınırlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420Bir IK Armatürünü hareket ettirme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421IK Olaylarını Kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421Bölüm 21: Metinle çalışmaMetinle çalışmanın temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423TextField sınıfını kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425Flash Text Enginei kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447Bölüm 22: Bitmaplerle çalışmaBitmaplerle çalışmanın temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474Bitmap ve BitmapData sınıfları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476Piksellerde değişiklik yapma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478Bitmap verilerini kopyalama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480Gürültü işlevleri ile doku oluşturma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
    • viiACTIONSCRIPT 3.0I PROGRAMLAMAİçindekilerBitmapleri kaydırma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483Mipmap oluşturma avantajından yararlanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484Örnek: Animasyonlu dönen ay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484Bölüm 23: Üç boyutlu (3B) çalışma3B temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495Flash Player ve AIR çalışma zamanının 3B özelliklerini anlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4963B nesneler oluşturma ve taşıma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4973B nesneleri 2B görünümde yansıtma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499Karmaşık 3B dönüştürmeler gerçekleştirme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5033B efektler için üçgenleri kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507Bölüm 24: Videoyla çalışmaVideo temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515Video formatlarını anlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517Video sınıfını anlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519Video dosyalarını yükleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520Video oynatımını denetleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520Tam ekran kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522Donanım ivmesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526Video dosyalarını akışa alma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527İşaret noktalarını anlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528Meta veri ve işaret noktaları için geri çağrı yöntemleri yazma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529İşaret noktalarını ve meta verileri kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534Kamera girdisini yakalama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543Sunucuya video gönderme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549FLV dosyaları için gelişmiş başlıklar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550Örnek: Video Jukebox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551Bölüm 25: Sesle çalışmaSesle çalışmanın temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556Ses mimarisini anlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558Harici ses dosyalarını yükleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559Gömülü seslerle çalışma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561Akış ses dosyalarıyla çalışma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562Dinamik olarak oluşturulmuş sesle çalışma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563Sesleri çalma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565Sesler yüklenirken ve çalınırken dikkate alınması gereken güvenlikle ilgili noktalar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569Ses düzeyini denetleme ve yatay kaydırma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569Ses meta verisiyle çalışma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571Ham ses verilerine erişme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572Ses girdisini yakalama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576Örnek: Podcast Player . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579Bölüm 26: Kullanıcı girdisini yakalamaKullanıcı girdisinin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586Klavye girdisini yakalama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587
    • viiiACTIONSCRIPT 3.0I PROGRAMLAMAİçindekilerFare girişi yakalama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589Örnek: WordSearch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593Bölüm 27: Ağ iletişimi ve iletişimAğ iletişimi ve iletişimin temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597Harici verilerle çalışma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600Diğer Flash Player ve AIR örneklerine bağlanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605Soket bağlantıları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610Yerel verileri saklama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614Veri dosyalarıyla çalışma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616Örnek: Bir Telnet istemcisi oluşturma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630Örnek: Dosya yükleme ve indirme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633Bölüm 28: İstemci sistemi ortamıİstemci sistemi ortamının temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639System sınıfını kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641Capabilities sınıfını kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642ApplicationDomain sınıfını kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642IME sınıfını kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645Örnek: Sistem yeteneklerini algılama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 650Bölüm 29: Kopyalayıp yapıştırmaKopyalayıp yapıştırma temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654Sistem panosundan okuma ve sistem panosuna yazma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654Pano veri formatları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655Bölüm 30: YazdırmaYazdırma temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659Sayfa yazdırma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 660Flash Player ve AIR görevleri ve sistem yazdırması . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661Boyutu, ölçeği ve yönlendirmeyi ayarlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664Örnek: Çoklu sayfa yazdırma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665Örnek: Ölçekleme, kırpma ve yanıtlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667Bölüm 31: Harici APIyi kullanmaHarici APIyi kullanma temelleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670Harici API gereksinimleri ve avantajları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672ExternalInterface sınıfını kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673Örnek: Harici APIyi bir web sayfası konteyneriyle kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677Örnek: Harici APIyi bir ActiveX konteyneriyle kullanma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682Bölüm 32: Flash Player güvenliğiFlash Player güvenliğine genel bakış . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688Güvenlik sanal alanları . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689İzin denetimleri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692Ağ iletişim APIlerini kısıtlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699Tam ekran modu güvenliği . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701İçerik yükleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702
    • ixACTIONSCRIPT 3.0I PROGRAMLAMAİçindekilerÇapraz komut dosyası oluşturma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704Veri olarak yüklenen ortama erişme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707Veri yükleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709Güvenlik etki alanına içe aktarılan SWF dosyalarından gömülü içerik yükleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712Eski içerikle çalışma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712LocalConnection izinlerini ayarlama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713Giden URL erişimini denetleme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713Paylaşılan nesneler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715Kamera, mikrofon, pano, fare ve klavye erişimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716Dizin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717
    • 1Bölüm 1: Bu kılavuz hakkındaBu kılavuz Adobe® ActionScript® 3.0da uygulama geliştirmek için gerekli olan temel bilgileri sunar. Açıklanan fikir veteknikleri en iyi şekilde anlayabilmek için veri türleri, değişkenler, döngüler ve işlevler gibi genel programlamakavramlarını bilmeniz gerekmektedir. Ayrıca sınıflar ve miras alma gibi nesne tabanlı temel programlamakavramlarını da anlıyor olmanız gerekir. ActionScript 1.0 veya ActionScript 2.0 bilgisi işinize yarayacak olsa da şartdeğildir.Bu kılavuzu kullanmaBu kılavuzun bölümleri ActionScript belgelerinin ilgili kısımlarını daha kolay bulmanız için aşağıdaki mantıksalgruplara ayrılmıştır:Bu kılavuz ayrıca önemli veya sık kullanılan sınıflar için uygulama programlama kavramlarını gösteren sayısız örnekdosya içerir. Örnek dosyalar Adobe® Flash® CS4 Professional ile daha kolay yüklenecek ve kullanılabilecek şekildepaketlenmiştir ve saran dosyalar içerebilir. Ancak, örnek kodun temeli istediğiniz geliştirme ortamındakullanabileceğiniz ActionScript 3.0 biçimindedir.ActionScript 3.0 şunlar da dahil olmak üzere birden fazla şekilde yazılabilir ve derlenebilir:• Adobe Flex Builder 3 geliştirme ortamını kullanma• Flex Builder 3 ile birlikte verilen gibi herhangi bir metin düzenleyici ve komut satırı derleyici kullanma• Adobe® Flash® CS4 Professional geliştirme aracını kullanmaActionScript geliştirme ortamları ile ilgili daha fazla bilgi için “ActionScript 3.0a giriş” sayfa 4 bölümüne bakın.Bu kılavuzdaki kod örneklerini anlamak için Flex Builder veya Flash geliştirme aracı gibi ActionScript için dahiligeliştirme ortamları tecrübeniz olması gerekli değildir. Ancak bu araçlarla ActionScript 3.0 kodu yazmayı ve derlemeyiöğrenmek için ilgili araçların belgelerine başvurmak isteyeceksiniz. Daha fazla bilgi için bkz. “ActionScript belgelerineerişim” sayfa 2.Bölümler AçıklamaBölüm 2-5, ActionScript programlamaya genel bakış Dil sözdizimi, deyimler, operatörler ve nesne tabanlı ActionScript programlama gibitemel ActionScript 3.0 kavramlarını ele alır.Bölüm 6-11, temel ActionScript 3.0 veri türleri vesınıflarıActionScript 3.0daki üst düzey veri türlerini açıklar.Bölüm 12-32, Flash Player ve Adobe AIR APIleri Olay işleme, görüntüleme nesneleri ve görüntüleme listesiyle çalışma, ağ veiletişimler, dosya girdisi ve çıktısı, harici arabirim, uygulama güvenlik modeli vebunlar gibi Adobe Flash Player 10 ve AIR uygulamasına özgü paket ve sınıflardauygulanan önemli özellikleri açıklar.
    • 2ACTIONSCRIPT 3.0I PROGRAMLAMABu kılavuz hakkındaActionScript belgelerine erişimBu kılavuz ağırlıklı olarak zengin ve güçlü bir nesne tabanlı programlama dili olan ActionScript 3.0ı anlattığı içinbelirli bir araç veya sunucu mimarisi içerisindeki uygulama geliştirme sürecine veya iş akışına geniş yer vermez. Bunedenle, ActionScript 3.0ı Programlamanın yanı sıra, ActionScript 3.0 uygulamalarının tasarlama, geliştirme, testetme ve konuşlandırma sürecinde diğer belgelere de başvurmak isteyeceksiniz.ActionScript 3.0 belgeleriBu kılavuz size ActionScript 3.0 programlama dilinin altındaki kavramları tanıtır ve dilin önemli özelliklerini gösterenuygulama detayları ve örnekleri sunar. Ancak, bu kılavuz tam bir dil başvurusu değildir. Bu nedenle, dil içindeki hersınıfı, yöntemi, özelliği ve olayı anlatan ActionScript 3.0 Dil ve Bileşen Başvurusu bölümünü inceleyin. ActionScript3.0 Dil ve Bileşenler Başvurusu, temel dil, Flash geliştirme aracı bileşenleri (fl paketlerindeki) ve Flash Player ve AdobeAIR APIleri (flash paketlerindeki) ile ilgili ayrıntılı başvuru bilgisi sunar.Flash belgeleriFlash geliştirme aracını kullanıyorsanız, şu kılavuzlara başvurmak isteyebilirsiniz:Kitap AçıklamaFlashı kullanma Flash geliştirme aracında dinamik web uygulamalarınızı nasıl geliştireceğiniziaçıklarActionScript 3.0ı Programlama ActionScript 3.0 dili ve temel Flash Player ve Adobe AIR APIsinin belirli kullanımınıaçıklarActionScript 3.0 Dil ve Bileşenler Başvurusu Flash geliştirme aracı bileşenleri ve ActionScript 3.0 APIsi için sözdizimi, kullanımve kod örnekleri sunarActionScript 3.0 Bileşenlerini Kullanma Flash tarafından oluşturulan uygulamaları geliştirmek için bileşenlerinkullanımıyla ilgili ayrıntıları açıklarFlash CS4 Professional ile Adobe AIR UygulamalarıGeliştirmeFlash içinde ActionScript 3.0 ve Adobe AIR APIsi kullanılarak Adobe AIRuygulamalarının nasıl geliştirileceğini ve konuşlandırılacağını anlatırAdobe Flash içinde ActionScript 2.0 Öğrenme ActionScript 2.0 sözdizimine genel bir bakış sunar ve farklı nesne türleri ileçalışırken ActionScript 2.0ın nasıl kullanılacağını açıklarActionScript 2.0 Dil Başvurusu Flash geliştirme aracı bileşenleri ve ActionScript 2.0 APIsi için sözdizimi, kullanımve kod örnekleri sunarActionScript 2.0 Bileşenlerini Kullanma Flash tarafından oluşturulan uygulamaları geliştirmek için ActionScript 2.0bileşenlerinin nasıl kullanılacağını ayrıntılı şekilde açıklarActionScript 2.0 Bileşenleri Dil Başvurusu Sürüm 2 Adobe Bileşen Mimarisi ve ilgili API içerisinde bulunan bileşenleri anlatırFlashı Genişletme Javascript APIsi içerisindeki nesneleri, yöntemleri ve özellikleri anlatırFlash Lite 2.x ile Çalışmaya Başlama Uygulama geliştirmek için Adobe® Flash® Lite™ 2.x uygulamasının nasılkullanılacağını açıklar ve Flash Lite 2.x ile kullanılabilen ActionScript özellikleri içinsözdizimi, kullanım ve kod örnekleri sunarFlash Lite 2.x Uygulamaları Geliştirme Flash Lite 2.x uygulamalarının nasıl geliştirileceğini açıklarFlash Lite 2.x ActionScripte Giriş Flash Lite 2.x ile nasıl uygulama geliştirileceğini gösterir ve Flash Lite 2.xgeliştiricilerinin kullanabildiği tüm ActionScript özelliklerini anlatırFlash Lite 2.x ActionScript Dil Başvurusu) Flash Lite 2.x içinde bulunan ActionScript 2.0 APIsi için sözdizimi, kullanım ve kodörneği sunar.
    • 3ACTIONSCRIPT 3.0I PROGRAMLAMABu kılavuz hakkındaActionScript öğrenme kaynaklarıBu kılavuzlara ek olarak Adobe, Adobe Geliştirici Merkezi ve Adobe Tasarım Merkezinde düzenli olarak güncellenenmakaleler, tasarım fikirleri ve örnekler sunar.Adobe Geliştirici MerkeziAdobe Geliştirici Merkezinde ActionScript ile ilgili en son bilgiler, gerçek dünya uygulama geliştirme üzerinemakaleler ve önemli yeni konular ile ilgili bilgiler yer almaktadır. Geliştirici Merkezine www.adobe.com/devnet/adreslerinden ulaşabilirsiniz.Adobe Tasarım MerkeziDijital tasarım ve hareketli grafik ile ilgili en son bilgileri alın. Önemli sanatçıların adıyla göz atın, yeni tasarımeğilimlerini keşfedin ve dersler, önemli iş akışları ve gelişmiş tekniklerle becerilerinizi geliştirin. Yeni dersler vemakaleler ile ilham verici galeri öğeleri için iki haftada bir kontrol edin. Tasarım Merkezinewww.adobe.com/designcenter/ adresinden ulaşabilirsiniz.Flash Lite 1.x ile Çalışmaya Başlama Flash Lite 1.x uygulamasına giriş sunar ve Adobe® Device Central CS4 emülatörükullanarak içeriğinizi nasıl test edeceğinizi açıklarFlash Lite 1.x Uygulamaları Geliştirme Flash Lite 1.x kullanılarak mobil cihazlar için nasıl uygulama geliştirileceğinianlatır.Flash Lite 1.x ActionScript Öğrenmek FlashLite1.xiçerisindenasılActionScriptkullanılacağınıveFlashLite1.xiçerisindebulunan ActionScript özelliklerini anlatırFlash Lite 1.x ActionScript Dil Başvurusu FlashLite1.xiçerisindebulunanActionScriptöğelerininsözdiziminivekullanımınısunarKitap Açıklama
    • 4Bölüm 2: ActionScript 3.0a girişBu bölümde, en yeni ve en yenilikçi ActionScript sürümü olan Adobe® ActionScript® 3.0a genel bakış sağlanmaktadır.ActionScript hakkındaActionScript, Adobe® Flash® Player ve Adobe® AIR™ çalışma zamanı ortamları için programlama dilidir. Flash, Flex veAIR içerik ve uygulamalarında etkileşim, veri işleme ve daha fazlasına olanak sağlar.ActionScript, Flash Player ve AIR uygulamasının bir parçası olan ActionScript Virtual Machine (AVM) tarafındançalıştırılır. ActionScript kodu, Adobe® Flash® CS4 Professional veya Adobe® Flex™ Builder™ uygulamasında yerleşikolanlar ya da Adobe® Flex™ SDK uygulamasında kullanılabilir olanlar gibi, genellikle bir derleyici tarafından bayt koduformatında (bilgisayarlar tarafından yazılan ve anlaşılan bir çeşit programlama dili) derlenir. Bayt kodu, Flash Playerve AIR uygulamaları tarafından çalıştırılan SWF dosyalarında gömülüdür.ActionScript 3.0, nesne tabanlı programlama konusunda temel bilgisi olan geliştiricilere bilindik gelecek güçlü birprogramlama modeli sunar. ActionScript 3.0ın önceki ActionScript sürümlerinden daha gelişmiş olan bazı önemliözellikleri arasında şunlar yer alır:• AVM2 adı verilen ve yeni bir bayt kodu talimat kümesi kullanıp önemli ölçüde performans artışı sağlayan yeni birActionScript Virtual Machine.• Önceki derleyici sürümlerinden daha derin eniyileştirmeler gerçekleştiren daha modern bir derleyici kodu• Düşük düzeyde nesne denetimi ve gerçek bir nesne odaklı model içeren, genişletilmiş ve geliştirilmiş bir uygulamaprogramlama arabirimi (API)• XML için ECMAScript (E4X) belirtimini (ECMA-357 sürüm 2) esas alan XML APIsi. E4X, dilin yerel veri türüolarak ECMAScripte XML ekleyen bir dil uzantısıdır.• Belge Nesnesi Modeli (DOM) Düzey 3 Olaylar Belirtimini esas alan bir olay modeliActionScript 3.0ın avantajlarıActionScript 3.0, önceki ActionScript sürümlerinin komut dosyası oluşturma yeteneklerinden çok daha fazlasınısunar. Büyük veri kümeleri ve nesne tabanlı, yeniden kullanılabilir kod tabanları ile oldukça karmaşık uygulamalarınoluşturulmasını kolaylaştırmak üzere tasarlanmıştır. ActionScript 3.0, Adobe Flash Player uygulamasında çalışaniçerik için gerekmese de, yalnızca yeni sanal makine olan AVM2 ile kullanılabilen performans artışına bir kapı açar.ActionScript 3.0 kodu, eski ActionScript kodundan on kata kadar daha hızlı çalışabilir.Eski ActionScript Virtual Machine sürümü olan AVM1, ActionScript 1.0 ve ActionScript 2.0 kodunu çalıştırır.Varolan ve eski içerikle geriye doğru uyumluluk sağlamak için Flash Player 9 ve 10 tarafından AVM1 desteklenir. Dahafazla bilgi için, bkz. “Önceki sürümlerle uyumluluk” sayfa 7.
    • 5ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript 3.0a girişActionScript 3.0daki yeniliklerActionScript 3.0, ActionScript programcılara tanıdık gelen birçok sınıf ve özellik içerse de, ActionScript 3.0 mimari vekavramsal açıdan önceki ActionScript sürümlerinden farklıdır. ActionScript 3.0daki geliştirmeler arasında, çekirdekdilin yeni özellikleri ve düşük düzeyli nesneler üzerinde daha yüksek denetim sağlayan gelişmiş Flash Player APIsi yeralır.Not: Adobe® AIR™ uygulamaları, Flash Player APIlerini de kullanabilir.Çekirdek dil özellikleriÇekirdek dil, programlama dilinin deyimler, ifadeler, koşullar, döngüler ve türler gibi temel bina bloklarını tanımlar.ActionScript 3.0, geliştirme işlemini hızlandıran birçok yeni özellik içerir.Çalışma zamanı istisnalarıActionScript 3.0, önceki ActionScript sürümlerinden daha çok hata koşulu bildirir. Yaygın hata koşulları için çalışmazamanı istisnaları kullanılarak hata ayıklama deneyimini geliştirir ve hataları daha güçlü şekilde işleyen uygulamalargeliştirmenizi sağlar. Çalışma zamanı hataları, kaynak dosya ve satır numarası bilgilerini ek açıklama olarak verenyığın izleri sağlayarak hızlı şekilde hataların yerini belirlemenize yardımcı olur.Çalışma zamanı türleriActionScript 2.0da tür ek açıklamaları birincil olarak geliştiriciye yardım sağlama amaçlıydı; çalışma zamanında tümdeğerler dinamik olarak türlenmiştir. ActionScript 3.0da, tür açıklamaları çalışma zamanında korunur ve birçok amaçiçin kullanılır. Flash Player ve Adobe AIR, çalışma zamanı, çalışma zamanı tür denetlemesi uygulayarak sistemin türgüvenliğini artırır. Tür bilgileri aynı zamanda yerel makine temsillerinde değişkenleri temsil etmek için de kullanılarakperformansı artırır ve bellek kullanımını azaltır.Mühürlenmiş sınıflarActionScript 3.0, mühürlenmiş sınıf kavramını getirmiştir. Mühürlenmiş bir sınıf, derleme zamanında tanımlanmışyalnızca sabit özellikler ve yöntemler kümesine sahiptir; bu sınıfa ek özellikler ve yöntemler eklenemez. Bu da dahakatı derleme zamanı denetlemesi sağlayarak daha güçlü programlar oluşmasına neden olur. Buna ek olarak, nesneörneklerinin her biri için dahili bir karma tablo gerektirmeyerek bellek kullanımını da azaltır. dynamic anahtarsözcüğünün kullanılmasıyla dinamik sınıflar da mümkündür. ActionScript 3.0daki tüm sınıflar varsayılan olarakmühürlenmiştir ancak dynamic anahtar sözcüğüyle bu sınıfların dinamik olduğu bildirilebilir.Yöntem kapanışıActionScript 3.0, yöntem kapanışının otomatik olarak orijinal nesne örneğini hatırlamasına olanak sağlar. Bu özellik,olay işlemesi için kullanışlıdır. ActionScript 2.0da, yöntem kapanışları hangi nesne örneğinden ayıklandıklarınıhatırlamaz ve bu da yöntem kapanışı çağrıldığında beklenmeyen davranış oluşmasına neden olur. mx.utils.Delegatesınıfı sık kullanılan bir geçici çözümdür ancak artık buna ihtiyaç kalmamıştır.XML için ECMAScript (E4X)ActionScript 3.0, en son ECMA-357 olarak standartlaştırılmış olan XML için ECMAScript (E4X) uygular. E4X,XMLin işlenmesi için doğal ve akıcı bir dil yapıları kümesi sunar. Geleneksel XML ayrıştırma APIlerinin tersine, E4Xile XML, dilin yerel bir veri türüymüş gibi hareket eder. E4X, ihtiyaç duyulan kod miktarını büyük ölçüde azaltarakXMLi işleyen uygulamaların geliştirilmesini kolaylaştırır. E4Xin ActionScript 3.0 uygulaması hakkında daha fazlabilgi almak için, bkz. “XML ile çalışma” sayfa 222.ECMA’nın E4X belirtimini görüntülemek için www.ecma-international.org adresine gidin.
    • 6ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript 3.0a girişNormal ifadelerActionScript 3.0, hızlı şekilde dizeleri arayabilmeniz ve işleyebilmeniz amacıyla normal ifadeler için yerel destek içerir.ECMAScript (ECMA-262) sürüm 3 dil belirtiminde belirtildiği şekilde ActionScript 3.0, normal ifadeler için destekuygular.Ad alanlarıAd alanları, bildirimlerin görünürlüğünü (public, private, protected) kontrol etmek için kullanılan gelenekselerişim belirticilerine benzer. Bunlar, seçtiğiniz adlara sahip olabilen özel erişim belirticileri olarak çalışır. Çakışmalarıönlemek için, ad alanlarında bir Universal Resource Identifier (URI) bulunur ve E4X ile çalıştığınızda XML adalanlarını temsil etmek için de ad alanları kullanılır.Yeni ilkel türlerActionScript 2.0, Number adında, çift kesinlikli ve kayan nokta sayısı olan tek bir sayısal türe sahiptir. ActionScript3.0, int ve uint türlerini içerir. int türü, ActionScriptin CPU için hızlı tam sayı matematik yeteneklerindenfaydalanmasına olanak sağlayan 32-bit işaretli bir tam sayıdır. int türü, döngü sayaçları ve tam sayıların kullanıldığıdeğişkenler için kullanışlıdır. uint türü, RGB renk değerleri, bayt sayıları ve daha fazlası için kullanışlı olan işaretsiz,32-bit tam sayı türüdür.Flash Player APIsinin özellikleriActionScript 3.0daki Flash Player APIleri, düşük bir düzeydeki nesneleri kontrol etmenize olanak sağlayan birçoksınıf içerir. Dil mimarisi, önceki sürümlere göre daha sezgisel olacak şekilde tasarlanmıştır. Burada ayrıntılı şekilde elealınacak çok fazla sayıda yeni sınıf olsa da, ilerleyen bölümlerde bazı önemli değişikliklere yer verilmiştir.Not: Adobe® AIR™ uygulamaları, Flash Player APIlerini de kullanabilir.DOM3 olay modeliBelge Nesnesi Modeli Düzey 3 olay modeli (DOM3), uygulama içindeki nesnelerin etkileşim ve iletişim kurarakdurumlarını koruyabilmesi ve değişikliğe yanıt vermesi için olay mesajları oluşturma ve işlemeye yönelik standart biryöntem sağlar. World Wide Web Consortium DOM Düzey 3 Olaylar Belirtiminden sonra düzenlenen bu model,önceki ActionScript sürümlerinde kullanılabilir olan olay sistemlerinden daha net ve daha etkili bir mekanizma sağlar.Olaylar ve hata olayları, flash.events paketinde bulunur. Flash bileşenleri çerçevesi, Flash Player APIsiyle aynı olaymodelini kullanır, bu nedenle olay sistemi tüm Flash platformunda birleştirilmiştir.Görüntüleme listesi APIsiFlash Player ve Adobe AIR görüntüleme listesine (uygulamadaki görsel öğeleri içeren ağaç) erişme APIsi, görsel ilkelöğelerle çalışmaya yönelik sınıfları içerir.Yeni Sprite sınıfı, hafif bir bina bloğu olup MovieClip sınıfına benzer ancak UI bileşenleri için temel sınıf olarak dahauygundur. Yeni Shape sınıfı ham vektör şekillerini temsil eder. Bu sınıflar new operatörüyle doğal olarak başlatılabilirve herhangi bir zamanda dinamik olarak yeniden üst öğeye sahip olabilir.Derinlik yönetimi şimdi otomatiktir ve Flash Player ve Adobe AIR uygulamalarında yerleşik olarak bulunur, böylecederinlik sayılarının atamasının oluşturulması gereksizdir. Nesnelerin z sırasının belirtilmesi ve yönetilmesi için yeniyöntemler sağlanır.
    • 7ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript 3.0a girişDinamik verileri ve içerikleri işlemeActionScript 3.0, uygulamanızda varlıkların ve verilerin yüklenmesi için tüm APIde sezgisel ve tutarlı olanmekanizmalar içerir. Yeni Loader sınıfı, SWF dosyalarının ve görüntü varlıklarının yüklenmesi için tek bir mekanizmave yüklenen içerikle ilgili ayrıntılı bilgilere erişme yolu sağlar. URLLoader sınıfı, veri tabanlı uygulamalarda metin veikili verilerin yüklenmesi için ayrı bir mekanizma sağlar. Socket sınıfı, sunucu soketlerine herhangi bir formatta ikiliverileri okuyup yazmak için bir araç sağlar.Düşük düzeyli veri erişimiÇeşitli APIler, önceden ActionScriptte asla kullanılabilir olmayan verilere düşük düzeyli erişim sağlar. URLLoadertarafından uygulanan URLStream sınıfı, indirilen veriler için, indirme sırasında verilere ham ikili veriler olarakerişilmesini sağlar. ByteArray sınıfı, ikili verilerle okumayı, yazmayı ve çalışmayı eniyileştirmenize olanak sağlar. YeniSound APIsi, SoundChannel ve SoundMixer sınıfları üzerinden ayrıntılı ses denetimi sağlar. Güvenlikle ilgilenen yeniAPIler, SWF dosyasının veya yüklenen içeriğin güvenlik ayrıcalıkları hakkında bilgi sağlayarak güvenlik hatalarınıdaha iyi işlemenize olanak tanır.Metinle çalışmaActionScript 3.0, tüm metinle ilgili APIler için bir flash.text paketi içerir. TextLineMetrics sınıfı, bir metin alanındakimetin satırı için ayrıntılı ölçütler sağlar; ActionScript 2.0daki TextFormat.getTextExtent() öğesinin yerini alır.TextField sınıfı, bir metin satırı veya bir metin satırındaki tek bir karakter hakkında belirli bilgiler sağlayabilen ilginçözellikte birçok yeni düşük düzeyli yöntemler içerir. Bu yöntemler arasında, bir karakterin sınırlama kutusunu temsileden dikdörtgeni döndüren getCharBoundaries(), belirtilen bir noktadaki karakterin dizinini döndürengetCharIndexAtPoint() ve bir paragraftaki birinci karakterin dizinini döndüren getFirstCharInParagraph()yer alır. Satır düzeyindeki yöntemler arasında, belirtilen bir metin satırındaki karakterlerin sayısını döndürengetLineLength() ve belirtilen satırın metnini döndüren getLineText() yer alır. Yeni bir Font sınıfı, SWFdosyalarındaki gömülü fontların yönetilmesi için araçlar sağlar.Önceki sürümlerle uyumlulukFlash Player her zamanki gibi, önceden yayınlanmış içerikle geriye doğru tam uyumluluk sağlar. Önceki Flash Playersürümlerinde çalışan tüm içerikler Flash Player 9 ve sonrasında da çalışır. Ancak Flash Player 9da ActionScript 3.0ınbulunması, eski içerik ile Flash Player 9da çalışan yeni içerik arasında birlikte çalışılabilirlik konusunda zorluklara yolaçabilir. Uyumluluk sorunları arasında şunlar yer alır:• Tek bir SWF dosyası, ActionScript 1.0 veya 2.0 kodunu ActionScript 3.0 koduyla birleştiremez.• ActionScript 3.0 kodu, ActionScript 1.0 veya 2.0da yazılmış bir SWF dosyasını yükleyebilir ancak SWF dosyasınındeğişkenlerine ve işlevlerine erişemez.• ActionScript 1.0 veya 2.0da yazılmış SWF dosyaları, ActionScript 3.0da yazılmış SWF dosyalarını yükleyemez. Buda, Flash 8 veya Flex Builder 1.5 ya da önceki sürümlerde yazılmış SWF dosyalarının ActionScript 3.0 SWFdosyalarını yükleyemediği anlamına gelir.Bu kuralın tek istisnası, ActionScript 2.0 SWF dosyası, düzeylerinden birine önceden herhangi bir şey yüklemediğisürece, ActionScript 2.0 SWF dosyasının bir ActionScript 3.0 SWF dosyasıyla kendisini değiştirebilmesidir.ActionScript 2.0 SWF dosyası, loadMovieNum() öğesine bir çağrı yapıp level parametresine 0 değerini ileterekbunu yapabilir.
    • 8ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript 3.0a giriş• Genelde, ActionScript 3.0da yazılmış SWF dosyalarıyla birlikte çalışacaksa, ActionScript 1.0 veya 2.0da yazılmışSWF dosyalarının alınması gerekir. Örneğin, ActionScript 2.0ı kullanarak bir ortam oynatıcısı oluşturduğunuzuvarsayın. Ortam oynatıcısı, ayrıca ActionScript 2.0da oluşturulmuş çeşitli içerikleri de yükler. ActionScript 3.0dayeni içerik oluşturup bu içeriği ortam oynatıcısına yükleyemezsiniz. Video oynatıcısını ActionScript 3.0a almanızgerekir.Ancak ActionScript 3.0da bir ortam oynatıcısı oluşturursanız, bu ortam oynatıcısı ActionScript 2.0 içeriğinizinbasit yüklemelerini gerçekleştirebilir.Aşağıdaki tablolarda, önceki Flash Player sürümlerinin yeni içerik yüklenmesi ve kod çalıştırılmasıyla ilgilisınırlamaları ve farklı ActionScript sürümlerinde yazılmış SWF dosyaları arasında çapraz komut dosyası oluşturmasınırlamaları özetlenmektedir.Aşağıdaki tabloda yer alan “Desteklenen işlevler”, Flash Player 9 veya sonrasında çalıştırılan içerikleri ifade eder. FlashPlayer 8 veya öncesinde çalışan içerikler yalnızca ActionScript 1.0 ve 2.0da yüklenebilir, görüntülenebilir,çalıştırılabilir ve bu içeriklerin çapraz komut dosyası oluşturulabilir.Desteklenen işlevler Flash Player 7 Flash Player 8 Flash Player 9 ve 10Şunlar için yayınlanmış SWF dosyalarınıyükleyebilir7 ve öncesi 8 ve öncesi 9 (veya 10) ve öncesiBu AVMyi içerir AVM1 AVM1 AVM1 ve AVM2Şu ActionScript sürümlerinde yazılmışSWFleri çalıştırır1.0 ve 2.0 1.0 ve 2.0 1.0 ve 2.0 ve 3.0Desteklenen işlevler ActionScript 1.0 ve 2.0da oluşturulaniçerikActionScript 3.0da oluşturulan içerikŞu sürümlerde oluşturulan içerik yüklenebilirve içerikteki kod çalıştırılabiliryalnızca ActionScript 1.0 ve 2.0 ActionScript 1.0, 2.0 ve ActionScript 3.0Şu sürümlerde oluşturulan içeriğin çaprazkomut dosyası oluşturulabiliryalnızcaActionScript1.0ve2.0(YerelBağlantıüzerinden ActionScript 3.0)Yerel Bağlantı üzerinden ActionScript 1.0 ve2.0ActionScript 3.0
    • 9Bölüm 3: ActionScript ile çalışmayabaşlamaBu bölüm, ActionScript programlamaya başlamanız için tasarlanmış olup bu kılavuzun geri kalanında karşılaşacağınızkavramları ve örnekleri anlamak için ihtiyaç duyacağınız arka planı size sağlar. ActionScriptte uygulanma şeklikapsamında açıklanan temel programlama kavramlarıyla başlayacağız. Ayrıca ActionScript uygulamasının organizeedilmesi ve oluşturulması temellerini de ele alacağız.Programlama temelleriActionScript bir programlama dili olduğundan, ilk önce birkaç genel bilgisayar programlama kavramını anlarsanız,ActionScripti öğrenmeniz kolaylaşacaktır.Bilgisayar programları ne yaparÖncelikle, bilgisayar programının ne olduğuna ve ne yaptığına dair kavramsal bir fikir edinilmesi yardımcı olacaktır.Bilgisayar programının iki yönü vardır:• Program, bilgisayarın gerçekleştirmesi için tasarlanmış talimatlar veya adımlar serisidir.• Her adım bazı bilgi veya verilerin işlenmesini içerir.Genel anlamda bilgisayar programı, bilgisayara verdiğiniz ve bilgisayar tarafından birer birer gerçekleştirilen adımadım talimatlar listesidir. Talimatların her birine deyim denir. Bu kılavuzda da göreceğiniz gibi, ActionScriptte herdeyim, sonunda bir noktalı virgül olacak şekilde yazılır.Temelde, bir programdaki talimatın yaptığı tüm şey, bilgisayarın belleğinde saklanan bazı veri bitlerini işlemektenibarettir. Basit bir örnek vermek gerekirse, bilgisayara iki sayı eklemesini ve sonucu belleğinde saklamasını talimatolarak verebilirsiniz. Daha karmaşık bir örnek vermek gerekirse, ekranda çizili bir dikdörtgen olduğunu ve budikdörtgeni başka bir yere taşımak için bir program yazmak istediğinizi varsayalım. Bilgisayar, dikdörtgenle ilgilibelirli bilgileri izler, örn. dikdörtgenin konumlandırıldığı x, y koordinatları, genişliği, uzunluğu, rengi, vb. Bu bilgibitlerinin her biri bilgisayarın belleğinde bir yerde saklanır. Dikdörtgeni farklı bir konuma taşıma programı, "xkoordinatını 200 olarak değiştir; y koordinatını 15 olarak değiştir" (başka bir deyişle, x ve y koordinatları içinkullanılacak yeni değerleri belirten) gibi adımlar içerecektir. Elbette bilgisayar bu sayıları gerçekten bilgisayarekranında görüntülenen görüntüye dönüştürmek için bu verilerle bir şeyler yapar; ancak şu an için bizi ilgilendirenayrıntı düzeyine göre, "ekrandaki dikdörtgeni taşıma" işleminin gerçekten bilgisayar belleğindeki veri bitlerinindeğiştirilmesiyle gerçekleştiğinin bilinmesi yeterlidir.Değişkenler ve sabitlerProgramlama temel olarak bilgisayar belleğindeki bilgilerin değiştirilmesini içerdiğinden, programda tek bir bilgiyitemsil etmenin bir yolunun olması gerekir. Değişken, bilgisayar belleğindeki bir değeri temsil eden addır. Değerleriişlemek için deyimler yazdığınızda, değerin yerine değişkenin adını yazarsınız; bilgisayar değişken adınıprogramınızda her gördüğünde, belleğine bakar ve orada bulduğu değeri kullanır. Örneğin, her biri bir sayı içeren,value1 ve value2 adında iki değişkeniniz varsa, bu iki sayıyı eklemek için şu deyimi yazabilirsiniz:value1 + value2
    • 10ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamaBilgisayar gerçekten adımları uygularken, her değişkendeki değerlere bakar ve bunları birbirine ekler.ActionScript 3.0da, bir değişken üç farklı bölümden oluşur:• Değişkenin adı• Değişkende saklanabilen veri türü• Bilgisayarın belleğinde saklanan gerçek değerBilgisayarın, değerin yer tutucusu olarak adı nasıl kullandığını açıkladık. Veri türü de önemlidir. ActionScriptte birdeğişken oluşturduğunuzda, bu değişkenin barındıracağı belirli veri türünü belirtirsiniz; bu noktadan sonra,programınızın talimatları değişkende yalnızca o veri türünü saklayabilir ve siz de o veri türüyle ilişkilendirilmiş belirliözellikleri kullanarak değeri işleyebilirsiniz. ActionScriptte, bir değişken oluşturmak için (değişkeni bildirmek dedenilebilir), var deyimini kullanırsınız:var value1:Number;Bu durumda, bilgisayara yalnızca Number verilerini ("Number", ActionScriptte tanımlı belirli bir veri türüdür)barındıracak value1 adında bir değişken oluşturması talimatını verdik. Değişkende hemen bir değeri desaklayabilirsiniz:var value2:Number = 17;Adobe Flash CS4 Professionalda bir değişken bildirmenin başka bir yolu vardır. Sahne Alanına bir film klibi sembolü,düğme sembolü veya metin alanı yerleştirdiğinizde, Özellik denetçisinde buna bir örnek adı verebilirsiniz. Flashuygulaması, sahne alanının arkasında örnek adıyla aynı ada sahip bir değişken oluşturur ve bu Sahne Alanı öğesiniifade etmek için ActionScript kodunuzda bu değişkeni kullanabilirsiniz. Böylece, örneğin Sahne Alanında bir filmklibi sembolünüz olursa ve buna rocketShip örnek adını verirseniz, ActionScript kodunuzda rocketShipdeğişkenini her kullandığınızda, aslında bu film klibini işliyor olursunuz.Sabit, bilgisayarın belleğinde belirli bir veri türüyle bir değeri temsil eden bir ad olması açısından değişkene çok benzer.Tek farkı, sabite bir ActionScript uygulaması sırasında yalnızca bir kere değer atanabilmesidir. Sabitin değeriatandıktan sonra tüm uygulamada bu değer aynı kalır. Sabit bildirme sözdizimi, değişken bildirme sözdizimiyleaynıdır, tek farkı, var anahtar sözcüğü yerine const anahtar sözcüğünün kullanılmasıdır:const SALES_TAX_RATE:Number = 0.07;Bir proje boyunca birden çok yerde kullanılan ve normal koşullarda değişmeyecek bir değeri tanımlamak için sabitkullanışlıdır. Değişmez değer yerine bir sabit kullanılması, kodunuzu daha okunaklı hale getirir. Örneğin, bir fiyatıSALES_TAX_RATE değeriyle çarpan bir kod satırının anlaşılması, fiyatı 0.07 değeriyle çarpan bir kod satırına göre dahakolaydır. Ayrıca, bir sabit tarafından tanımlanan değerin değişmesi gerekmiyorsa, projeniz boyunca o değeri temsiletmek için bir sabit kullanırsanız, sabit kodlu değişmez değerleri kullandığınızda yaptığınız gibi çeşitli yerlerde değerideğiştirmek yerine yalnızca bir yerde (sabit bildiriminde) değeri değiştirmeniz gerekir.Veri türleriActionScriptte, oluşturduğunuz değişkenlerin veri türü olarak kullanabileceğiniz birçok veri türü vardır. Bunlardanbazıları "basit" veya "temel" veri türleri olarak değerlendirilebilir:• Dize: bir ad veya kitabın bir bölümü gibi, metin değeri• Sayısal: ActionScript 3.0, sayısal veriler için üç özel veri türü içerir:• Sayı: kesirli veya kesirsiz sayılar da dahil olmak üzere herhangi bir sayısal değer• int: bir tam sayı (kesirsiz bir tam sayı)• uint: “işaretsiz” tam sayı, başka bir deyişle negatif olamayan bütün bir sayı
    • 11ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlama• Boolean: bir düğmenin etkin olup olmadığı veya iki değerin eşit olup olmadığı gibi, doğru veya yanlış değeriBasit veri türleri tek bir bilgiyi temsil eder: örneğin, tek bir sayı veya tek bir metin sırası Ancak, ActionScriptte tanımlıveri türlerinin çoğunluğu, birlikte gruplandırılabilen değerler kümesini temsil ettiğinden, karmaşık veriler olarakaçıklanabilir. Örneğin, Date veri türüne sahip bir değişken, tek bir değeri (tek bir zamanı) temsil eder. Ancak, bu değergerçekte birçok değer olarak temsil edilir: gün, ay, yıl, saat, dakika, saniye, vb. ve bunların her biri ayrı ayrı bir sayıdır.Böylece, biz tarihi tek bir değer olarak düşünürken (ve Date değişkenini oluşturarak tek bir değer olarakdeğerlendirebilirken), bilgisayar dahili olarak bunu birçok değerden oluşan bir grup olarak değerlendirir, bir arayagetirir ve tek bir tarihi tanımlar.Programcıların tanımladığı veri türlerinin yanı sıra, yerleşik veri türlerinin çoğu da karmaşık veri türleridir.Tanıyabileceğiniz karmaşık veri türlerinden bazıları şunlardır:• MovieClip: bir film klibi sembolü• TextField: dinamik bir alan veya girdi metni alanı• SimpleButton: bir düğme sembolü• Date: tek bir zaman (tarih ve saat) hakkındaki bilgiSınıf ve nesne sözcükleri genellikle veri türü için eşanlamlı olarak kullanılır. Sınıf, veri türünün tanımıdır, veri türününtüm nesneleri için bir şablon gibidir, örn. "Example veri türünün tüm değişkenleri bu özelliklere sahiptir: A, B ve C."söylemine benzer. Nesne ise sınıfın gerçek bir örneğidir; veri türü MovieClip olan bir değişken, MovieClip nesnesiolarak açıklanabilir. Aşağıda, aynı şeyi söylemenin birkaç farklı yolu verilmiştir:• myVariable değişkeninin veri türü Numberdır.• myVariable değişkeni bir Number örneğidir.• myVariable değişkeni bir Number nesnesidir.• myVariable değişkeni, Number sınıfının bir örneğidir.Nesnelerle çalışmaActionScript, nesne odaklı programlama dili olarak bilinir. Nesne odaklı programlama, bir programlama yaklaşımıolup nesneleri kullanarak bir programda kodu organize etme yolundan fazlasını ifade etmez.Daha önce bilgisayar programını, bilgisayarın gerçekleştirdiği bir adımlar ve talimatlar serisi olarak tanımladık. Budurumda kavramsal olarak bilgisayarı tek bir uzun talimatlar listesi olarak düşünebiliriz. Ancak, nesne odaklıprogramlamada, program talimatları farklı nesneler arasında bölünür—kod, işlev kümeleri olarak gruplandırılır,böylece ilgili işlev türleri veya ilgili bilgiler tek bir konteynerde bir arada gruplandırılır.Aslında, Flash uygulamasında sembollerle çalıştıysanız, nesnelerle de çalışmaya hazırsınız demektir. Bir film klibisembolü—örneğin bir dikdörtgen çizimi—tanımladığınızı ve bunun bir kopyasını Sahne Alanına yerleştirdiğinizivarsayın. Bu film klibi aynı zamanda (gerçekten) ActionScriptte bir nesnedir; MovieClip sınıfının bir örneğidir.Film klibinin değiştirebileceğiniz çeşitli özellikleri vardır. Örneğin, seçili olduğunda, Özellik denetçisindedeğiştirebileceğiniz değerler vardır, örn. x koordinatı, genişlik veya alfa (saydamlık) değiştirme ya da gölge filtresiekleme gibi çeşitli renk ayarlamaları. Dikdörtgeni döndürmek için Serbest Dönüştürme aracının kullanılması gibi,diğer Flash araçları daha fazla değişiklik yapmanıza olanak sağlar. Flash geliştirme ortamında bir film klibi sembolünüdeğiştirmek için kullanabildiğiniz tüm bu şeyleri aynı zamanda MovieClip nesnesi adındaki tek bir kümede bir arayagetirilmiş verileri değiştirerek ActionScriptte de yapabilirsiniz.
    • 12ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamaActionScript nesne odaklı programlamada, herhangi bir sınıfın içerebileceği üç özellik türü vardır:• Özellikler• Yöntemler• OlaylarBu öğeler, program tarafından kullanılan verileri yönetmek ve hangi eylemlerin ne sırada yapılacağına karar vermekiçin birlikte kullanılır.ÖzelliklerÖzellik, bir nesnede kümelenmiş olan verilerden birini temsil eder. Bir şarkı nesnesi, artist ve title adındaözelliklere sahip olabilir; MovieClip sınıfı rotation, x, width ve alpha gibi özelliklere sahiptir. Tek tek değişkenlergibi özelliklerle çalışabilirsiniz—aslında özellikleri bir nesnede bulunan "alt" değişkenler olarak düşünebilirsiniz.Aşağıda, özellik kullanan birkaç ActionScript kodu örnekleri verilmiştir. Bu kod satırı, square adındaki MovieClipöğesini 100 piksel x koordinatına taşır:square.x = 100;Bu kod, triangle MovieClip öğesinin dönüşüyle eşleşecek şekilde square MovieClip öğesinin dönmesini sağlamakiçin rotation özelliğini kullanır:square.rotation = triangle.rotation;Bu kod, square MovieClip öğesinin eski halinden bir buçuk kat daha geniş olmasını sağlayacak şekilde yatay ölçeğinideğiştirir:square.scaleX = 1.5;Ortak yapıya dikkat edin: nesnenin adı sırayla nesnenin adını (square, triangle), bir nokta işaretini (.) ve özelliğinadını (x, rotation, scaleX) içerir. Nokta operatörü olarak da bilinen nokta işareti, bir nesnenin alt öğelerinden birineerişmekte olduğunu belirtmek için kullanılır. Tüm yapı olduğu gibi "değişken adı-nokta-özellik adı", tek bir değişkengibi, bilgisayar belleğindeki tek bir değerin adı olarak kullanılır.YöntemlerYöntem, bir nesne tarafından gerçekleştirilebilen bir eylemdir. Örneğin, Flash uygulamasında, zaman çizelgesindebirçok anahtar kare ve animasyonla bir film klibi sembolü oluşturduysanız, bu film klibi oynatılabilir veyadurdurulabilir ya da bu film klibine oynatma kafasını belirli bir kareye taşıması bildirilebilir.Bu kod, shortFilm adındaki MovieClip öğesine oynatmayı başlatmasını bildirir:shortFilm.play();Bu satır, shortFilm adındaki MovieClip öğesinin oynatmayı durdurmasını sağlar (oynatma kafası, videoduraklatılmış gibi yerinde durdurulur):shortFilm.stop();Bu kod, shortFilm adındaki MovieClip öğesinin oynatma kafasını Kare 1e taşıyıp oynatmayı durdurmasını sağlar(videoyu geri sarmak gibi):shortFilm.gotoAndStop(1);
    • 13ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamaGördüğünüz gibi, yöntemlere de, tıpkı özellikler gibi sırayla nesnenin adı (bir değişken), nokta işareti, yöntemin adıve parantez işaretleri yazılarak erişilebilir. Parantezler, yöntemi çağırdığınızı veya başka bir deyişle nesneye o eylemigerçekleştirmesini bildirdiğinizi belirtmenin yoludur. Bazen eylemi gerçekleştirmek için gerekli olan ek bilgileriiletmenin bir yolu olarak, değerler (veya değişkenler) parantez içine yerleştirilir. Bu değerler, yöntem parametreleriolarak bilinir. Örneğin, gotoAndStop() yönteminin hangi kareye gideceğini bilmesi gerekir, bu nedenle parantez içintek bir parametre olması gereklidir. play() ve stop() gibi diğer yöntemler kendinden açıklayıcıdır ve bu nedenle defazladan bilgi gerektirmez. Ancak yine de parantez içinde yazılır.Özelliklerden (ve değişkenlerden) farklı olarak, yöntemler değer yer tutucuları olarak kullanılmaz. Ancak bazıyöntemler hesaplamalar gerçekleştirebilir ve bir değişken olarak kullanılabilecek bir sonuç döndürebilir. Örneğin,Number sınıfının toString() yöntemi, sayısal değeri metin olarak temsil edilen haline dönüştürür:var numericData:Number = 9;var textData:String = numericData.toString();Örneğin, Bir Number değişkeninin değerini ekranda bir metin alanında görüntülemek isterseniz, toString()yöntemini kullanırsınız. TextField sınıfının text özelliği (ekranda görüntülenen gerçek metin içeriğini temsil eder),String olarak tanımlanır, bu nedenle yalnızca metin değerlerini içerebilir. Bu kod satırı, numericData değişkenindekisayısal değeri metne dönüştürür ve sonra bu metnin ekranda calculatorDisplay adındaki TextField nesnesindegösterilmesini sağlar:calculatorDisplay.text = numericData.toString();OlaylarBilgisayar programını, bilgisayarın adım adım gerçekleştirdiği bir talimatlar dizisi olarak açıklamıştık. Bazı basitbilgisayar programları, bilgisayarın gerçekleştirdiği ve programı sona erdiren birkaç adımdan fazlasını içermez.Ancak, ActionScript programları sürekli çalışacak ve kullanıcı girdisinin veya başka şeylerin oluşmasını bekleyecekşekilde tasarlanmıştır. Olaylar, bilgisayarın hangi talimatları ne zaman gerçekleştireceğini belirleyen mekanizmadır.Temel olarak olaylar, ActionScriptin farkında olduğu ve yanıt verdiği, gerçekleşen şeylerdir. Kullanıcının bir düğmeyitıklatması veya klavyedeki bir tuşa basması gibi birçok olay kullanıcı etkileşimiyle ilgilidir ancak başka tür olaylar davardır. Örneğin, harici bir görüntüyü yüklemek için ActionScripti kullanırsanız, görüntü yüklemesinin bittiğini sizebildiren bir olay vardır. Temelde, bir ActionScript programı çalışırken, Adobe Flash Player ve Adobe AIR durup belirlişeylerin gerçekleşmesini bekler ve bu şeyler gerçekleştiğinde, bu olaylar için belirttiğiniz belirli bir ActionScriptkodunu çalıştırır.Temel olay işlemeBelirli bir olaya yanıt olarak gerçekleştirilmesi gereken belirli eylemleri belirtme tekniği, olay işleme olarak bilinir. Olayişleme gerçekleştirmek için ActionScript kodu yazarken tanımlamanız gereken üç önemli öğe vardır:• Olay kaynağı: Olayın gerçekleşeceği nesne hangisidir? Örneğin, hangi düğme tıklatılacak veya hangi Loader nesnesigörüntüyü yüklüyor? Olay kaynağı, Flash Player veya AIR tarafından olayın hedeflendiği (başka bir deyişle olayıngerçekten gerçekleştiği) nesne olduğundan, ayrıca olay hedefi olarak da bilinir.• Olay: Gerçekleşecek şey, yanıt vermek istediğiniz şey nedir? Birçok nesne çok sayıda olayı tetiklediğinden bununtanımlanması önemlidir.• Yanıt: Olay gerçekleştiğinde hangi adımların gerçekleştirilmesini istiyorsunuz?Olayları işlemek için her ActionScript kodu yazdığınızda, kodda bu üç öğe yer alır ve kod bu temel yapıya uyar (kalınöğeler, belirli durumunuz için dolduracağınız yer tutuculardır):
    • 14ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamafunction eventResponse(eventObject:EventType):void{// Actions performed in response to the event go here.}eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);Bu kod iki şey gerçekleştirir. İlk olarak, olaya yanıt olarak gerçekleştirilmesini istediğiniz eylemleri belirtmenin bir yoluolan bir işlevi tanımlar. Daha sonra, işlevin belirtilen olaya abone olmasının sonucu olarak bu, kaynak nesneninaddEventListener() yöntemini çağırır, böylece olay gerçekleştiğinde işlevin eylemleri gerçekleştirilir. Bu parçalarınher birini daha ayrıntılı şekilde ele alacağız.İşlev, eylemleri gerçekleştirmek üzere kısayol adı gibi tek bir ad ile eylemleri bir arada gruplandırmanız için bir yolsağlar. İşlev, bir yönteme benzer, tek farkı, işlevin belirli bir sınıfla ilişkilendirilmek zorunda olmamasıdır (aslındayöntem, belirli bir sınıfla ilişkilendirilmiş bir işlev olarak tanımlanabilir). Olay işleme için bir işlev oluştururken, işlevinadını seçmeniz gerekir (bu durumda eventResponse adında). Ayrıca tek bir parametre belirmeniz gerekir (bu örnekteeventObject adında). İşlev parametresinin belirtilmesi bir değişkenin belirtilmesine benzer, bu nedenleparametrenin veri türünü de belirtmeniz gerekir. (Bu örnekte, EventType parametrenin veri türüdür.)Dinlemek istediğiniz her olay türünün kendisiyle ilişkilendirilmiş bir ActionScript sınıfı vardır. İşlev parametresi içinbelirttiğiniz veri türü her zaman yanıt vermek istediğiniz belirli bir olayın ilişkilendirilmiş sınıfıdır. Örneğin, clickolayı (kullanıcı fareyle bir öğeyi tıklattığında tetiklenir), MouseEvent sınıfıyla ilişkilendirilir. click olayı için birdinleyici işlevi yazmak üzere, MouseEvent veri türüne sahip bir parametreyle dinleyici işlevini tanımlarsınız. Sonolarak, açma ve kapatma küme ayraçları arasına ({ ... }), olay gerçekleştiğinde bilgisayarın uygulamasını istediğiniztalimatları yazarsınız.Olay işleme işlevini yazdıktan sonra, olay kaynağı nesnesine (olayın gerçekleştiği nesne—örneğin, düğme) olaygerçekleştiğinde işlevinizin çağrılmasını istediğinizi bildirmeniz gerekir. O nesnenin addEventListener()yöntemini çağırarak bunu yaparsınız (olaylara sahip tüm nesneler aynı zamanda addEventListener() yöntemine desahiptir). addEventListener() yöntemi iki parametre alır:• İlk olarak, yanıt vermek istediğiniz belirli olayın adı. Yine her olay belirli bir sınıfa bağlıdır ve bu sınıfın her olayiçin önceden tanımlı özel bir değeri olur—bu, birinci parametre için kullanmanız gereken olayın kendi benzersizadına benzer.• İkinci olarak, olay yanıtı işlevinizin adı. İşlev adının parametre olarak iletildiğinde parantez olmadan yazıldığınıunutmayın.Olay işleme işlemini incelemeAşağıda, bir olay dinleyicisi oluşturduğunuzda gerçekleşen işlemin adım adım bir açıklaması yer almaktadır. Budurumda, myButton adındaki bir nesne tıklatıldığında çağrılan bir dinleyici işlevinin oluşturulması örneği yeralmaktadır.Programcı tarafından yazılan gerçek kod şu şekildedir:function eventResponse(event:MouseEvent):void{// Actions performed in response to the event go here.}myButton.addEventListener(MouseEvent.CLICK, eventResponse);
    • 15ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamaFlash Playerda çalışırken bu kodun gerçekten çalışma şekli şöyledir. (Bu davranış Adobe AIR için de aynıdır):1 SWF dosyası yüklendiğinde, Flash Player, eventResponse() adında bir işlevin olduğunu not eder.2 Daha sonra Flash Player, kodu (daha net olmak gerekirse, işlevde olmayan kod satırlarını) çalıştırır. Bu durumdayalnızca bir kod satırı vardır: Olay kaynağı nesnesinde (myButton adında) addEventListener() yönteminiçağırma ve parametre olarak eventResponse işlevini iletme.a Dahili olarak myButton öğesi, olaylarının her birini dinleyen işlevlerin bir listesini içerir, böyleceaddEventListener() yöntemi çağrıldığında, myButton öğesi olay dinleyicileri listesinde eventResponse()işlevini saklar.
    • 16ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlama3 Bir noktada kullanıcı myButton nesnesini tıklatarak click olayını tetikler (kodda MouseEvent.CLICK olaraktanımlanmıştır).Bu noktada şunlar gerçekleşir:a Flash Player bir nesneyi, söz konusu olayla ilişkilendirilmiş sınıfın bir örneğini (bu örnekte MouseEvent)oluşturur. Birçok olay için bu Event sınıfının bir örneği olacaktır; fare olayları için MouseEvent örneği olurkendiğer olaylar için o olayla ilişkilendirilmiş sınıfın bir örneği olur. Oluşturulan nesne olay nesnesi olarak bilinirve gerçekleşen olayla ilgili belirli bilgiler içerir: ne tür olay olduğu, nerede gerçekleştiği ve varsa diğer olaya özgübilgiler.b Daha sonra Flash Player, myButton tarafından saklanan olay dinleyicileri listesine bakar. Birer birer buişlevlerde dolaşarak işlevlerin her birini çağırır ve olay nesnesini parametre olarak işleve iletir.eventResponse() işlevi, myButton öğesinin dinleyicilerinden biri olduğundan, bu işlemin bir parçası olarakFlash Player uygulaması eventResponse() işlevini çağırır.
    • 17ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamac eventResponse() işlevi çağrıldığında, o işlevdeki kod çalıştırılır, böylece belirttiğiniz eylemler gerçekleştirilir.Olay işleme örnekleriOrtak olay öğelerinden bazıları ve olay işleme kodu yazılırken kullanılabilen olası değişimler hakkında size fikirvermesi için birkaç tane daha somut olay örnekleri şunlardır:• Geçerli film klibini oynatmaya başlamak için bir düğmeyi tıklatma. Aşağıdaki örnekte, playButton düğmeninörnek adı ve this öğesi de "geçerli nesne" anlamına gelen özel bir addır:this.stop();function playMovie(event:MouseEvent):void{this.play();}playButton.addEventListener(MouseEvent.CLICK, playMovie);• Metin alanındaki yazıyı algılama. Bu örnekte, entryText bir girdi metni alanı ve outputText ise bir dinamikmetin alanıdır:function updateOutput(event:TextEvent):void{var pressedKey:String = event.text;outputText.text = "You typed: " + pressedKey;}entryText.addEventListener(TextEvent.TEXT_INPUT, updateOutput);• URLye gitmek için bir düğmeyi tıklatma. Bu durumda, linkButton düğmenin örnek adıdır:function gotoAdobeSite(event:MouseEvent):void{var adobeURL:URLRequest = new URLRequest("http://www.adobe.com/");navigateToURL(adobeURL);}linkButton.addEventListener(MouseEvent.CLICK, gotoAdobeSite);
    • 18ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamaNesne örnekleri oluşturmaElbette ActionScriptte bir nesneyi kullanabilmeniz için öncelikle nesnenin varolması gerekir. Nesne oluşturmaişleminin bir bölümünü değişkenin bildirilmesi oluşturur; ancak bir değişken belirtildiğinde, bilgisayarın belleğindeboş bir yer oluşturulur. Değişkeni kullanmadan veya işlemeden önce, değişkene gerçek bir değer atamanız—başka birdeyişle bir nesne oluşturup bu nesneyi değişkende saklamanız—gerekir. Nesne oluşturma işlemi, nesneyi başlatmak—başka bir deyişle, belirli bir sınıfın örneğini oluşturmak olarak bilinir.Nesne örneği oluşturmanın basit bir yolunda ActionScript kullanılmaz. Flashta Sahne Alanına bir film klibi sembolü,düğme sembolü veya metin alanı yerleştirdiğinizde ve Özellik denetçisinde buna bir örnek adı atadığınızda, Flashotomatik olarak o örnek adıyla bir değişken bildirir ve bir nesne örneği oluşturup bu nesneyi değişkende saklar. Aynışekilde Adobe Flex Builderda, MXML uygulamasında bir bileşen oluşturup (bir MXML etiketini kodlayarak veyaTasarım modunda düzenleyiciye bileşeni yerleştirerek) bu bileşene bir kimlik atadığınızda (MXML işaretlemesinde yada Flex Özellikleri görünümünde), bu kimlik ActionScript değişkeninin adı olur ve bileşenin bir örneği oluşturulupdeğişkende saklanır.Ancak her zaman bir nesneyi görsel olarak oluşturmak istemezsiniz. Yalnızca ActionScripti kullanarak nesneörnekleri oluşturabilmenin birçok yolu vardır. İlk olarak, birçok ActionScript veri türüyle, bir değişmez ifade(doğrudan ActionScript koduna yazılan bir değer) kullanarak bir örnek oluşturabilirsiniz. Aşağıda bazı örneklere yerverilmiştir:• Değişmez sayısal değer (doğrudan sayı girilir):var someNumber:Number = 17.239;var someNegativeInteger:int = -53;var someUint:uint = 22;• Değişmez String değeri (metin tırnak işareti içine alınır):var firstName:String = "George";var soliloquy:String = "To be or not to be, that is the question...";• Değişmez Boolean değeri (true veya false değişmez değerleri kullanılır):var niceWeather:Boolean = true;var playingOutside:Boolean = false;• Değişmez Array değeri (virgülle ayrılmış değerler listesi köşeli ayraç içine alınır):var seasons:Array = ["spring", "summer", "autumn", "winter"];• Değişmez XML değeri (doğrudan XML girilir):var employee:XML = <employee><firstName>Harold</firstName><lastName>Webster</lastName></employee>;ActionScript ayrıca Array, RegExp, Object ve Function veri türleri için değişmez ifadeleri de tanımlar. Bu sınıflarlailgili ayrıntılar için, bkz. “Dizilerle çalışma” sayfa 152, “Normal ifadeler kullanma” sayfa 202 ve “Object veri türü”sayfa 58.Diğer veri türleri için, bir nesne örneği oluşturmak amacıyla şu şekilde sınıf adıyla new operatörünü kullanırsınız:var raceCar:MovieClip = new MovieClip();var birthday:Date = new Date(2006, 7, 9);new operatörü kullanılarak nesne oluşturulması genellikle "sınıfın yapıcısını çağırma" olarak ifade edilir. Yapıcı, birsınıf örneği oluşturma işleminin parçası olarak çağrılan özel bir yöntemdir. Bu şekilde bir örnek oluşturduğunuzda,sınıf adından sonra parantez koyduğunuza ve bazen parametre değerleri belirttiğinize (yöntem çağırırken deyaptığınız iki şey) dikkat edin.
    • 19ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamaDeğişmez bir ifade kullanarak örnekler oluşturmanıza olanak sağlayan bu veri türleri için de bir nesne örneğioluşturmak üzere new operatörünü kullanabilirsiniz. Örneğin, bu iki kod satırı tamamen aynı şeyi yapar:var someNumber:Number = 6.33;var someNumber:Number = new Number(6.33);Nesne oluşturmanın new ClassName() yolunun bilinmesi önemlidir. Görsel temsili olmayan (dolayısıyla Flash SahneAlanına bir öğe yerleştirilerek veya Flex Builder’ın MXML düzenleyicisinin Tasarım moduyla oluşturulamayan)herhangi bir ActionScript veri türünde örnek oluşturmanız gerekirse, new operatörünü kullanarak doğrudanActionScriptte nesneyi oluşturup bunu yapabilirsiniz.Özellikle de Flashta new operatörü ayrıca Kütüphanede tanımlanmış ancak Sahne Alanına yerleştirilmeyen bir filmklibi sembolü örneği oluşturmak için de kullanılabilir. Bununla ilgili daha fazla bilgi için, bkz. “ActionScript ileMovieClip nesneleri oluşturma” sayfa 402.Ortak program öğeleriDeğişkenleri bildirme, nesne örnekleri oluşturma ve özellik ve yöntemlerini kullanarak nesneleri işlemeye ek olarak,bir ActionScript programı oluşturmak için kullandığınız başka birkaç bina bloğu daha vardır.OperatörlerOperatörler, hesaplamaları gerçekleştirmek için kullanılan özel sembollerdir (veya rastgele sözcüklerdir). Bunlar dahaçok matematik işlemleri için kullanılır ve değerleri birbiriyle karşılaştırırken de kullanılabilir. Genel bir kural olarak,bir operatör bir veya birkaç değer kullanır ve tek bir sonuç "üretir". Örneğin:• Toplama operatörü (+), iki değerini birbirine ekleyerek tek bir sayı ortaya çıkarır:var sum:Number = 23 + 32;• Çarpma operatörü (*), bir değeri diğeriyle çarparak tek bir sayı ortaya çıkarır:var energy:Number = mass * speedOfLight * speedOfLight;• Eşitlik operatörü (==), iki değerin eşit olup olmadığını görmek için iki değeri karşılaştırarak tek bir doğru veyayanlış (Boolean) değerini ortaya çıkarır:if (dayOfWeek == "Wednesday"){takeOutTrash();}Burada gösterildiği gibi, eşitlik operatörü ve diğer "karşılaştırma" operatörleri, belirli talimatların uygulanıpuygulanmayacağını belirlemek için en yayın şekilde if deyimiyle birlikte kullanılır.Operatörlerin kullanımıyla ilgili daha fazla ayrıntı ve örnekler için bkz. “Operatörler” sayfa 68.YorumlarActionScript yazarken belki de belirli kod satırlarının nasıl çalıştığını ve neden bu seçimi yaptığınızı açıklayacakşekilde genellikle kendinize not bırakmak istersiniz. Kod yorumları, bilgisayarınızın kodunuzda yoksayması gerekenmetinleri yazmak için kullanabileceğiniz bir araçtır. ActionScript, iki tür yorum içerir:• Tek satırlı yorum: Tek satırlı yorum, bir satırın herhangi bir yerine iki eğik çizgi yerleştirilerek belirlenir. Eğikçizgilerden satırın sonuna kadar olan her şey bilgisayar tarafından yoksayılır:
    • 20ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlama// This is a comment; its ignored by the computer.var age:Number = 10; // Set the age to 10 by default.• Çok satırlı yorum: Çok satırlı yorum, bir yorum başlatma işaretçisini (/*), ardından yorum içeriğini ve sonra dayorum bitirme işaretçisini (*/) içerir. Yorumun kaç satır genişlediğine bakılmaksızın, başlatma ve bitirmeişaretçileri arasındaki her şey bilgisayar tarafından yoksayılır:/*This might be a really long description, perhaps describing whata particular function is used for or explaining a section of code.In any case, these lines are all ignored by the computer.*/Yorumların başka bir yaygın kullanım amacı da kodun bir veya birkaç satırını geçici olarak "devre dışı bırakmaktır"—örneğin, bir şeyi yapmanın başka bir yolunu deniyorsanız veya belirli bir ActionScript kodunun neden beklediğinizşekilde çalışmadığını anlamaya çalışıyorsanız.Akış denetimiBir programda birçok defa belirli eylemleri yinelemek, yalnızca belirli eylemleri gerçekleştirirken diğer eylemlerigerçekleştirmemek, belirli koşullara bağlı olarak alternatif eylemleri uygulamak, vb. istersiniz. Akış denetimi, hangieylemlerin gerçekleştirileceğiyle ilgili denetimdir. ActionScriptte birçok kullanılabilir akış denetimi öğesi türü vardır.• İşlevler: İşlevler kısayollara benzer—tek bir ad altında bir eylemler dizisini gruplandırmanın bir yolunu sağlar vehesaplamaları gerçekleştirmek için kullanılabilir. İşlevler özellikle olayları işlemede önemlidir ancak talimatlardizisini gruplandırmak için genel bir araç olarak da kullanılabilir. İşlevlerle ilgili daha fazla bilgi için, bkz. “İşlevler”sayfa 78.• Döngüler: Döngü yapıları, bilgisayarın belirli sayıda veya bazı koşullar değişinceye kadar gerçekleştireceği birtalimatlar dizisi belirlemenize olanak sağlar. Döngüler genellikle bilgisayar döngüde her çalıştığında değeri değişenbir değişkeni kullanarak birçok ilgili öğeyi işlemek için kullanılır. Döngülerle ilgili daha fazla bilgi için, bkz.“Döngü” sayfa 75.• Koşul deyimleri: Koşul deyimleri, belirli koşullarda gerçekleştirilen belirli talimatları belirlemenin veya farklıkoşullar için alternatif talimatlar dizisi sağlamanın bir yolunu sağlar. En yaygın koşul deyimi türü if deyimidir. ifdeyimi, parantezleri içindeki bir değeri veya ifadeyi kontrol eder. Değer true olursa, küme ayraçları içindeki kodsatırları gerçekleştirilir; aksi takdirde bunlar yoksayılır. Örneğin:if (age < 20){// show special teenager-targeted content}if deyiminin eşi olan else deyimi, koşul true olmadığında gerçekleştirilecek alternatif talimatları belirlemenizeolanak sağlar:if (username == "admin"){// do some administrator-only things, like showing extra options}else{// do some non-administrator things}Koşul deyimleri hakkında daha fazla bilgi almak için, bkz. “Koşullar” sayfa 73.
    • 21ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamaÖrnek: Animasyon portföy parçasıBu örnek, ActionScript bitlerini tam, ya da ActionScript yönünden ağır bir uygulamada nasıl bir araya getirebileceğinigörmeniz için size ilk fırsatı sunmak üzere tasarlanmıştır. Animasyon portföy parçası, varolan bir doğrusalanimasyonu (örneğin, istemci için oluşturulan bir parça) alıp bu animasyonu birleştirmek için uygun olan bazı küçüketkileşimli öğeleri çevrimiçi bir portföye nasıl ekleyebileceğinizi gösteren bir örnektir. Animasyona ekleyeceğimizetkileşimli davranış, izleyenin tıklatabileceği iki düğmeyi içerir: bu düğmelerden biri animasyonu başlatmak ve biri deayrı bir URLye (örn. portföy menüsü veya yazarın ana sayfası) gitmek içindir.Bu parçayı oluşturma işlemi şu ana bölümlere ayrılabilir:1 ActionScript ve etkileşimli öğeler eklemek için FLA dosyasını hazırlama.2 Düğme oluşturma ve ekleme.3 ActionScript kodu yazma.4 Uygulamayı test etme.Etkileşim eklemeye hazırlamaAnimasyonumuza etkileşimli öğeler ekleyebilmemiz için, öncelikle yeni içeriğimizin ekleneceği bazı yerleroluşturularak FLA dosyasının ayarlanması yardımcı olacaktır. Bu işlem kapsamında, Sahne Alanında düğmelerinyerleştirilebileceği gerçek alanın oluşturulması ve FLA dosyasında farklı öğeleri ayrı tutmak için "boşluk"oluşturulması yer alır.Etkileşimli öğeler eklemek üzere FLAnızı ayarlamak için:1 Etkileşim ekleyeceğiniz doğrusal bir animasyonunuz yoksa, tek ara hareket veya şekil arası gibi tek bir animasyonluyeni bir FLA dosyası oluşturun. Aksi takdirde, projede sergilediğiniz animasyonu içeren FLA dosyasını açın ve yenibir çalışma dosyası oluşturmak için bu FLA dosyasını yeni bir adla kaydedin.2 İki düğmenin (biri animasyonu başlatmak ve biri de yazar portföyüne ya da ana sayfaya bağlanmak için) ekranınneresinde görüntülenmesini istediğinize karar verin. Gerekirse, bu yeni içerik için Sahne Alanında bazı boşluklarıtemizleyin veya Sahne Alanına bazı boşluklar ekleyin. Animasyonda yoksa, birinci karede bir karşılama ekranıoluşturmak isteyebilirsiniz (büyük ihtimalle Kare 2 veya sonrasında başlatılması için animasyonu kaydırmakistersiniz).3 Zaman Çizelgesinde diğer katmanların yukarısına yeni bir katman ekleyin ve bunu düğmeler olarak yenidenadlandırın. Bu, düğmeleri ekleyeceğiniz katman olacaktır.4 Düğmeler katmanının yukarısına yeni bir katman ekleyin ve bu katmana eylemler adını verin. Burası,uygulamanıza ActionScript kodunu ekleyeceğiniz yer olacaktır.Düğme oluşturma ve eklemeDaha sonra, etkileşimli uygulamamızın merkezini oluşturacak düğmeleri gerçek anlamda oluşturupkonumlandırmamız gerekecektir.Düğmeleri oluşturup FLA dosyasına eklemek için:1 Çizim araçlarını kullanarak, düğmeler katmanındaki birinci düğmenizin ("oynat" düğmesi) görsel görünümünüoluşturun. Örneğin, en üst kısmında metnin yer aldığı yatay bir oval çizebilirsiniz.2 Seçim aracını kullanarak tek bir düğmenin tüm grafik parçalarını seçin.3 Ana menüden Değiştir > Sembole Dönüştür seçeneklerini belirleyin.
    • 22ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlama4 İletişim kutusunda sembol türü olarak Düğme seçeneğini belirleyin ve sembole bir ad verip Tamamı tıklatın.5 Düğme seçili durumdayken, Özellik denetçisinde düğmeye playButton örnek adını verin.6 İzleyeni, yazarın ana sayfasına götürecek düğmeyi oluşturmak için 1 ile 5 arasındaki adımları yineleyin. Budüğmeye homeButton adını verin.Kod yazmaTümüne aynı yerden girilse de, bu uygulamanın ActionScript kodu, üç işlev kümesine ayrılabilir. Kodun yapmasıgereken üç şey şunlardır:• SWF dosyası yüklendiği anda (oynatma kafası Kare 1e girdiğinde) oynatma kafasını durdurma.• Kullanıcı oynatma düğmesini tıklattığında SWF dosyasının oynatılmaya başlaması için bir olayı dinleme.• Kullanıcı yazarın ana sayfası düğmesini tıklattığında tarayıcıyı uygun URLye göndermek için bir olayı dinleme.Kare 1e girdiğinde oynatma kafasını durdurmak için kod oluşturma:1 Eylemler katmanının Kare 1inde anahtar kareyi seçme.2 Eylemler panelini açmak için, ana menüden Pencere > Eylemler seçeneklerini belirleyin.3 Komut Dosyası bölmesinde şu kod girin:stop();Oynatma düğmesi tıklatıldığında animasyonu başlatmak üzere kod yazmak için:1 Önceki adımlarda girilen kodun sonuna iki boş satır ekleyin.2 Komut dosyasının alt kısmına şu kodu girin:function startMovie(event:MouseEvent):void{this.play();}Bu kod, startMovie() adında bir işlevi tanımlar. startMovie() çağrıldığında, ana zaman çizelgesinin oynatmayıbaşlatmasını sağlar.3 Önceki adımda eklenen kodun ardından gelen satıra bu kod satırını girin:playButton.addEventListener(MouseEvent.CLICK, startMovie);Bu kod satırı, playButton öğesinin click olayının dinleyicisi olarak startMovie() işlevini kaydeder. Başka birdeyişle, playButton adındaki düğme her tıklatıldığında startMovie() işlevinin çağrılmasını sağlar.Ana sayfa düğmesi tıklatıldığında tarayıcıyı bir URLye göndermek üzere kod yazmak için:1 Önceki adımlarda girilen kodun sonuna iki boş satır ekleyin.2 Komut dosyasının alt kısmına bu kodu girin:function gotoAuthorPage(event:MouseEvent):void{var targetURL:URLRequest = new URLRequest("http://example.com/");navigateToURL(targetURL);}Bu kod, gotoAuthorPage() adında bir işlevi tanımlar. Bu işlev öncelikle URL http://example.com/ adresini temsileden bir URLRequest örneği oluşturur ve daha sonra bu URLyi navigateToURL() işlevine ileterek kullanıcınıntarayıcısının bu URLyi açmasını sağlar.
    • 23ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlama3 Önceki adımda eklenen kodun ardından gelen satıra bu kod satırını girin:homeButton.addEventListener(MouseEvent.CLICK, gotoAuthorPage);Bu kod satırı, homeButton öğesinin click olayının dinleyicisi olarak gotoAuthorPage() işlevini kaydeder. Başkabir deyişle, homeButton adındaki düğme her tıklatıldığında gotoAuthorPage() işlevinin çağrılmasını sağlar.Uygulamayı test etmeBu noktada, uygulamanın tamamen işlevsel olması gerekir. Emin olmak için durumun böyle olup olmadığını testedelim.Uygulamayı test etmek için:1 Ana menüden, Kontrol Et > Filmi Test Et seçeneklerini belirleyin. Flash SWF dosyasını oluşturur ve bir FlashPlayer penceresinde açar.2 Beklediğiniz işlemi yaptıklarından emin olmak için her iki düğmeyi de deneyin.3 Düğmeler çalışmazsa, kontrol etmeniz gereken şeyler şunlardır:• Düğmelerin belirgin örnek adları var mı?• addEventListener() yöntemi çağrıları, düğmelerin örnek adlarıyla aynı adları mı kullanıyor?• addEventListener() yöntemi çağrılarında doğru olay adları kullanılıyor mu?• İşlevlerin her biri için doğru parametre belirtilmiş mi? (Her ikisi de MouseEvent veri türünde tek bir parametreiçermelidir.)Bunların tümü ve diğer olası hataların çoğu, Filmi Test Et komutunu seçtiğinizde veya düğmeyi tıklattığınızda birhata mesajı vermelidir. Derleyici hataları (Filmi Test Et seçeneğini ilk belirlediğinizde gerçekleşen hatalar) içinDerleyici Hataları paneline bakın ve çalışma zamanı hataları (SWF oynatılırken gerçekleşen hatalar, örn. birdüğmeyi tıklattığınızda) için Çıktı panelini kontrol edin.ActionScript ile uygulamalar oluşturmaUygulama oluşturmak için ActionScript yazma işlemi, sözdiziminin ve kullanacağınız sınıfların adlarınınbilinmesinden daha fazlasını içerir. Bu kılavuzdaki bilgilerin çoğu bu iki konuyla (sözdizimi ve ActionScript sınıflarınıkullanma) ilgili olarak verilmiş olsa da, ActionScript yazmak için hangi programların kullanılabileceği, ActionScriptkodunun nasıl organize edilip bir uygulamaya dahil edilebileceği ve ActionScript uygulamasının geliştirilmesindehangi adımları izlemeniz gerektiği gibi bazı bilgileri bilmek istersiniz.Kodunuzu organize etme seçenekleriBasit grafik animasyonlarından karmaşık istemci-sunucu işlemi işleme sistemlerine kadar her şeyi desteklemek içinActionScript 3.0ı kullanabilirsiniz. Oluşturduğunuz uygulama türüne bağlı olarak, projenize ActionScript dahiletmenin bu farklı yollarından birini veya birkaçını kullanmayı tercih edebilirsiniz.Flash zaman çizelgesinde karelere kod saklamaFlash geliştirme ortamında, zaman çizelgesindeki herhangi bir kareye ActionScript kodu ekleyebilirsiniz. Filmoynatılırken, oynatma kafası bu kareye girdiğinde bu kod çalıştırılır.
    • 24ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamaActionScript kodunun karelere yerleştirilmesi, Flash geliştirme aracında yerleşik olan uygulamalara davranışeklemenin basit bir yolunu sağlar. Ana zaman çizelgesinde herhangi bir kareye veya herhangi bir MovieClipsembolünün zaman çizelgesinde herhangi bir kareye kod ekleyebilirsiniz. Ancak bu esneklik bir maliyete de yol açar.Daha büyük uygulamalar oluşturduğunuzda, hangi karelerin hangi komut dosyalarını içerdiğinin takibini kaybetmekkolaylaşır. Bu, uygulamanın zamanla korunmasını güçleştirebilir.Geliştiricilerin çoğu, zaman çizelgesinin yalnızca birinci karesine veya Flash belgesindeki belirli bir katmana kodyerleştirerek Flash geliştirme aracında ActionScript kodunun organize edilmesini basitleştirir. Bu da Flash FLAdosyalarınızda kodun bulunmasını ve korunmasını kolaylaştırır. Ancak aynı kodu başka bir Flash projesindekullanmak için, kodu kopyalayıp yeni dosyaya yapıştırmanız gerekir.ActionScript kodunuzu gelecekte diğer Flash projelerinde kullanabilmek istiyorsanız, kodunuzu harici ActionScriptdosyalarında (.as uzantısına sahip metin dosyaları) saklamak istersiniz.ActionScript dosyalarında kod saklamaProjenizde önemli ActionScript kodu varsa, kodunuz en iyi şekilde ayrı ActionScript kaynak dosyalarında (.asuzantısına sahip metin dosyaları) organize edilir. ActionScript dosyası, uygulamanızda kullanılma amacına bağlıolarak, iki yoldan biri kullanılarak yapılandırılabilir.• Yapılandırılmamış ActionScript kodu: Doğrudan bir zaman çizelgesi komut dosyasına, MXML dosyasına, vb.yegirilmiş gibi yazılmış olan ve deyimleri ya da işlev tanımlarını içeren ActionScript kodu satırları.ActionScriptte include deyimi veya Adobe Flex MXMLde <mx:Script> etiketi kullanılarak bu şekilde yazılmışActionScripte erişilebilir. ActionScript include deyimi, harici bir ActionScript dosyasının içeriklerinin sankidoğrudan girilmiş gibi, belirli bir konuma ve bir komut dosyasındaki belirli bir kapsama eklenmesini sağlar. FlexMXML dilinde, <mx:Script> etiketi, uygulamadaki o noktada yüklenecek harici bir ActionScript dosyasınıtanımlayan bir kaynak niteliği belirmenize olanak sağlar. Örneğin, aşağıdaki etiket, Box.as adında harici birActionScript dosyası yükler:<mx:Script source="Box.as" />• ActionScript sınıfı tanımı: ActionScript sınıfının yöntemini ve özellik tanımlarını içeren bir tanımı.Bir sınıfı tanımladığınızda, herhangi bir yerleşik ActionScript sınıfıyla da olduğu gibi, sınıfın bir örneğini oluşturupözelliklerini, yöntemlerini ve olaylarını kullanarak sınıftaki ActionScript koduna erişebilirsiniz. Bunun için iki şeygereklidir:• ActionScript derleyicisinin nerede bulacağını bilmesi için, sınıfın tam adını belirtmek amacıyla importdeyimini kullanın. Örneğin, ActionScriptte MovieClip sınıfını kullanmak istiyorsanız, öncelikle paket ve sınıfda dahil olmak üzere, tam adını kullanarak bu sınıfı içe aktarmanız gerekir:import flash.display.MovieClip;Alternatif olarak, MovieClip sınıfını içeren paketi içe aktarabilirsiniz, bu işlem paketteki her sınıf için ayrıimport deyimleri yazılmasına eşdeğerdir:import flash.display.*;Kodunuzda bir sınıfı ifade ediyorsanız, o sınıfın içe aktarılması gerektiği kuralının tek istisnası, üst düzey sınıflarolup bunlar bir pakette açıklanmaz.Not: Flashta Zaman Çizelgesinde karelere eklenen komut dosyaları için, yerleşik sınıflar (flash.* paketleri)otomatik olarak içe aktarılır. Ancak kendi sınıflarınızı yazdığınızda veya Flash geliştirme bileşenleriyle (fl.*paketleri) çalışıyorsanız ya da Flexte çalışıyorsanız, bir sınıfın örneklerini oluşturan kodu yazmak için o sınıfıaçıkça içe aktarmanız gerekir.
    • 25ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlama• Özel olarak sınıf adını ifade eden kodu yazın (genellikle o sınıfın bulunduğu bir değişkeni veri türü olarakbelirtip daha sonra değişkende saklamak için sınıfın bir örneğini oluşturarak). ActionScript kodunda başka birsınıf adını ifade ederek derleyiciye o sınıfın tanımını yüklemesini bildirirsiniz. Örneğin, Box adında harici birsınıf verildiğinde, bu deyim Box sınıfının yeni bir örneğinin oluşturulmasını sağlar:var smallBox:Box = new Box(10,20);Derleyici ilk defa Box sınıfının başvurusuyla karşılaştığında, Box sınıfı tanımını bulmak için yüklenen kaynakkodunu arar.Doğru aracı seçmeProjenizin gereksinimlerine ve sahip olduğunuz kaynaklara bağlı olarak, ActionScript kodunuzu yazmaya vedüzenlemeye yönelik birçok araçtan birini (veya birden çok aracı birlikte) kullanmak isteyebilirsiniz.Flash geliştirme aracıGrafik ve animasyon oluşturma yeteneklerine ek olarak, Adobe Flash CS4 Professional, FLA dosyasındaki veya hariciyalnızca ActionScript dosyalarındaki öğelere eklenmiş olan ActionScript koduyla çalışma araçlarını içerir. Flashgeliştirme aracı, önemli miktarda animasyon veya video içeren ya da grafik varlıklarının çoğunu kendi başınızaoluşturmak istediğiniz projeler için, özellikle de ActionScript gerektiren minimum kullanıcı etkileşimi veyaişlevselliğin yer aldığı projelerde idealdir. ActionScript projenizi geliştirmek için Flash geliştirme aracını kullanmayıseçmenizin başka bir nedeni de, aynı uygulamada görsel varlıklar oluşturmayı ve kod yazmayı istemeniz olabilir.Ayrıca önceden oluşturulmuş kullanıcı arabirimi bileşenlerini kullanmak istiyorsanız ancak projenizde önem verilenöncelikler küçük SWF boyutu ve daha kolay bir görsel kaplama olduğunda da Flash geliştirme aracını kullanmakisteyebilirsiniz.Adobe Flash CS4 Professional, ActionScript kodunun yazılması için iki araç içerir:• Eylemler paneli: FLA dosyasında çalışılırken kullanılabilir olan bu panel, zaman çizelgesinde karelere eklenmişActionScript kodu yazmanıza olanak sağlar.• Komut dosyası penceresi: Komut dosyası penceresi, ActionScript (.as) kod dosyalarıyla çalışmak için adanmış birmetin düzenleyicisidir.Flex BuilderAdobe Flex Builder, Flex çerçevesiyle projeler oluşturulmasına yönelik birincil araçtır. Flex Builder, görsel mizanpajve MXML düzenleme araçlarına ek olarak, Flex veya yalnızca ActionScript projeleri oluşturmak için dekullanılabilmesi için tam özellikli bir ActionScript düzenleyicisi de içerir. Flex uygulamalarının birçok avantajı vardır,bu avantajlar arasında, zengin bir önceden oluşturulmuş kullanıcı arabirimi denetimleri kümesi, esnek dinamikmizanpaj denetimleri ve harici veri kaynaklarıyla çalışılması ve harici verilerin kullanıcı arabirimi öğelerinebağlanmasına yönelik yerleşik mekanizmalar yer alır. Ancak bu özellikleri sağlamak için ek kod gerekli olduğundan,Flex uygulamaları daha büyük bir SWF dosyası boyutuna sahip olabilir ve Flash eşdeğerleri kadar kolay şekildetamamen yeniden kaplanamayabilir.Flex ile tam özellikli, veri tabanlı zengin Internet uygulamaları oluşturuyorsanız ve ActionScript kodunu düzenleme,MXML kodunu düzenleme ve uygulamanızı görsel olarak düzenleme işlemlerinin tümünü tek bir araç içinde yapmakistiyorsanız Flex Builderı kullanın.
    • 26ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamaÜçüncü taraf ActionScript düzenleyiciActionScript (.as) dosyaları basit metin dosyaları olarak saklandığından, düz metin dosyalarını düzenleme yeteneğinesahip herhangi bir program ActionScript dosyaları yazmak için kullanılabilir. Adobe’nin ActionScript ürünlerine ekolarak, ActionScripte özgü yetenekler içeren birçok üçüncü taraf metin düzenleme programları da oluşturulmuştur.Herhangi bir metin düzenleyici programı kullanarak bir MXML dosyası veya ActionScript sınıfları yazabilirsiniz.Daha sonra, Flex derleyicisinin yanı sıra Flex çerçevesi sınıflarını da içeren Flex SDK öğesini kullanarak bu dosyalardabir SWF uygulaması (Flex ya da yalnızca ActionScript uygulaması) oluşturabilirsiniz. Alternatif olarak birçokgeliştirici, grafiksel içerik oluşturmaya yönelik Flash geliştirme aracıyla birlikte ActionScript sınıfları yazmaya yöneliküçüncü taraf bir ActionScript düzenleyicisi de kullanır.Şu durumlarda üçüncü taraf bir ActionScript düzenleyicisi kullanmayı seçebilirsiniz:• Flash uygulamasında görsel öğelerin tasarlanmasıyla birlikte ActionScript kodunu ayrı bir programda yazmayıtercih ederseniz.• ActionScript olmayan programlama (örn. HTML sayfaları oluşturma veya başka bir programlama dilindeuygulamalar oluşturma) için bir uygulama kullanıyorsanız ve ActionScript kodlamanız için de aynı uygulamayıkullanmak istiyorsanız.• Flash veya Flex Builder olmadan Flex SDK kullanarak yalnızca ActionScript veya Flex projeleri oluşturmakistiyorsanız.ActionScripte özgü destek sağlayan dikkate değer kod düzenleyicilerinden bazıları şunlardır:• Adobe Dreamweaver® CS4• ASDT• FDT• FlashDevelop• PrimalScript• SE|PYActionScript geliştirme işlemiActionScript projeniz ister büyük isterse küçük olsun, uygulamanızı tasarlayıp geliştirme işleminin kullanılması dahaetkili ve verimli şekilde çalışmanıza katkıda bulunur. Aşağıdaki adımlar, ActionScript 3.0ı kullanan bir uygulamanınoluşturulmasına yönelik temel bir geliştirme işlemini açıklamaktadır:1 Uygulamanızı tasarlayın.Uygulamanızı oluşturmaya başlamadan önce bir şekilde açıklamanız gerekir.2 ActionScript 3.0 kodunuzu oluşturun.Flash, Flex Builder, Dreamweaver veya bir metin düzenleyicisi kullanarak ActionScript kodu oluşturabilirsiniz.3 Kodunuzu çalıştırmak için bir Flash veya Flex uygulama dosyası oluşturun.Flash geliştirme aracında bu, yeni bir FLA dosyasının oluşturulmasını, yayınlama ayarlarınızın yapılmasını,kullanıcı arabirimi bileşenlerinin uygulamaya eklenmesini ve ActionScript koduna başvurulmasını içerir. Flexgeliştirme ortamında, yeni bir uygulama dosyasının oluşturulması işlemi kapsamında, uygulamanın tanımlanmasıve MXML kullanılarak kullanıcı arabirimi bileşenlerinin eklenmesi ve ActionScript koduna başvurulması yer alır.4 ActionScript uygulamanızı yayınlayın ve test edin.Bu, Flash geliştirme veya Flex geliştirme ortamından uygulamanızın çalıştırılmasını ve uygulamanızın her şeyitasarlandığı şekilde yaptığından emin olunmasını içerir.
    • 27ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamaBu adımları aynı sırayla izlemek veya bir adım üzerinde çalışmadan önce bir önceki adımı tamamen bitirmek zorundaolmadığınızı unutmayın. Örneğin uygulamanızın bir ekranını tasarlayabilir (adım 1) ve daha sonra ActionScript koduyazmadan (adım 2) ve test işlemini yapmadan (adım 4) önce, grafik düğmeleri, vb. oluşturabilirsiniz (adım 3). Ya da birkısmını tasarlayabilir ve sonra aynı anda tek bir düğme veya arabirim öğesi ekleyebilir ve her biri için ActionScript yazıpbu öğeler oluşturulduğunda da öğeleri test edebilirsiniz. Geliştirme işleminin bu dört aşamasının hatırlanması yardımcıolsa da, gerçek dünyadaki geliştirmede aşamalar arasında olabildiğince ileri geri hareket edilmesi daha etkili olur.Kendi sınıflarınızı oluşturmaProjelerinizde kullanılmak üzere sınıf oluşturulması işlemi yorucu görünebilir. Ancak sınıf oluşturulmasının daha zorbir kısmını, sınıfın tasarlanması, başka bir deyişle sınıfın içereceği yöntemlerin, özelliklerin ve olayların tanımlanmasıgörevi oluşturur.Sınıf tasarlama stratejileriNesne tabanlı tasarım konusu karmaşıktır; tüm kariyerler, bu disiplinin akademik çalışmalarına ve profesyoneluygulamasına adanmıştır. Ancak yine de başlangıç aşamasında yardımcı olabilecek birkaç önerilen yaklaşım şunlardır.1 Bu sınıfın örneklerinin uygulamada oynayacağı rolü düşünün. Genellikle nesneler bu üç rolden biri görevini görür:• Değer nesnesi: Bu nesneler birincil olarak veri konteynerleri görevi görür, başka bir deyişle, daha çok özellik vedaha az yöntem içerir (veya bazen hiç yöntem içermez). Bunlar genellikle müzik çalar uygulamasındaki Songsınıfı (tek bir gerçek dünya şarkısını temsil eden) veya Playlist sınıfı (şarkıların kavramsal bir grubunu temsileden) gibi açıkça tanımlanmış öğelerin kod temsilleridir.• Görüntüleme nesnesi: Bunlar gerçekten ekranda görüntülenen nesnelerdir. Bu nesnelerin örnekleri arasında,açılır liste veya durum gösterimi gibi kullanıcı arabirimi öğeleri, video oyunundaki yaratıklar gibi grafikselöğeler, vb. yer alır.• Uygulama yapısı: Bu nesneler, uygulamalar tarafından gerçekleştirilen mantık veya işlemede çok sayıdadestekleyici rol oynar. Bunun örnekleri arasında, biyoloji simülasyonunda belirli hesaplamaları gerçekleştirenbir nesne; müzik çalar uygulamasında kadran denetimi ile ses düzeyi gösterimi arasında değerlerin senkronizeedilmesinden sorumlu bir nesne; video oyunundaki kuralları yöneten bir nesne ya da çizim uygulamasındakaydedilmiş bir resmi yükleyen bir nesne yer alır.2 Sınıfın ihtiyaç duyacağı belirli işlevleri belirleyin. Farklı işlev türleri genellikle sınıfın yöntemleri olur.3 Sınıf bir değer nesnesi görevi görecek şekilde tasarlanmışsa, örneklerin içereceği verileri belirleyin. Bu öğeler, iyiözellik adaylarıdır.4 Sınıfınız projeniz için özel olarak tasarlandığından, en önemli şey, uygulamanızın ihtiyaç duyduğu işlevselliğisağlamaktır. Bu, bu soruları kendi başınıza yanıtlamanıza yardımcı olabilir:• Uygulamanız hangi bilgileri saklayacak, izleyecek ve işleyecek? Bunun belirlenmesi, isteyebileceğiniz değernesnelerini ve özelliklerini tanımlamanıza yardımcı olur.• Örneğin uygulama ilk yüklendiğinde, belirli bir düğme tıklatıldığında, filmin oynatılması durdurulduğunda, vb.durumlarda hangi eylem kümelerinin gerçekleştirilmesi gerekecek? Bunlar iyi yöntem adaylarıdır (veya"eylemler" yalnızca tek tek değerlerin değiştirilmesini içeriyorsa, özellik adaylarıdır).• Belirli bir eylem söz konusu olduğunda, sınıfın o eylemi gerçekleştirmesi için hangi bilgileri bilmesi gerekir? Bubilgiler yöntemin parametresi olur.• Uygulama işini yapmak için ilerledikçe, sınıfınızda, uygulamanızın diğer bölümlerinin de bilmesi gereken hangişeyler değişir? Bunlar iyi olay adaylarıdır.
    • 28ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlama5 Eklemek istediğiniz bazı ek işlevlerin bulunmaması dışında, ihtiyaç duyduğunuz nesneye benzer bir nesne varsa,bir alt sınıf (kendi işlevselliğinin tümünü tanımlamak yerine, varolan bir sınıfın işlevselliğine dayanan bir sınıf)oluşturun. Örneğin, ekranda görsel nesne olacak bir sınıf oluşturmak istiyorsanız, varolan görüntülemenesnelerinden birinin (örn. Sprite veya MovieClip) davranışını sınıfınız için temel olarak kullanmak istersiniz. Budurumda, MovieClip (veya Sprite) temel sınıf olur ve sınıfınız bu sınıfı genişletir. Alt sınıf oluşturulmasıyla ilgilidaha fazla bilgi için, bkz. “Miras” sayfa 106.Sınıf için kod yazmaSınıfınız için bir tasarım planına sahip olduktan veya en azından sınıfın hangi bilgileri izlemesi gerekeceği ve hangieylemleri gerçekleştirmesi gerekeceği konusunda biraz fikir sahibi olduktan sonra, sınıf yazmanın gerçek sözdizimidaha kolay ve anlaşılır olur.Aşağıda, kendi ActionScript sınıfınızı oluşturmanız için minimum adımlar verilmiştir:1 Dreamweaver gibi genel bir programlama aracında veya düz metin belgeleriyle çalışmanıza olanak sağlayanherhangi bir programda, Flex Builder veya Flash gibi ActionScripte özgü bir programda yeni bir belge açın.2 Sınıfın adını tanımlamak için bir class deyimi girin. Bunu yapmak için, sırayla public class sözcüklerini,ardından sınıfın adını ve sonra sınıfın içeriklerini (yöntem ve özellik tanımlarını) barındıran bir açma ve kapatmaküme ayraçlarını girin. Örneğin:public class MyClass{}public sözcüğü, sınıfa herhangi bir başka koddan erişilebildiğini belirtir. Diğer alternatifler için, bkz. “Erişimdenetimi ad alanı nitelikleri” sayfa 93.3 Sınıfınızın bulunacağı paketin adını belirtmek için bir package deyimi yazın. Sözdizimi, sırayla packagesözcüğünü, ardından tam paket adını ve sonra açma ve kapatma küme ayraçlarını (class deyim bloğunukapsayan) içerir. Örneğin, bunu yapmak için önceki adımdaki kodu değiştiririz:package mypackage{public class MyClass{}}4 Sınıf gövdesinin içinde var deyimini kullanarak sınıfta özelliklerin her birini tanımlayın; sözdizimi, herhangi birdeğişkeni bildirmek için kullandığınız sözdizimiyle aynıdır (public değiştiricisi eklenir). Örneğin, sınıf tanımınınaçma ve kapatma küme ayraçlarının arasına bu satırlar eklendiğinde, textVariable, numericVariable vedateVariable adında özellikler oluşturulur:public var textVariable:String = "some default value";public var numericVariable:Number = 17;public var dateVariable:Date;5 İşlev tanımlamak için kullanılan aynı sözdizimini kullanarak sınıfta her bir yöntemi tanımlayın. Örneğin:• myMethod() yöntemi oluşturmak için şunu girin:public function myMethod(param1:String, param2:Number):void{// do something with parameters}
    • 29ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlama• Yapıcı (sınıf örneği oluşturma işleminin bir parçası olarak çağrılan özel yöntem) oluşturmak için, adı sınıfınadıyla tamamen eşleşen bir yöntem oluşturun:public function MyClass(){// do stuff to set initial values for properties// and otherwise set up the objecttextVariable = "Hello there!";dateVariable = new Date(2001, 5, 11);}Sınıfınıza bir yapıcı yöntemini dahil etmezseniz, derleyici sınıfınızda otomatik olarak boş bir yapıcı (herhangibir parametre ve deyim içermeyen) oluşturur.Tanımlayabileceğiniz birkaç tane daha sınıf öğesi vardır. Bu öğeler daha karmaşıktır.• Erişimciler, bir yöntem ile özellik arasında özel bir köprüdür. Sınıfı tanımlamak için kodu yazdığınızda, birdençok eylem gerçekleştirebilmeniz için (bir özelliği tanımladığınızda tek yapabildiğiniz şey olan yalnızca bir değerokuma veya atama yerine) erişimciyi bir yöntem gibi yazarsınız. Ancak sınıfınızın bir örneğinioluşturduğunuzda, değeri okumak veya atamak için yalnızca adı kullanarak erişimciyi bir özellik gibideğerlendirirsiniz. Daha fazla bilgi için, bkz. “Erişimci yöntemlerini alma ve ayarlama” sayfa 99.• ActionScriptteki olaylar, belirli bir sözdizimi kullanılarak tanımlanmaz. Bunun yerine, olay dinleyicileriniizlemek ve bunlara olayları bildirmek için EventDispatcher sınıfının işlevselliğini kullanarak sınıfınızda olaylarıtanımlarsınız. Kendi sınıflarınızda olayların oluşturulmasıyla ilgili daha fazla bilgi için, bkz. “Olayları işleme”sayfa 243.Örnek: Temel bir uygulama oluşturmaFlash, Flex Builder, Dreamweaver veya herhangi bir metin düzenleyicisi kullanarak .as uzantısına sahip hariciActionScript kaynak dosyaları oluşturabilirsiniz.Flash geliştirme ve Flex Builder araçları da dahil olmak üzere, birçok uygulama geliştirme ortamında ActionScript 3.0kullanılabilir.Bu bölümde, Flash geliştirme aracı veya Flex Builder kullanılarak basit bir ActionScript 3.0 uygulamasının oluşturulupgeliştirilmesine yönelik adımlar açıklanmaktadır. Oluşturacağınız uygulama, Flash ve Flex uygulamalarında hariciActionScript 3.0 sınıfı dosyalarının kullanılmasına yönelik basit bir desen sunar. Bu desen, bu kılavuzdaki diğer örnekuygulamalarının tümü için geçerli olacaktır.ActionScript uygulamanızı tasarlamaUygulamayı oluşturmaya başlamadan önce, oluşturmak istediğiniz uygulama hakkında biraz fikir sahibi olmanızgerekir.Tasarımınızın temsili, uygulamanın adı ve uygulama amacının kısa bir ifadesi gibi basit olabileceği gibi, çok sayıdaBirleşik Modelleme Dili (UML) diyagramları içeren bir gereksinim kümesi belgeleri gibi karmaşık da olabilir. Bukılavuzda, yazılım tasarımı disiplinini ayrıntılı şekilde ele alınmaz ancak uygulama tasarımının, ActionScriptuygulamalarının geliştirilmesinde önemli bir adım olduğunun bilinmesi önemlidir.Birinci ActionScript uygulaması örneğimiz, standart bir “Hello World” uygulaması olacaktır, bu nedenle tasarımıoldukça kolaydır:• Bu uygulamaya HelloWorld adı verilecektir.
    • 30ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlama• Söz konusu uygulama, “Hello World!”sözcüklerini içeren tek bir metin alanını görüntüleyecektir.• Kolayca yeniden kullanılması için, bir Flash belgesi veya Flex uygulaması içinden kullanılabilen Greeter adında tekbir nesne tabanlı sınıfı kullanacaktır.• Uygulamanın temel bir sürümünü oluşturduktan sonra, kullanıcının bir kullanıcı adı girmesini ve uygulamanınbilinen kullanıcıların listesinde adı kontrol etmesini sağlamak için yeni işlevsellik eklersiniz.Bu kısa tanımın yerinde olmasıyla, uygulamayı oluşturmaya başlayabilirsiniz.HelloWorld projesini ve Greeter sınıfını oluşturmaHello World uygulamasının tasarım deyimi, uygulama kodunun kolayca yeniden kullanılabilmesi gerektiğini belirtti.Bu hedefi dikkate alarak uygulama, Flex Builder veya Flash geliştirme aracında oluşturduğunuz bir uygulamadankullanılan Greeter adında tek bir nesne tabanlı sınıfı kullanır.Flash geliştirme aracında Greeter sınıfını oluşturmak için:1 Flash geliştirme aracında, Dosya > Yeni seçeneklerini belirleyin.2 Yeni Belge iletişim kutusunda ActionScript dosyasını seçip Tamamı tıklatın.Yeni bir ActionScript düzenleme penceresi görüntülenir.3 Dosya > Kaydet seçeneklerini belirleyin. Uygulamanızı içerecek bir klasörü seçin, ActionScript dosyasınaGreeter.as adını verin ve Tamamı tıklatın.“Greeter sınıfına kod ekleme” sayfa 30 bölümünden devam edin.Greeter sınıfına kod eklemeGreeter sınıfı, HelloWorld uygulamanızda kullanabileceğiniz bir nesneyi (Greeter) tanımlar.Greeter sınıfına kod eklemek için:1 Aşağıdaki kodu yeni dosyaya yazın:package{public class Greeter{public function sayHello():String{var greeting:String;greeting = "Hello World!";return greeting;}}}Greeter sınıfı, “Hello World!” dizesini döndüren tek bir sayHello() yöntemini içerir.2 Bu ActionScript dosyasını kaydetmek için Dosya > Kaydet seçeneklerini belirleyin.Greeter sınıfı şimdi bir uygulamada kullanılmaya hazırdır.ActionScript kodunuzu kullanan bir uygulama oluşturmaOluşturduğunuz Greeter sınıfı, kendiliğinden bulunan bir yazılım işlevleri kümesini tanımlar ancak tam biruygulamayı temsil etmez. Sınıfı kullanmak için, bir Flash belgesi veya Flex uygulaması oluşturmanız gerekir.
    • 31ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamaHelloWorld uygulaması, Greeter sınıfının yeni bir örneğini oluşturur. Greeter sınıfını uygulamanıza şu şekildeekleyebilirsiniz.Flash geliştirme aracını kullanarak bir ActionScript uygulaması oluşturmak için:1 Dosya > Yeni seçeneklerini belirleyin.2 Yeni Belge iletişim kutusunda Flash Belgesi seçeneğini belirleyip Tamamı tıklatın.Yeni bir Flash penceresi görüntülenir.3 Dosya > Kaydet seçeneklerini belirleyin. Greeter.as sınıf dosyasını içeren aynı klasörü seçin, Flash belgesineHelloWorld.fla adını verin ve Tamamı tıklatın.4 Flash Araçları paletinde, Metin aracını seçin ve yaklaşık 300 piksel genişliğinde ve 100 piksel yüksekliğinde yeni birmetin alanını tanımlamak için Sahne Alanı üzerinde Metin aracını sürükleyin.5 Özellikler panelinde, metin alanı halen Sahne Alanında seçili durumdayken, metin türünü“Dinamik Metin” olarakayarlayın ve metin alanının örnek adı olarak mainText yazın.6 Ana zaman çizelgesinin birinci karesini tıklatın.7 Eylemler paneline şu komut dosyasını yazın:var myGreeter:Greeter = new Greeter();mainText.text = myGreeter.sayHello();8 Dosyayı kaydedin.“ActionScript uygulamanızı yayınlama ve test etme” sayfa 31 bölümünden devam edin.ActionScript uygulamanızı yayınlama ve test etmeYazılım geliştirme yinelemeli bir işlemdir Kod yazarsınız, yazdığınız kodları derlersiniz ve düzgün şekildederleninceye kadar kodu düzenlersiniz. Derlenen uygulamayı çalıştırırsınız, tasarlanan amacını yerine getiripgetirmediğini görmek için uygulamayı test edersiniz ve amacını yerine getirmiyorsa, amacını yerine getirinceye kadarkodu düzenlersiniz. Flash ve Flex Builder geliştirme ortamları, uygulamalarınızın yayınlanması, test edilmesi vehatalarının ayıklanması için birçok yol sunar.Her bir ortamda HelloWorld uygulamasının test edilmesine yönelik temel adımlar şunlardır.Flash geliştirme aracını kullanarak bir ActionScript uygulamasını yayınlamak ve test etmek için:1 Uygulamanızı yayınlayın ve derleme hatası olup olmadığına bakın. Flash geliştirme aracında, ActionScriptkodunuzu derlemek ve HelloWorld uygulamasını çalıştırmak için, Kontrol Et > Filmi Test Et seçeneklerinibelirleyin.2 Uygulamanızı test ederken, Çıktı penceresinde herhangi bir hata veya uyarı görüntülenirse, HelloWorld.fla ya daHelloWorld.as dosyalarında bu hataların nedenlerini giderip uygulamayı yeniden test etmeyi deneyin.3 Herhangi bir derleme hatası yoksa, Hello World uygulamasını gösteren bir Flash Player penceresi görüntülenir.Şimdi ActionScript 3.0ı kullanan basit ancak tam bir nesne tabanlı uygulama oluşturdunuz. “HelloWorlduygulamasını geliştirme” sayfa 31 bölümünden devam edin.HelloWorld uygulamasını geliştirmeUygulamayı daha ilgi çekici hale getirmek için şimdi uygulamanın bir kullanıcı adı istemesini ve bu kullanıcı adınıönceden tanımlı bir adlar listesine göre doğrulamasını sağlayacaksınız.
    • 32ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamaİlk olarak, yeni işlevselliği eklemek için Greeter sınıfını güncelleyeceksiniz. Ardından yeni işlevselliği kullanmak içinuygulamayı güncelleyeceksiniz.Greeter.as dosyasını güncellemek için:1 Greeter.as dosyasını açın.2 Dosyanın içeriklerini şunlarla değiştirin (yeni ve değiştirilen satırlar kalın yazı tipiyle gösterilmektedir):package{public class Greeter{/*** Defines the names that should receive a proper greeting.*/public static var validNames:Array = ["Sammy", "Frank", "Dean"];/*** Builds a greeting string using the given name.*/public function sayHello(userName:String = ""):String{var greeting:String;if (userName == ""){greeting = "Hello. Please type your user name, and then pressthe Enter key.";}else if (validName(userName)){greeting = "Hello, " + userName + ".";}else{greeting = "Sorry " + userName + ", you are not on the list.";}return greeting;}/*** Checks whether a name is in the validNames list.*/public static function validName(inputName:String = ""):Boolean{if (validNames.indexOf(inputName) > -1){return true;}else{return false;}}}}
    • 33ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamaGreeter sınıfı şimdi birkaç yeni özelliğe sahiptir:• validNames dizisi geçerli kullanıcı adlarını listeler. Greeter sınıfı yüklendiğinde bu dizi üç addan oluşan bir listeşeklinde başlatılır.• sayHello() yöntemi şimdi bir kullanıcı adını kabul eder ve bazı koşulları esas alarak selamlamayı değiştirir.userName boş bir dize ("") olursa, greeting özelliği, kullanıcıdan bir ad isteyecek şekilde ayarlanır. Kullanıcı adıgeçerliyse, selamlama "Hello, userName" olur. Son olarak, bu iki koşuldan herhangi biri karşılanmazsa,greeting değişkeni "Sorry userName, you are not on the list" olarak ayarlanır.• inputName öğesi validNames dizisinde bulunuyorsa, validName() yöntemi true değerini döndürür,bulunmuyorsa, false değerini döndürür. validNames.indexOf(inputName) deyimi, validNames dizisindekidizelerin her birini inputName dizesinde kontrol eder. Array.indexOf() yöntemi, dizideki bir nesnenin birinciörneğinin dizin konumunu döndürür veya nesne dizide bulunmazsa -1 değerini döndürür.Daha sonra bu ActionScript sınıfına başvuran Flash veya Flex dosyasını düzenleyeceksiniz.Flash geliştirme aracını kullanarak uygulamayı değiştirmek için:1 HelloWorld.fla dosyasını açın.2 Greeter sınıfının sayHello() yöntemine boş bir dize ("") iletilecek şekilde Kare 1de komut dosyasını değiştirin:var myGreeter:Greeter = new Greeter();mainText.text = myGreeter.sayHello("");3 Araçlar paletinde Metin aracını seçin ve Sahne Alanında, varolan mainText metin alanının doğrudan altında yanyana iki yeni metin alanı oluşturun.4 Birinci yeni metin alanına, etiket görevi görecek Kullanıcı Adı: metnini yazın.5 Diğer yeni metin alanını seçin ve Özellik denetçisinde metin alanı türü olarak InputText seçeneğini belirleyin. Satırtürü olarak Tek satır seçin. Örnek adı olarak textIn yazın.6 Ana zaman çizelgesinin birinci karesini tıklatın.7 Eylemler panelinde, varolan komut dosyasının sonuna şu satırları ekleyin:mainText.border = true;textIn.border = true;textIn.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);function keyPressed(event:KeyboardEvent):void{if (event.keyCode == Keyboard.ENTER){mainText.text = myGreeter.sayHello(textIn.text);}}Yeni kod şu işlevselliği ekler:• İlk iki satır, iki metin alanının kenarlıklarını tanımlar.• textIn alanı gibi bir girdi metni alanı, gönderebileceği olayların bir kümesini içerir. addEventListener()yöntemi, bir olay türü gerçekleştiğinde çalıştırılan bir işlevi tanımlamanıza olanak sağlar. Bu durumda, sözkonusu olay klavyedeki bir tuşa basılmasıdır.
    • 34ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlama• keyPressed() özel işlevi, basılan tuşun Enter tuşu olup olmadığını kontrol eder. Basılan tuş Enter ise,myGreeter nesnesinin sayHello() yöntemini çağırarak textIn metin alanındaki metni parametre olarakiletir. Bu yöntem, iletilen değeri esas alarak bir selamlama dizesi döndürür. Döndürülen dize daha sonramainText metin alanının text özelliğine atanır.Kare 1in tam komut dosyası şudur:var myGreeter:Greeter = new Greeter();mainText.text = myGreeter.sayHello("");mainText.border = true;textIn.border = true;textIn.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);function keyPressed(event:KeyboardEvent):void{if (event.keyCode == Keyboard.ENTER){mainText.text = myGreeter.sayHello(textIn.text);}}8 Dosyayı kaydedin.9 Uygulamayı çalıştırmak için Kontrol Et > Filmi Test Et seçeneklerini belirleyin.Uygulamayı çalıştırdığınızda, bir kullanıcı adı girmeniz istenecektir. Kullanıcı adı geçerliyse (Sami, Ferdi veyaDeniz), uygulama "hello" onaylama mesajını görüntüler.Sonraki örnekleri çalıştırma“Hello World” ActionScript 3.0 uygulamasını geliştirip çalıştırdığınıza göre, bu kılavuzda sunulan diğer kodörneklerini çalıştırmak için ihtiyacınız olan temel bilgiye sahip olmuş olmanız gerekir.Bölüm içi örnek kod listelerini test etmeBu kılavuz üzerinde çalıştıkça, çeşitli konuları göstermek için kullanılan örnek kod listelerini denemek isteyebilirsiniz.Test işlemi, programdaki belirli noktalarda değişkenlerin değerinin görüntülenmesini veya ekran içerikleriningörüntülenmesini ya da bu içeriklerle etkileşim kurulmasını içerebilir. Görsel içeriğin veya etkileşimin test edilmesiiçin, gerekli öğeler kod listelerinin öncesinde veya içinde açıklanacaktır—yalnızca kodu test etmek için açıklandığı gibiöğeleri içeren bir belge oluşturmanız gerekecektir. Programda belirli bir noktada değişkenin değerini görüntülemekistemeniz durumunda, bunu gerçekleştirebilmenizin birkaç yolu vardır. Bunlardan biri, Flex Builder ve Flashuygulamasında yerleşik bulunanlar gibi bir hata ayıklayıcısı kullanmaktır. Basit test işlemi içinse, değişken değerlerinigörebileceğiniz bir yere yazdırmanız en kolay yöntem olabilir.Aşağıdaki adımlar, bir kod listesini test etmek ve değişken değerlerini görüntülemek için kullanabileceğiniz bir Flashdosyası oluşturmanıza yardımcı olacaktır:Bölüm içi örnekleri test etmek üzere bir Flash belgesi oluşturmak için:1 Yeni bir Flash belgesi oluşturun ve bu belgeyi sabit sürücünüze kaydedin.
    • 35ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlama2 Test değerlerini Sahne Alanındaki bir metin alanında görüntülemek için, Metin aracını etkinleştirin ve SahneAlanında yeni bir Dinamik metin alanı oluşturun. Satır türü Çok Satırlı olarak ayarlanmış ve kenarlığıetkinleştirilmiş geniş ve uzun bir metin alanı en kullanışlısı olacaktır. Özellik denetçisinde metin alanına bir örnekadı (örneğin, “outputText”) verin. Metin alanına değerler yazmak için, örnek koduna (aşağıda açıklanmaktadır)appendText() yöntemini çağıran kodu eklersiniz.3 Alternatif olarak, örneğin sonuçlarını görüntülemek için, kod listesine (aşağıda açıklandığı gibi) bir trace() işlevçağrısı ekleyebilirsiniz.4 Belirli bir örneği test etmek için, kod listesini Eylemler paneline kopyalayın; gerekirse trace() işlevini ekleyin veyaappendText() yöntemini kullanarak metin alanına bir değer ekleyin.5 Bir SWF dosyası oluşturup sonuçları görüntülemek için ana menüden, Kontrol Et > Filmi Test Et seçeneklerinibelirleyin.Bu yaklaşım değişkenlerin değerlerini görüntülemeye yönelik olduğundan, örnekleri denerken değişkenlerindeğerlerini kolayca görüntüleyebilmenizin iki yolu vardır: Sahne Alanında bir metin alanı örneğine değerleri yazmaveya Çıktı panelinde·değerleri·yazdırmak·için·trace() işlevini kullanma.• trace() işlevi: ActionScript trace() işlevi, kendisine iletilen herhangi bir parametre değerini (değişken veyadeğişmez ifade) Çıktı paneline yazar. Bu kılavuzdaki örnek listelerin çoğu, bir trace() işlev çağrısı içerir,dolayısıyla bu listeler için yalnızca kodu belgenize kopyalamanız ve projeyi test etmeniz gerekir. Henüz değişkenindeğerinin içinde bulunmadığı bir kod listesinde bir değişkenin değerini test etmek için trace() öğesini kullanmakisterseniz, kod listesine bir trace() çağrısı ekleyip değişkeni bir parametre olarak iletin. Örneğin, bu bölümdekigibi bir kod listesiyle karşılaştıysanız,var albumName:String = "Three for the money";kodu Eylemler paneline kopyalayıp daha sonra kod listesinin sonucunu test etmek için bunun gibi bir trace()işlevine çağrı ekleyebilirsiniz:var albumName:String = "Three for the money";trace("albumName =", albumName);Programı çalıştırdığınızda bu satır yazdırılır:albumName = Three for the moneyHer trace() işlev çağrısı, tamamı yazdırılmış tek bir satır olarak birleştirilmiş birden çok parametreyi alabilir. Hertrace() işlev çağrısının sonuna bir satır kesmesi eklenir, böylece ayrı trace() çağrıları ayrı satırlarda yazdırılır.• Sahne Alanındaki bir metin alanı: trace() işlevini kullanmamayı tercih ediyorsanız, Metin aracını kullanarakSahne Alanına bir Dinamik metin alanı ekleyebilir ve kod listesinin sonuçlarını görüntülemek için bu metinalanına değerleri yazabilirsiniz. Metin alanının içeriklerinin sonuna bir String değeri eklemek için, TextFieldsınıfının appendText() yöntemi kullanılabilir. ActionScript kullanarak metin alanına erişmek için, Özellikdenetçisinde metin alanına bir örnek adı vermeniz gerekir. Örneğin, metin alanınız outputText örnek adınasahipse, albumName değişkeninin değerini kontrol etmek için şu kod kullanılabilir:var albumName:String = "Three for the money";outputText.appendText("albumName = ");outputText.appendText(albumName);Bu kod, outputText adındaki metin alanına şu metni yazar:albumName = Three for the moneyÖrnekte de gösterildiği gibi, appendText() yöntemi, metni önceki içeriklerle aynı satıra ekler, böylece birden çokappendText() çağrısı kullanılarak aynı metin satırına birden çok değer eklenebilir. Metni sonraki satıra zorlamakiçin, yeni satır karakteri ("n") ekleyebilirsiniz:
    • 36ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript ile çalışmaya başlamaoutputText.appendText("n"); // adds a line break to the text fieldtrace() işlevinden farklı olarak appendText() yöntemi, yalnızca tek bir değeri parametre olarak kabul eder. Budeğerin bir dize (bir String örneği veya değişmez bir dize) olması gerekir. Dize olmayan bir değişkenin değeriniyazdırmak için öncelikle değeri bir String öğesine dönüştürmeniz gerekir. Bunu yapmanın en kolay yolu, nesnenintoString() yönteminin çağrılmasıdır:var albumYear:int = 1999;outputText.appendText("albumYear = ");outputText.appendText(albumYear.toString());Bölüm sonu örnekleriyle çalışmaBu bölümde olduğu gibi, bu kılavuzda bulunan çoğu bölümde, bölümde ele alınan kavramların bir çoğunu birbirinebağlayan önemli bir bölüm sonu örneği yer alır. Ancak bu bölümdeki Hello World örneğinden farklı olarak, buörnekler adım adım öğretici formatında sunulmamaktadır. Her örnekte ilgili ActionScript 3.0 kodu vurgulanıp elealınmakta ancak belirli geliştirme ortamlarında örneklerin çalıştırılmasıyla ilgili talimatlar sağlanmamaktadır. Ne varki, bu kılavuzla birlikte verilen örnek dosyalar, seçtiğiniz geliştirme ortamında kolayca örnekleri derleyip çalıştırmanıziçin ihtiyaç duyduğunuz tüm dosyaları içermektedir.
    • 37Bölüm 4: ActionScript dili ve sözdizimiActionScript 3.0, hem ActionScript dilini hem de Adobe Flash Player Uygulaması Programlama Arabirimini (API)içerir. Çekirdek dil, ActionScriptin dil sözdizimini ve üst düzey veri türlerini tanımlayan bölümüdür. ActionScript 3.0,Flash Playera programlama yoluyla erişilmesini sağlar.Bu bölümde, çekirdek ActionScript dili ve sözdizimine giriş sağlanmıştır. Bu bölümü okuduktan sonra, veri türleri vedeğişkenlerle nasıl çalışıldığı, düzgün sözdiziminin nasıl kullanıldığı ve programınızda veri akışının nasıl denetlendiğikonusunda temel bilgi sahibi olacaksınız.Dile genel bakışActionScript 3.0 dilinin temelini nesneler oluşturur, bunlar temel bina bloklarıdır. Bildirdiğiniz her değişken,yazdığınız her işlev ve oluşturduğunuz her sınıf örneği bir nesnedir. ActionScript 3.0 programını, görevlerigerçekleştiren, olayları yanıtlayan ve birbiriyle iletişim kuran bir nesne grubu olarak düşünebilirsiniz.Java veya C++ uygulamasında nesne tabanlı programlamayı (OOP) bilen programcılar, nesneleri, iki tür üye içerenmodüller olarak düşünebilir: üye değişkenlerde veya özelliklerde saklanan veriler ve yöntemler üzerinden erişilebilirdavranış. ActionScript 3.0, nesneleri benzer ancak biraz daha farklı bir şekilde tanımlar. ActionScript 3.0da nesneleryalnızca özellikler koleksiyonudur. Bu özellikler, yalnızca verileri değil aynı zamanda işlevleri veya diğer nesneleri deiçeren konteynerlerdir. Bir işlev bir nesneye bu şekilde eklenirse, buna yöntem denir.ActionScript 3.0 tanımı, Java veya C++ arka planına sahip programcılar için biraz garip görünse de, uygulamada,ActionScript 3.0 sınıflarıyla nesne türlerinin tanımlanması, Java ya da C++ uygulamalarında sınıflarıntanımlanmasına çok benzer. ActionScript nesne modeli ile diğer gelişmiş konular ele alınırken, iki nesne tanımıarasındaki fark önemlidir ancak diğer durumların çoğunda, özellikler terimi, yöntemlerin tersine, sınıf üyesideğişkenler anlamına gelir. Örneğin, ActionScript 3.0 Dil ve Bileşenler Başvurusu, değişkenleri veya alıcı ayarlayıcıözelliklerini ifade etmek için özellikler terimini kullanır. Bir sınıfın parçası olan işlevleri ifade etmek için yöntemlerterimini kullanır.ActionScriptteki sınıflar ile Java veya C++ uygulamalarındaki sınıflar arasındaki bir fark, ActionScriptte sınıflarınyalnızca soyut varlıklar olmamasıdır. ActionScript sınıfları, sınıfın özelliklerini ve yöntemlerini saklayan sınıf nesneleriile temsil edilir. Bu da, bir sınıfın veya paketin üst düzeyine deyimler ya da çalıştırılabilir kod dahil etmek gibi Java veC++ programcılarına yabancı görünebilecek tekniklere olanak sağlar.ActionScript sınıfları ile Java veya C++ sınıfları arasındaki diğer bir fark, her ActionScript sınıfında prototipnesnesiadında bir şeyin olmasıdır. Önceki ActionScript sürümlerinde, prototip zincirleri içinde bağlanan prototip nesneleri,topluca tüm sınıf mirası hiyerarşisinin temeli görevini görürdü. ActionScript 3.0da ise prototip nesneleri mirassisteminde yalnızca küçük bir rol oynar. Ancak bir özelliği ve o özelliğin değerini bir sınıfın tüm örnekleri arasındapaylaşmak istiyorsanız, prototip nesnesi, statik özellik ve yöntemler için alternatif olarak yine kullanışlı olabilir.Geçmişte, ileri düzey ActionScript programcıları, özel yerleşik dil öğeleriyle prototip zincirini doğrudan işleyebilirdi.Şimdi dil, sınıf tabanlı programlama arabiriminin daha olgun bir uygulamasını sağladığından, __proto__ ve__resolve gibi bu özel dil öğelerinin çoğu, artık dilin bir parçası değildir. Üstelik, Flash Player ve Adobe AIRuygulamasının performansında önemli ölçüde artış sağlayacak şekilde dahili miras mekanizmalarınıneniyileştirilmesi, miras mekanizmasına doğrudan erişilmesini önler.
    • 38ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiNesneler ve sınıflarActionScript 3.0da, her nesne bir sınıf tarafından tanımlanır. Sınıf, bir nesne türünün şablonu veya şeması olarakdüşünülebilir. Sınıf tanımları, sınıfa bağlı davranışı kapsayan işlevler niteliğindeki veri değerlerini ve yöntemlerinibarındıran değişkenleri ve sabitleri içerebilir. Özelliklerde saklanan değerler, ilkel değerler veya başka nesneler olabilir.İlkel değerler, sayılar, dizeler veya Boolean değerleridir.ActionScript, çekirdek dilin parçası olan birçok yerleşik sınıfı içerir. Number, Boolean ve String gibi bu yerleşiksınıflardan bazıları, ActionScriptte kullanılabilir olan ilkel değerleri temsil eder. Array, Math ve XML sınıfları gibidiğer sınıflar daha karmaşık nesneleri tanımlar.Yerleşik veya kullanıcı tanımlı tüm sınıflar, Object sınıfından türetilir. Önceki ActionScript sürümlerinde deneyimliprogramcılar için, diğer tüm sınıflar Object veri türünden türetilse de, Object veri türünün artık varsayılan veri türüolmadığının unutulmaması önemlidir. ActionScript 2.0da, tür ek açıklamasının olmaması değişkenin Object türündeolduğu anlamına geldiğinden, şu iki kod satırı eşdeğerdir:var someObj:Object;var someObj;Ancak ActionScript 3.0, şu iki yöntemle belirlenebilen türlenmemiş değişken kavramını getirmiştir:var someObj:*;var someObj;Türlenmemiş bir değişken, Object türünde bir değişkenle aynı değildir. Önemli olan fark, Object türündeki birdeğişken undefined özel değerini barındıramazken, türlenmemiş değişkenlerin bu değeri barındırabilmesidir.class anahtar sözcüğünü kullanarak kendi sınıflarınızı tanımlayabilirsiniz. Sınıf özelliklerini üç şekildebildirebilirsiniz: bir yöntem bildiriminde const anahtar sözcüğüyle sabitler tanımlanabilir, var anahtar sözcüğüyledeğişkenler tanımlanabilir ve get ve set nitelikleriyle alıcı ve ayarlayıcı özellikleri tanımlanır. function anahtarsözcüğüyle yöntemler bildirebilirsiniz.new operatörünü kullanarak bir sınıfın örneğini oluşturursunuz. Aşağıdaki örnek, myBirthday adında bir Date sınıfıörneğini oluşturur.var myBirthday:Date = new Date();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ı endüşük düzeye indirecek şekilde sınıf tanımlarını bir arada paketlemenize olanak sağlar. Ad alanları, özellik ve yöntemadları 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 veyöntemlerin görünürlüğünü yönetmenizi sağlar.PaketlerActionScript 3.0daki 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çaoluş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:
    • 39ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimipackage samples{public class SampleCode{public var sampleGreeting:String;public function sampleFunction(){trace(sampleGreeting + " from sampleFunction()");}}}Bu örnekteki sınıfın adı SampleCodedur. Sınıf, samples paketinin içinde olduğundan, derleyici otomatik olarakderleme zamanında sınıf adını samples.SampleCode tam nitelendirilmiş adıyla niteler. Derleyici de, sampleGreetingve sampleFunction() öğeleri sırayla samples.SampleCode.sampleGreeting vesamples.SampleCode.sampleFunction() olacak şekilde özelliklerin veya yöntemlerin adlarını niteler.Geliştiricilerin çoğu, özellikle de Java programlama arka planına sahip olanlar, bir paketin üst düzeyine yalnızcası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 veinternal olmak üzere iki erişim belirticisine de izin verildiğini unutmayın. Yuvalanmış sınıfları özel olarakbildirmenize olanak sağlayan Javadan 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. Önceki örnektegörebildiğiniz gibi, tam nitelendirilmiş paket başvuruları, tıpkı Javadaki gibi nokta operatörü (.) kullanılarak ifadeedilir. Kodunuzu diğer programcıların da kullanması için sezgisel bir hiyerarşik yapıda organize etmek üzere paketlerikullanabilirsiniz. Bu, kod paylaşımını kolaylaştırır ve böylece kendi paketinizi oluşturup başkalarıyla paylaşmanıza vebaş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ı da, SampleCode adında bir sınıf oluşturabilir. Paketler olmadanbu bir ad çakışması oluşturur ve bunun tek çözümü sınıflardan birinin yeniden adlandırılmasıdır. Ancak paketlersayesinde, 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şikorganizasyonunu oluşturmanıza olanak sağlar. Buna iyi bir örnek, ActionScript 3.0 tarafından sağlanan flash.xmlpaketidir. flash.xml paketi, flash paketinin içinde yuvalanmıştır.flash.xml paketi, önceki ActionScript sürümlerinde kullanılan eski XML ayrıştırıcısını içerir. Bunun şimdi flash.xmlpaketinde kalmasının nedenlerinden biri, eski XML sınıfının adının, ActionScript 3.0da kullanılabilir olanECMAScript için XML (E4X) belirtimi işlevselliğini uygulayan yeni XML sınıfının adıyla çakışmasıdır.Eski XML sınıfının bir pakete taşınması iyi bir birinci adım olsa da, eski XML sınıflarının kullanıcılarının çoğuflash.xml paketini içe aktarır ve bu da eski XML sınıfının tam nitelendirilmiş adını (flash.xml.XML) kullanmayı herzaman hatırlamazsanız aynı ad çakışmasını oluşturur. Bu durumu önlemek için şimdi aşağıdaki örnekte gösterildiğigibi, eski XML sınıfı XMLDocument olarak adlandırılmıştır:package flash.xml{class XMLDocument {}class XMLNode {}class XMLSocket {}}
    • 40ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiActionScript 3.0ın çoğu, flash paketi altında organize edilir. Örneğin, flash.display paketi, görüntüleme listesi APIsiniiçerirken, flash.events paketi de yeni olay modelini içerir.Paketler oluşturmaActionScript 3.0, paketlerinizi, sınıflarınızı ve kaynak dosyalarınızı organize etme şeklinizde önemli ölçüde esnekliksağlar. Önceki ActionScript sürümleri, her kaynak dosyası için yalnızca bir sınıfa izin verirdi ve kaynak dosyasınınadı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 dahiletmenize olanak sağlar ancak her dosyadaki yalnızca bir sınıf o dosyaya harici olan kod için kullanılabilir durumagetirilebilir. Başka bir deyişle, her dosyadaki yalnızca bir sınıf, paket bildiriminde bildirilebilir. Ek sınıfları pakettanı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 paketleribildirmez, 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.0da dizinleri temsil etmeye devam etse de, yalnızca sınıfları değil, daha fazlasını daiçerebilir. ActionScript 3.0da, 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 deyimlerde dahil edebilirsiniz. Bir paketin üst düzeyinde değişkenler, işlevler veya ad alanları bildirirseniz, o düzeydekullanılabilir olan nitelikler yalnızca public ve internal olur ve bildirim bir sınıf, değişken, işlev ya da ad alanı olsada, 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ı, ilgiliolmayan 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 ancakbu iki sınıfın mutlaka herhangi bir şekilde birbiriyle ilgili olması gerekmez. Aynı şekilde, yuvalanmış bir paketin, üstpaketiyle herhangi bir anlamsal ilişkisi olmayabilir.Paketleri içe aktarmaBir 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çeaktarılmasının isteğe bağlı olduğu ActionScript 2.0dan farklılık gösterir.Örneğini bu bölümün başlarındaki SampleCode sınıfı örneğini göz önünde bulundurun. Sınıf, samples adında birpakette kalıyorsa, SampleCode sınıfını kullanmadan önce aşağıdaki içe aktarma deyimlerinden birini kullanmanızgerekir:import samples.*;veyaimport 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ızgerekir. 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, derleyicininiç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) veyayalnızca sınıf adını (SampleCode) kullanabilirsiniz.
    • 41ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiTam nitelendirilmiş adlar, aynı ada sahip sınıflar, yöntemler veya özellikler belirsiz koda neden olduğundakullanış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 sorunyaratmayacağı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ınkullanı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şimindebulunulduğ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çinkullanılabilir olmasını istiyorsanız, o sınıfın public olduğunu bildirmeniz gerekir. Örneğin, aşağıdaki paket iki sınıfiçerir: SampleCode ve CodeFormatter:// SampleCode.as filepackage samples{public class SampleCode {}}// CodeFormatter.as filepackage 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ı iseyalnı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şturursunuz:import samples.SampleCode;import samples.CodeFormatter;var mySample:SampleCode = new SampleCode(); // okay, public classvar myFormatter:CodeFormatter = new CodeFormatter(); // errorHer iki sınıfın da paket dışında kullanılabilir olmasını istiyorsanız, her iki sınıfın public olduğunu bildirmenizgerekir. 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ıcaSampleCode adında bir sınıfa sahip olan şu paketi göz önünde bulundurun:package langref.samples{public class SampleCode {}}Aşağıdaki gibi, her iki sınıfı da içe aktarırsanız, SampleCode sınıfını ifade ederken bir ad çakışması olur:
    • 42ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiimport samples.SampleCode;import langref.samples.SampleCode;var mySample:SampleCode = new SampleCode(); // name conflictDerleyici, hangi SampleCode sınıfının kullanılacağını bilemez. Bu çakışmayı çözümlemek için, aşağıdaki gibi hersı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++ derleyicileriaynı 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 dosyalarabakmadığından, #include direktifi C++ uygulamasında gereklidir. ActionScript 3.0, bir include direktifine sahiptirancak bu direktif, sınıfları ve paketleri içe aktarmak için tasarlanmamıştır. ActionScript 3.0da sınıfları veya paketleriiç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 öncedentanı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ı XMLdekinden birazdaha 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 terminolojilervardı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 üzereiki 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ı şeklindenitelendirilir, 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. Birtanı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ğinigetirmeniz 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ü kullanarakad 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 kullanarakuygularsı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 niteleyerekbu ad alanına başvurabilirsiniz. Aşağıdaki örnek, use direktifi yoluyla myFunction() işlevine başvurur:
    • 43ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiuse 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ımlamaAd 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 URIyi atabilirsiniz. Aşağıdaki örnek, URIkullanı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. Aşağıdaki örnekteki gibi, URIyi atarsanız, derleyici URIyerine 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özkonusu ad alanı, o paket veya sınıf dışındaki koda görünmeyebilir. Örneğin, aşağıdaki kod, flash.utils paketindetanı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 kodlaragö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ğinikullanır:package flash.utils{public namespace flash_proxy;}Ad alanlarını uygulamaAd alanı uygulanması, bir ad alanına bir tanımın yerleştirilmesi anlamına gelir. Ad alanlarına yerleştirilebilen tanımlararası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ındapublic 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ını tanımladıktan sonra, tanımladığınız ad alanını public niteliğiyle aynı şekilde kullanabilirsiniz ve tanımda özel ad alanınıza başvurabilen kod için kullanılabilir olur. Örneğin, bir example1 ad alanını tanımlarsanız,aşağıdaki örnekte gösterildiği gibi, nitelik olarak example1 öğesini kullanıp myFunction() adında bir yöntemiekleyebilirsiniz:
    • 44ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdiziminamespace example1;class someClass{example1 myFunction() {}}Nitelik olarak example1 ad alanı kullanılarak myFunction() yönteminin bildirilmesi, yöntemin example1 ad alanınaait 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şleveuygulamak 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 denetimibelirticisi 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şvurmapublic, 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şiminbağlama göre denetlenmesidir. Örneğin, private ad alanına yerleştirilen tanımlar, aynı sınıf içindeki kod içinotomatik olarak kullanılabilir olur. Ancak tanımladığınız ad alanları için böyle bir bağlam duyarlılığı yoktur. Özel birad 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, usenamespace 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ı kullanmaActionScript 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.0daki Object.__resolve özelliğinin yerini alan Proxy sınıfı, bir hataoluş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ızgerekir. 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şkabir 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, Proxysınıfını genişletir ve daha sonra Proxy sınıfının callProperty() yöntemini geçersiz kılarsınız.
    • 45ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiAd 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 Proxysı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ıcadynamic 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: testingflash_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. (Proxysı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 üzeretasarlanmamış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 birinecallProperty() adını vermek isteyebilirsiniz. callProperty() yöntemi sürümünüz farklı bir ad alanındaolduğundan, aşağıdaki kod kabul edilebilir:
    • 46ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimidynamic 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 şekildeyöntemlere veya özelliklere erişim sağlamak istediğinizde de ad alanları yardımcı olabilir. Örneğin, birçok paketeyayı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. Bunu yapmak için, yeni bir ad alanı oluşturabilir ve bunu kendiözel erişim denetimi belirticiniz olarak kullanabilirsiniz.Aşağıdaki örnek, farklı paketlerde bulunan iki işlevi birlikte gruplandırmak için kullanıcı tanımlı bir ad alanı kullanır.Bunları aynı ad alanında gruplandırarak tek bir use namespace deyimini kullanıp her iki işlevi bir sınıf veya paketiç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 birpakette bulunduğundan, dosyayı example adındaki bir klasöre yerleştirmeniz gerekir. Ad alanı, diğer paketlere içeaktarılabilmesi için public olarak işaretlenir.// myInternal.as in folder examplepackage 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öntemlerinbulunduğu sınıfları tanımlar. Utility sınıfı, example.alpha paketindedir, başka bir deyişle, example klasörünün altklasö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 folderpackage 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;}}}
    • 47ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimi// Helper.as in the example/beta folderpackage 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. Adobe Flash CS4 Professionalda bu sınıf, FLAnı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 statikyöntemler hem de örnek yöntemleri yerleştirilebilir.// NamespaceUseCase.aspackage{import flash.display.MovieClip;import example.myInternal; // import namespaceimport example.alpha.Utility;// import Utility classimport example.beta.Helper;// import Helper classpublic class NamespaceUseCase extends MovieClip{public function NamespaceUseCase(){use namespace myInternal;Utility.someTask();Utility.someTask();trace(Utility.taskCounter); // 2Helper.someTask();trace(Helper.lastCalled); // [time someTask() was last called]}}}
    • 48ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiDeğişkenlerDeğişkenler, programınızda kullandığınız değerleri saklamanıza olanak sağlar. Bir değişken bildirmek için, değişkenadıyla var deyimini kullanmanız gerekir. ActionScript 2.0da, yalnızca tür ek açıklamalarını kullanıyorsanız vardeyiminin kullanılması gerekir. ActionScript 3.0da ise var deyiminin kullanılması her zaman gerekir. Örneğin,aşağıdaki ActionScript satırı, i adında bir değişken bildirir:var i;Bir değişkeni bildirirken var deyimini atarsanız, katı modda bir derleyici hatası ve standart modda bir çalışma zamanıhatası alırsınız. Örneğin, i değişkeni önceden tanımlanmadıysa, aşağıdaki kod satırı bir hataya yol açar:i; // error if i was not previously definedBir değişkeni bir veri türüyle ilişkilendirmek için, değişkeni bildirdiğinizde bunu yapmanız gerekir. Değişken türübelirlenmeden bir değişkenin belirtilmesi geçerlidir ancak bu, katı modda bir derleyici uyarısına yol açar. Değişkeninadının sonuna iki nokta (:) ve ardından da değişkenin türünü ekleyerek bir değişken türü belirlersiniz. Örneğin,aşağıdaki kod, int türünde bir i değişkenini bildirir:var i:int;Atama operatörünü (=) kullanarak bir değişkene bir değer atayabilirsiniz. Örneğin, aşağıdaki kod bir i değişkeninibildirir ve bu değişkene 20 değerini atar:var i:int;i = 20;Aşağıdaki örnekte olduğu gibi, değişkeni bildirdiğiniz anda değişkene bir değer atamak daha kullanışlı olabilir:var i:int = 20;Bildirildiği anda bir değişkene değer atama tekniği yalnızca tam sayı ve dizeler gibi ilkel değerler atanırken değil, birdizi oluşturulurken veya bir sınıfın örneği başlatılırken de yaygın olarak kullanılır. Aşağıdaki örnek, bir kod satırıkullanılarak bildirilen ve değer atanan bir diziyi gösterir.var numArray:Array = ["zero", "one", "two"];new operatörünü kullanarak bir sınıfın örneğini oluşturabilirsiniz. Aşağıdaki örnek, CustomClass adında bir sınıfınörneğini oluşturur ve yeni oluşturulan sınıf örneği başvurusunu customItem adındaki değişkene atar:var customItem:CustomClass = new CustomClass();Bildirilecek birden çok değişkeniniz varsa, değişkenleri ayırmak için virgül operatörünü (,) kullanarak bunlarıntümünü tek bir kod satırında bildirebilirsiniz. Örneğin, aşağıdaki kod, tek bir kod satırında üç değişken bildirir:var a:int, b:int, c:int;Ayrıca aynı kod satırındaki değişkenlerin her birine değer atayabilirsiniz. Örneğin, aşağıdaki kod üç değişken (a, b vec) bildirir ve her birine bir değer atar:var a:int = 10, b:int = 20, c:int = 30;Değişken bildirimlerini tek bir deyimde gruplandırmak için virgül operatörünü kullanabilseniz de, bunun yapılmasıkodunuzun okunabilirliğini azaltabilir.
    • 49ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiDeğişken kapsamını anlamaBir değişkenin kapsamı, sözlü bir başvuruyla değişkene erişilebilen kod alanıdır. Genel değişken, kodunuzun tümalanlarında tanımlı değişkenken, yerel değişken ise kodunuzun yalnızca bir bölümünde tanımlı değişkendir.ActionScript 3.0da değişkenlere her zaman bildirildikleri işlev veya sınıf kapsamı atanır. Genel bir değişken, herhangibir işlev veya sınıf tanımı dışında tanımladığınız bir değişkendir. Örneğin, aşağıdaki kod, herhangi bir işlevin dışındagenel işlevi bildirerek strGlobal genel işlevini oluşturur. Bu örnek, genel bir değişkenin, işlev tanımının içinde vedışında kullanılabilir olduğunu gösterir.var strGlobal:String = "Global";function scopeTest(){trace(strGlobal); // Global}scopeTest();trace(strGlobal); // GlobalBir işlev tanımı içindeki değişkeni bildirerek yerel bir değişkeni bildirmiş olursunuz. Yerel değişkenitanımlayabileceğiniz en küçük kod alanı, işlev tanımıdır. Bir işlev içinde bildirilen yerel değişken yalnızca o işlev içindevarolur. Örneğin, localScope() adındaki bir işlevin içinde str2 adında bir değişkeni bildirirseniz, bu değişken sözkonusu işlevin dışında kullanılamaz.function localScope(){var strLocal:String = "local";}localScope();trace(strLocal); // error because strLocal is not defined globallyYerel değişkeniniz için kullandığınız değişken adı önceden genel değişken olarak bildirilmişse, yerel değişkenkapsamdayken, yerel tanım genel tanımı gizler (veya gölgeler). Genel değişken, işlev dışında varolmaya devam eder.Örneğin, aşağıdaki kod, str1 adında genel bir dize değişkeni oluşturur ve sonra scopeTest() işlevinin içinde aynıadda yerel bir değişken oluşturur. İşlevin içindeki trace deyimi, değişkenin yerel değerini verirken, işlevin dışındakitrace deyimi de değişkenin genel değerini verir.var str1:String = "Global";function scopeTest (){var str1:String = "Local";trace(str1); // Local}scopeTest();trace(str1); // GlobalActionScript değişkenleri, C++ ve Java uygulamalarındaki değişkenlerden farklı olarak, blok düzeyi kapsamına sahipdeğildir. Kod bloğu, açma küme ayracı ( { ) ile kapatma küme ayracı( } ) arasındaki herhangi bir deyim grubudur. C++ve Java gibi bazı programlama dillerinde, kod bloğu içinde bildirilen değişkenler o kod bloğunun dışında kullanılamaz.Bu kapsam sınırlamasına blok düzeyi kapsamı denir ve bu kapsam sınırlaması ActionScriptte bulunmaz. Bir kodbloğu içinde bir değişken bildirirseniz, bu değişken yalnızca o kod bloğunda değil, kod bloğunun ait olduğu diğer işlevparçalarında da kullanılabilir. Örneğin, aşağıdaki işlev, çeşitli blok kapsamlarında tanımlanmış değişkenleri içerir.Tüm değişkenler, işlev boyunca kullanılabilir.
    • 50ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimifunction blockTest (testArray:Array){var numElements:int = testArray.length;if (numElements > 0){var elemStr:String = "Element #";for (var i:int = 0; i < numElements; i++){var valueStr:String = i + ": " + testArray[i];trace(elemStr + valueStr);}trace(elemStr, valueStr, i); // all still defined}trace(elemStr, valueStr, i); // all defined if numElements > 0}blockTest(["Earth", "Moon", "Sun"]);Blok düzeyi kapsamı olmamasının işaret ettiği ilginç bir nokta, işlev sona ermeden değişken bildirildiği sürece, birdeğişken bildirilmeden o değişkene okuma ve yazma işlemi yapabilmenizdir. Bunun nedeni, derleyicinin tümdeğişken bildirimlerini işlevin en üstüne taşıdığını belirten, kaldırma adındaki bir tekniktir. Örneğin, numdeğişkeninin ilk trace() işlevi, num değişkeni bildirilmeden önce olsa da, aşağıdaki kod derleme yapar:trace(num); // NaNvar num:Number = 10;trace(num); // 10Ancak derleyici, atama deyimlerini kaldırmaz. Bu da, num değişkeninin ilk trace() işlevinin neden Number veri türüiçin varsayılan değişken değeri olan NaN (sayı değil) sonucunu verdiğini açıklar. Başka bir deyişle, aşağıdaki örnektegösterildiği gibi, değişkenler bildirilmeden değişkenlere değer atayabilirsiniz:num = 5;trace(num); // 5var num:Number = 10;trace(num); // 10Varsayılan değerlerVarsayılan değer, siz değerini ayarlamadan önce bir değişkenin içerdiği değerdir. Bir değişkenin ilk defa değeriniayarladığınızda o değişkeni başlatırsınız. Bir değişkeni bildirir ancak değişkenin değerini ayarlamazsanız, o değişkenbaşlatılmamış olur. Başlatılmamış değişkenin değeri, veri türüne bağlıdır. Aşağıdaki tabloda, veri türüne göre organizeedilmiş şekilde değişkenlerin varsayılan değerleri açıklanmaktadır:Veri türü Varsayılan değerBoolean falseint 0Number NaNObject nullString null
    • 51ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiNumber türündeki değişkenler için varsayılan değer NaN (sayı değil) olup bu değer, bir değerin sayıyı temsiletmediğini belirtmek için IEEE-754 standardı tarafından tanımlanmış özel bir değerdir.Bir değişkeni bildirir ancak değişkenin veri türünü bildirmezseniz, gerçekten değişkenin türlenmemiş olduğunubelirten varsayılan veri türü * uygulanır. Türlenmemiş bir değişkeni bir değerle de başlatmazsanız, değişkeninvarsayılan değeri undefined olur.Boolean, Number, int ve uint dışındaki veri türleri için, başlatılmamış bir değişkenin varsayılan değeri null olur. Bu,ActionScript 3.0 tarafından tanımlanmış tüm sınıfların yanı sıra sizin oluşturduğunuz özel sınıflar için de geçerlidir.null değeri, Boolean, Number, int veya uint türündeki değişkenler için geçerli bir değer değildir. Bu tür bir değişkenenull değeri atamayı denerseniz, değer o veri türünün varsayılan değerine dönüştürülür. Object türündeki değişkenleriçin bir null değeri atayabilirsiniz. Object türündeki bir değişkene undefined değerini atamayı denerseniz, değernull değerine dönüştürülür.Number türündeki değişkenler için, değişken bir sayı olmadığında true, aksi takdirde false Boolean değerinidöndüren isNaN() adında özel bir üst düzey işlevi vardır.Veri türleriVeri türü, bir değerler kümesini tanımlar. Örneğin, Boolean veri türü tam olarak iki değerden oluşan bir kümedir:true ve false. ActionScript 3.0, Boolean veri türüne ek olarak, String, Number ve Array gibi birkaç tane daha yaygınkullanılan veri türünü tanımlar. Özel bir değer kümesini tanımlamak için sınıfları veya arabirimleri kullanarak kendiveri türlerinizi tanımlayabilirsiniz. İlkel veya karmaşık olsun, ActionScript 3.0daki tüm değerler, nesnedir.İlkel değer, şu veri türlerinden birine ait olan bir değerdir: Boolean, int, Number, String ve uint. ActionScript, bellek vehız eniyileştirmesini olanaklı kılacak şekilde ilkel değerleri sakladığından, ilkel değerlerle çalışılması genelliklekarmaşık değerlerle çalışılmasından daha hızlıdır.Not: ActionScript, teknik ayrıntılara ilgi duyan okuyucular için ilkel değerleri sabit nesneler şeklinde dahili olaraksaklar. Bunların sabit nesneler olarak saklanması, başvuruya göre iletmenin değere göre iletme kadar etkili olduğuanlamına gelir. Başvurular genellikle değerlerin kendisinden çok daha küçük olduğundan bu, bellek kullanımını azaltıpçalıştırma hızını da artırır.Karmaşık değer, ilkel olmayan bir değerdir. Karmaşık değerler kümesini tanımlayan veri türleri arasında, Array, Date,Error, Function, RegExp, XML ve XMLList yer alır.Çoğu programlama dili, ilkel değerler ile bunların sarıcı değerleri arasında ayrım yapar. Örneğin, Java, bir int ilkeldeğerine ve bunu saran java.lang.Integer sınıfına sahiptir. Java ilkel değerleri nesne değildir ancak bunların sarıcılarınesnedir ve bu da bazı işlemler için ilkel değerleri, bazı işlemler için de sarıcı nesneleri daha uygun hale getirir.ActionScript 3.0da ilkel değerler ve bunların sarıcı nesneleri pratik amaçlar için birbirinden ayırt edilemez. İlkeldeğerler de dahil olmak üzere tüm değerler nesnedir. Flash Player ve Adobe AIR, bu ilkel türleri, nesne gibi davrananancak nesne oluşturulmasıyla ilişkilendirilmiş normal yükü gerektirmeyen özel durumlar olarak değerlendirir. Başkabir deyişle, aşağıdaki iki kod satırı eşdeğerdir:var someInt:int = 3;var someInt:int = new int(3);uint 0Bildirilmemiş (tür ek açıklamasına eşit *) undefinedKullanıcı tanımlı sınıflar da dahil olmak üzere diğer tüm sınıflar. nullVeri türü Varsayılan değer
    • 52ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiYukarıda listelenen tüm ilkel ve karmaşık veri türleri, ActionScript 3.0 çekirdek sınıfları tarafından tanımlanır.Çekirdek sınıflar, new operatörü yerine değişmez değerler kullanarak nesneler oluşturmanıza olanak sağlar. Örneğin,aşağıdaki gibi, değişmez bir değer veya Array sınıfı yapıcısını kullanarak bir dizi oluşturabilirsiniz:var someArray:Array = [1, 2, 3]; // literal valuevar someArray:Array = new Array(1,2,3); // Array constructorTür denetlemeTür denetleme, derleme zamanında veya çalışma zamanında gerçekleşebilir. C++ ve Java gibi statik olarak türlenmişdiller, tür denetlemesini derleme zamanında yapar. Smalltalk ve Python gibi dinamik olarak türlenmiş diller, türdenetlemesini çalışma zamanında işler. ActionScript 3.0, dinamik olarak türlenmiş bir dil olarak çalışma zamanı türdenetlemesi yapar ancak katı mod adı verilen özel bir derleyici moduyla da derleme zamanı tür denetlemesinidestekler. Katı modda tür denetlemesi hem derleme zamanında hem de çalışma zamanında gerçekleşir ancak standartmodda, tür denetlemesi yalnızca çalışma zamanında gerçekleşir.Dinamik olarak türlenmiş diller, siz kodunuzu yapılandırırken çok yüksek esneklik sunar ancak bu, çalışmazamanında tür hatalarının verilmesine neden olur. Statik olarak türlenmiş diller, tür hatalarını derleme zamanındabildirir ancak bu da tür bilgilerinin derleme zamanında bilinmesini gerektirir.Derleme zamanı tür denetlemesiProje boyutu arttıkça, olabildiğince erkenden tür hatalarının yakalanmasının önemi artıp veri türü esnekliğinin önemiazaldığından, derleme zamanı tür denetlemesi genellikle daha büyük projelerde kullanışlıdır. Bu nedenle de AdobeFlash CS4 Professional ve Adobe Flex Builder uygulamalarında ActionScript derleyicisi varsayılan olarak katı moddaçalışacak şekilde ayarlanmıştır.Derleme zamanı tür denetlemesi sağlamak için, derleyicinin kodunuzdaki değişkenlerin veya ifadelerin veri türübilgilerini bilmesi gerekir. Bir değişkenin veri türünü açıkça bildirmek için, değişken adına son ek olarak iki noktaoperatörünü (:) ve ardından veri türünü ekleyin. Veri türünü bir parametreyle ilişkilendirmek için, iki noktaoperatörünü ve ardından da veri türünü kullanın. Örneğin, aşağıdaki kod, xParam parametresine veri türü bilgileriniekler ve açık bir veri türüyle bir değişkeni myParam bildirir:function runtimeTest(xParam:String){trace(xParam);}var myParam:String = "hello";runtimeTest(myParam);ActionScript derleyicisi, katı modda tür uyuşmazlıklarını derleyici hataları olarak bildirir. Örneğin, aşağıdaki kod,Object türünde bir xParam işlev parametresini bildirir ancak daha sonra bu parametreye String ve Number türündedeğerler atamayı dener. Bu da katı modda bir derleyici hatası oluşturur.
    • 53ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimifunction dynamicTest(xParam:Object){if (xParam is String){var myStr:String = xParam; // compiler error in strict modetrace("String: " + myStr);}else if (xParam is Number){var myNum:Number = xParam; // compiler error in strict modetrace("Number: " + myNum);}}Ancak katı modda da, atama deyiminin sağ tarafını türlenmemiş şekilde bırakarak derleme zamanı tür denetlemesiniseçerek devre dışı bırakabilirsiniz. Bir tür ek açıklamasını çıkararak veya özel yıldız (*) tür ek açıklamasını kullanarakbir değişkeni ya da ifadeyi türlenmemiş olarak işaretleyebilirsiniz. Örneğin, önceki örnekte yer alan xParamparametresi, artık tür ek açıklaması içermeyecek şekilde değiştirilirse, kod katı modda derlenir:function dynamicTest(xParam){if (xParam is String){var myStr:String = xParam;trace("String: " + myStr);}else if (xParam is Number){var myNum:Number = xParam;trace("Number: " + myNum);}}dynamicTest(100)dynamicTest("one hundred");Çalışma zamanı tür denetlemesiKatı modda da, standart modda da derleme yapsanız, ActionScript 3.0da, çalışma zamanı tür denetlemesi gerçekleşir.Bir dizi bekleyen bir işleve argüman olarak 3 değerinin iletildiği bir durumu göz önünde bulundurun. 3 değeri, Arrayveri türüyle uyumlu olmadığından, katı modda derleyici bir hata oluşturur. Katı modu devre dışı bırakıp standartmodda çalışırsanız, derleyici tür uyuşmazlığını şikayet etmez ancak Flash Player ve Adobe AIR tarafından yapılançalışma zamanı tür denetlemesi bir çalışma zamanı hatası verir.Aşağıdaki örnek, bir Array argümanı bekleyen ancak kendisine 3 değeri iletilen typeTest() adındaki bir işlevigösterir. 3 değeri, parametrenin bildirilen veri türünün (Array) bir üyesi olmadığından bu, standart modda bir çalışmazamanı hatasına yol açar.function typeTest(xParam:Array){trace(xParam);}var myNum:Number = 3;typeTest(myNum);// run-time error in ActionScript 3.0 standard mode
    • 54ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiKatı modda çalıştığınız halde çalışma zamanı tür hatası aldığınız durumlar da olabilir. Katı modu kullanırkentürlenmemiş bir değişken kullanarak derleme zamanı tür denetlemesini devre dışı bırakırsanız bu mümkün olur.Türlenmemiş bir değişken kullandığınızda, tür denetlemesini ortadan kaldırmış olmazsınız yalnızca çalışma zamanınaertelemiş olursunuz. Örneğin, önceki örnekte yer alan myNum değişkeninin bildirilmiş bir veri türü yoksa, derleyici türuyuşmazlığını algılayamaz ancak Flash Player ve Adobe AIR uygulaması, atama deyiminin sonucu olarak 3 değerineayarlanan myNum çalışma zamanı değerini Array veri türüne ayarlanmış xParam türüyle karşılaştırdığından, bir çalışmazamanı hatası oluşturur.function typeTest(xParam:Array){trace(xParam);}var myNum = 3;typeTest(myNum);// run-time error in ActionScript 3.0Çalışma zamanı tür denetlemesi ayrıca derleme zamanı tür denetlemesine göre mirasın daha esnek kullanılmasınısağlar. Standart mod, tür denetlemesini çalışma zamanına erteleyerek, yukarı çevrim de yapsanız bir alt sınıfınözelliklerine başvurmanıza olanak sağlar. Bir sınıf örneğinin türünü belirtmek için temel sınıf kullandığınızda ancakbu sınıf türü örneğini başlatmak için bir alt sınıf kullandığınızda yukarı çevrim gerçekleşir. Örneğin, genişletilebilenClassBase adında bir sınıf oluşturabilirsiniz (final niteliğine sahip sınıflar genişletilemez):class ClassBase{}Daha sonra aşağıdaki gibi, ClassExtender adında olan ve someString adında bir özellik içeren, ClassBase sınıfının biralt sınıfını oluşturabilirsiniz:class ClassExtender extends ClassBase{var someString:String;}Her iki sınıfı da kullanıp ClassBase veri türü kullanılarak bildirilen ancak ClassExtender yapıcısı kullanılarak başlatılanbir sınıf örneği oluşturabilirsiniz. Temel sınıf, alt sınıfta bulunmayan özellikleri veya yöntemleri içermediğinden,yukarı çevrim güvenli bir işlem olarak değerlendirilir.var myClass:ClassBase = new ClassExtender();Ancak bir alt sınıf, temel sınıfının içermediği özellikleri veya yöntemleri içermez. Örneğin, ClassExtender sınıfı,ClassBase sınıfında varolmayan someString özelliğini içerir. ActionScript 3.0 standart modunda, aşağıdaki örnektegösterildiği gibi, bir derleme zamanı hatası oluşturmadan myClass örneğini kullanarak bu özelliğe başvurabilirsiniz:var myClass:ClassBase = new ClassExtender();myClass.someString = "hello";// no error in ActionScript 3.0 standard modeis operatörüActionScript 3.0da yeni olan is operatörü, bir değişkenin veya ifadenin belirli bir veri türünün üyesi olup olmadığınıtest etmenize olanak sağlar. Önceki ActionScript sürümlerinde, instanceof operatörü bu işlevselliği sağlamıştırancak ActionScript 3.0da instanceof operatörü, veri türü üyeliğini test etmek için kullanılmamalıdır. x instanceofy ifadesi yalnızca y varlığı için x prototip zincirini denetlediğinden, elle tür denetleme için instanceof operatörüyerine is operatörü kullanılmalıdır (ayrıca ActionScript 3.0da prototip zinciri, miras hiyerarşisinin tam resminisağlamaz).
    • 55ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiis operatörü uygun miras hiyerarşisini inceler ve yalnızca bir nesnenin belirli bir sınıfın örneği olup olmadığınıdenetlemek için değil, bir nesnenin belirli bir arabirimi uygulayan bir sınıf örneği olup olmadığını denetlemek için dekullanılabilir. Aşağıdaki örnek, mySprite adında bir Sprite sınıfı örneği oluşturur ve mySprite öğesinin Sprite veDisplayObject sınıflarının bir örneği olup olmadığını ve IEventDispatcher arabirimini uygulayıp uygulamadığını testetmek için is operatörünü kullanır:var mySprite:Sprite = new Sprite();trace(mySprite is Sprite); // truetrace(mySprite is DisplayObject);// truetrace(mySprite is IEventDispatcher); // trueis operatörü, miras hiyerarşisini denetler ve mySprite örneğinin Sprite ve DisplayObject sınıflarıyla uyumluolduğunu düzgün şekilde bildirir (Sprite sınıfı, DisplayObject sınıfının bir alt sınıfıdır). is operatörü ayrıca mySpriteöğesinin IEventDispatcher arabirimini uygulayan herhangi bir sınıftan miras alıp almadığını da denetler. Sprite sınıfı,IEventDispatcher arabirimini uygulayan IEventDispatcher sınıfından miras aldığından, is operatörü, mySpriteöğesinin aynı arabirimini uyguladığını doğru şekilde bildirir.Aşağıdaki örnek, is operatörü yerine instanceof operatörünü kullanarak önceki örnekteki testlerin aynısını gösterir.instanceof operatörü, mySprite öğesinin Sprite veya DisplayObject öğesinin bir örneği olduğunu doğru şekildetanımlar ancak mySprite öğesinin IEventDispatcher arabirimini uygulayıp uygulamadığını test etmek içinkullanıldığında false değerini döndürür.trace(mySprite instanceof Sprite); // truetrace(mySprite instanceof DisplayObject);// truetrace(mySprite instanceof IEventDispatcher); // falseas operatörüActionScript 3.0da yeni olan as operatörü, bir ifadenin belirli bir veri türünün üyesi olup olmadığını denetlemenizeolanak sağlar. Ancak is operatöründen farklı olarak as operatörü bir Boolean değeri döndürmez. as operatörü, trueyerine ifadenin değerini ve false yerine de null değerini döndürür. Aşağıdaki örnek, Sprite örneğinin DisplayObject,IEventDispatcher ve Number veri türlerinden hangisinin üyesi olduğunu denetleme gibi basit bir durumda isoperatörü yerine as operatörü kullanılmasının sonuçlarını gösterir.var mySprite:Sprite = new Sprite();trace(mySprite as Sprite); // [object Sprite]trace(mySprite as DisplayObject); // [object Sprite]trace(mySprite as IEventDispatcher); // [object Sprite]trace(mySprite as Number); // nullas operatörünü kullandığınızda, sağdaki işlenenin bir veri türü olması gerekir. Sağdaki işlenen olarak veri türü dışındabir ifade kullanma girişimi hataya yol açar.Dinamik sınıflarDinamik sınıf, özellikler ve yöntemler eklenerek veya değiştirilerek çalışma zamanında değiştirilebilen bir nesneyitanımlar. String sınıfı gibi, dinamik olmayan bir sınıf mühürlenmiş bir sınıftır. Mühürlenmiş bir sınıfa çalışmazamanında özellikler veya yöntemler ekleyemezsiniz.Bir sınıfı bildirirken, dynamic niteliğini kullanarak dinamik sınıflar oluşturursunuz. Örneğin, aşağıdaki kod, Proteanadında dinamik bir sınıf oluşturur:
    • 56ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimidynamic class Protean{private var privateGreeting:String = "hi";public var publicGreeting:String = "hello";function Protean(){trace("Protean instance created");}}Daha sonra Protean sınıfının bir örneğini başlatırsanız, sınıf tanımının dışında buna özellikler veya yöntemlerekleyebilirsiniz. Örneğin, aşağıdaki kod, Protean sınıfının bir örneğini oluşturur ve örneğe aString adında bir özellikve aNumber adında bir özellik ekler:var myProtean:Protean = new Protean();myProtean.aString = "testing";myProtean.aNumber = 3;trace(myProtean.aString, myProtean.aNumber); // testing 3Dinamik sınıf örneğine eklediğiniz özellikler çalışma zamanı varlıklardır, bu nedenle tüm denetlemeleri çalışmazamanında yapılır. Bu şekilde eklediğiniz bir özelliğe tür ek açıklaması ekleyemezsiniz.Ayrıca bir işlev tanımlayıp bu işlevi myProtean örneğinin bir özelliğine ekleyerek myProtean örneğine bir yöntemekleyebilirsiniz. Aşağıdaki kod, izleme deyimini traceProtean() adındaki bir yönteme taşır:var myProtean:Protean = new Protean();myProtean.aString = "testing";myProtean.aNumber = 3;myProtean.traceProtean = function (){trace(this.aString, this.aNumber);};myProtean.traceProtean(); // testing 3Ancak bu şekilde oluşturulan yöntemlerin, Protean sınıfının özel özelliklerine veya yöntemlerine erişimi yoktur.Ayrıca, Protean sınıfının genel özelliklerine veya yöntemlerine başvuruların da this anahtar sözcüğüyle ya da sınıfadıyla nitelenmesi gerekir. Aşağıdaki örnek, Protean sınıfının özel ve genel değişkenlerine erişmeye çalışantraceProtean() yöntemini gösterir.myProtean.traceProtean = function (){trace(myProtean.privateGreeting); // undefinedtrace(myProtean.publicGreeting); // hello};myProtean.traceProtean();Veri türleri açıklamalarıİlkel veri türleri arasında Boolean, int, Null, Number, String, uint ve void yer alır. ActionScript çekirdek sınıfları ayrıcaşu karmaşık veri türlerini de tanımlar: Object, Array, Date, Error, Function, RegExp, XML ve XMLList.Boolean veri türüBoolean veri türü iki değer içerir: true ve false. Boolean türündeki değişkenler için diğer değerler geçerli değildir.Bildirilmiş ancak başlatılmamış bir Boolean değişkeninin varsayılan değeri false olur.
    • 57ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiint veri türüint veri türü, dahili şekilde 32-bit tam sayı olarak saklanır ve-2.147.483.648 (-231) ile 2.147.483.647 (231- 1) (dahil) arasındaki tam sayılar kümesini kapsar. Önceki ActionScriptsürümleri yalnızca hem tam sayı hem de kayan nokta sayıları için kullanılan Number veri türünü sunardı. ActionScript3.0da şimdi 32-bit işaretli ve işaretsiz tam sayılar için düşük düzeyli makine türlerine erişiminiz vardır. Değişkeninizkayan nokta sayılarını kullanmayacaksa, Number veri türü yerine int veri türünün kullanılması hem daha hızlı hemde daha etkili olur.Minimum ve maksimum int değerleri aralığı dışında kalan tam sayı değerleri için, pozitif ve negatif9.007.199.254.740.992 arasındaki değerleri (53-bit tam sayı değerleri) işleyebilen Number veri türünü kullanın. int veritüründeki değişkenler için varsayılan değer 0dır.Null veri türüNull veri türü yalnızca bir değer içerir, null. Bu, String veri türü için ve Object sınıfı da dahil olmak üzere karmaşıkveri türlerini tanımlayan tüm sınıflar için varsayılan değerdir. Boolean, Number, int ve uint gibi diğer ilkel veritürlerinin hiçbiri null değerini içermez. null değerini, Boolean, Number, int veya uint türündeki değişkenlereatamaya çalıştığınızda, Flash Player ve Adobe AIR, null değerini uygun varsayılan değere dönüştürür. Bu veri türünütür ek açıklaması olarak kullanamazsınız.Number veri türüActionScript 3.0da Number veri türü, tam sayıları, işaretsiz tam sayıları ve kayan nokta sayılarını temsil edebilir.Ancak, performansı en üst düzeye çıkarmak için, Number veri türünü yalnızca 32-bit int ve uint türlerininsaklayamayacağı kadar büyük tam sayı değerleri için ve kayan nokta sayıları için kullanmanız gerekir. Bir kayan noktasayısını saklamak için, sayıya bir ondalık işareti dahil edin. Ondalık işaretini çıkarırsanız, sayı bir tam sayı olaraksaklanır.Number veri türü, İkili Kayan Nokta Aritmetiği için IEEE Standardı (IEEE-754) tarafından belirtilen 64-bit çiftkesinlikli formatı kullanır. Bu standart, kayan nokta sayılarının mevcut 64 bit kullanılarak nasıl saklanacağını dikteeder Sayının pozitif veya negatif olduğunu belirlemek için tek bir bit kullanılır. Taban 2 olarak saklanan üs için on birbit kullanılır. Kalan 52 bit, üssün belirttiği kuvvete yükseltilen sayı olan significand öğesini (mantissa olarak daadlandırılır) saklamak için kullanılır.Number veri türü, bir üssü saklamak için bitlerinden bir kısmını kullanarak, significand için tüm bitleri kullandığındasaklayabildiğinden çok daha büyük kayan nokta sayılarını saklayabilir. Örneğin, Number veri türü, significand öğesinisaklamak için tüm 64 biti de kullansaydı, 265 - 1 büyüklüğünde bir sayıyı saklayabilirdi. Number veri türü bir üssüsaklamak için 11 bit kullanarak, significand öğesini 21023 kuvvetine yükseltebilir.Number türünün temsil edebildiği maksimum ve minimum değerler, Number sınıfının Number.MAX_VALUE veNumber.MIN_VALUE adındaki statik özelliklerinde saklanır.Number.MAX_VALUE == 1.79769313486231e+308Number.MIN_VALUE == 4.940656458412467e-324Bu sayı aralığı büyük olsa da, bu geniş aralık kesinlik düzeyini azaltır. Number veri türü, significand öğesini saklamakiçin 52 bit kullanır ve bu da, kesin şekilde temsil edilecek 52 bitten fazlasını gerektiren sayıların (örn. 1/3 kesiri)yalnızca yaklaşık değerler olmasına neden olur. Uygulamanız için ondalık sayılarda mutlak kesinlik gerekiyorsa, ikilikayan nokta aritmetiğinin tersine ondalık kayan nokta aritmetiğini uygulayan bir yazılım kullanmanız gerekir.Number veri türünde tam sayı değerlerini sakladığınızda, significand öğesinin yalnızca 52 biti kullanılır. Number veritürü, -9.007.199.254.740.992 (-253) ile 9.007.199.254.740.992 (253) arasındaki tam sayıları temsil etmek için bu 52 bitive özel gizlenmiş biti kullanır.
    • 58ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiFlash Player ve Adobe AIR, NaN değerini yalnızca Number türündeki değişkenler için varsayılan değer olarak değil, aynızamanda bir sayı döndürmesi gerektiği halde sayı döndürmeyen herhangi bir işlemin sonucu olarak da kullanır.Örneğin, negatif bir sayının kare kökünü hesaplamayı denerseniz, sonuç NaN olur. Diğer özel Number değerleriarasında pozitif sonsuzluk ve negatif sonsuzluk yer alır.Not: 0 değerine bölme işleminin sonucu, yalnızca bölen de 0 olduğunda NaN değerini verir. 0 değerine bölme işlemi,bölen pozitif olduğunda infinity değerini, bölen negatif olduğunda ise -infinity değerini verir.String veri türüString veri türü, 16-bit karakterlerin bir sırasını temsil eder. Dizeler, UTF-16 formatı kullanılarak dahili şekildeUnicode karakterleri olarak saklanır. Dizeler, Java programlama dilinde olduğu gibi, sabit değerlerdir. Stringdeğerindeki bir işlem, yeni bir dize örneği döndürür. String veri türüyle bildirilen bir değişkenin varsayılan değeri,null şeklindedir. null değeri de boş dize ("") gibi herhangi bir karakter olmadığını temsil etse de, bunun ikisi aynıdeğildir.uint veri türüuint veri türü, dahili şekilde 32-bit işaretsiz tam sayı olarak saklanır ve 0 ile 4.294.967.295 (232 - 1) arasındaki tamsayıların kümesini kapsar. Negatif olmayan tam sayıları çağıran özel koşullar için uint veri türünü kullanın. Örneğin,int veri türü, renk değerlerinin işlenmesi için uygun olmayan dahili bir işaret biti içerdiğinden, piksel rengi değerlerinitemsil etmek için uint veri türünü kullanmanız gerekir. Maksimum uint değerinden büyük tam sayı değerleri için, 53-bit tam sayı değerlerini işleyebilen Number veri türünü kullanın. uint veri türündeki değişkenler için varsayılan değer0dır.void veri türüVoid veri türü yalnızca bir değer içerir, undefined. Önceki ActionScript sürümlerinde undefined, Object sınıfınınörnekleri için varsayılan değerdi. ActionScript 3.0da, Object örneklerinin varsayılan değeri null şeklindedir. Objectsınıfının bir örneğine undefined değerini atamaya çalışırsanız, Flash Player veya Adobe AIR, bu değeri null değerinedönüştürür. Türlenmemiş değişkenlere yalnızca undefined değerini atayabilirsiniz. Türlenmemiş değişkenler, tür ekaçıklaması içermeyen veya tür ek açıklaması için yıldız (*) sembolünü kullanan değişkenlerdir. Döndürme tür ekaçıklaması olarak yalnızca void öğesini kullanabilirsiniz.Object veri türüObject veri türü, Object sınıfı tarafından tanımlanır. Object sınıfı, ActionScriptteki tüm sınıf tanımlamaları için temelsınıf görevi görür. Object veri türünün ActionScript 3.0 sürümü, önceki sürümlerden üç şekilde farklılık gösterir. İlkolarak, Object veri türü artık tür ek açıklaması içermeyen değişkenlere atanan varsayılan veri türü değildir. İkinciolarak, Object veri türü, Object örneklerinin varsayılan değeri olarak kullanılan undefined değerini artık içermez.Üçüncü olarak, ActionScript 3.0da, Object sınıfının örnekleri için varsayılan değer null şeklindedir.Önceki ActionScript sürümlerinde, Object veri türüne tür ek açıklaması içermeyen bir değişken otomatik olarakatanırdı. Artık türlenmemiş değişken kavramını içeren ActionScript 3.0da bu geçerli değildir. Tür ek açıklamasıiçermeyen değişkenler artık türlenmemiş olarak değerlendirilir. Kod okuyucularınıza, amacınızın bir değişkenitürlenmemiş şekilde bırakmak olduğunu açıkça belirtmek isterseniz, tür ek açıklamasının çıkarılmasına eşdeğerşekilde, tür ek açıklaması için yeni yıldız (*) sembolünü kullanabilirsiniz. Aşağıdaki örnekte, her ikisi de x türlenmemişdeğişkenini bildiren iki eşdeğer deyim gösterilmektedir:var xvar x:*
    • 59ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiYalnızca türlenmemiş değişkenler undefined değerini barındırabilir. Bir veri türüne sahip değişkene undefineddeğerini atamaya çalışırsanız, Flash Player veya Adobe AIR uygulaması, undefined değerini o veri türünün varsayılandeğerine dönüştürür. Object veri türünün örnekleri için varsayılan değer null olup bu, bir Object örneğineundefined değerini atamaya çalışırsanız Flash Player veya Adobe AIR uygulamasının undefined değerini nulldeğerine dönüştüreceği anlamına gelir.Tür dönüştürmeleriBir değer farklı veri türünde bir değere dönüştürüldüğünde, tür dönüştürmesi gerçekleştirilmiş olur. Türdönüştürmeleri örtük veya açıkça olabilir. Zorlama olarak da adlandırılan örtük dönüştürme, bazen Flash Player veyaAdobe AIR uygulaması tarafından çalışma zamanında gerçekleştirilir. Örneğin, Boolean veri türündeki bir değişkene2 değeri atanırsa, Flash Player veya Adobe AIR uygulaması, değeri değişkene atamadan önce 2 değerini true Booleandeğerine dönüştürür. Çevrim olarak da adlandırılan açıkça dönüştürme, kodunuz derleyiciye bir veri türündekideğişkeni farklı bir veri türüne aitmiş gibi değerlendirmesini bildirdiğinde gerçekleşir. İlkel değerler bulunduğunda,çevrim gerçek anlamda değerleri bir veri türünden diğerine dönüştürür. Bir nesneyi farklı bir türe çevirmek için, nesneadını parantez içine alıp ve bunun başına yeni türün adını getirirsiniz. Örneğin, aşağıdaki kod bir Boolean değerini alıptam sayıya çevirir:var myBoolean:Boolean = true;var myINT:int = int(myBoolean);trace(myINT); // 1Örtük dönüştürmelerÖrtük dönüştürmeler, birçok bağlamda çalışma zamanında gerçekleşir:• Atama deyimlerinde• Değerler işlev argümanları olarak iletildiğinde• Değerler işlevlerden döndürüldüğünde• Toplama (+) operatörü gibi belirli operatörleri kullanan ifadelerdeKullanıcı tanımlı türler için örtük dönüştürmeler, dönüştürülecek değer hedef sınıfın bir örneği veya hedef sınıftantüretilmiş bir sınıf olduğunda gerçekleşir. Örtük dönüştürme başarısız olursa bir hata oluşur. Örneğin, aşağıdakikod başarılı bir örtük dönüştürme ve başarısız bir örtük dönüştürme içerir:class A {}class B extends A {}var objA:A = new A();var objB:B = new B();var arr:Array = new Array();objA = objB; // Conversion succeeds.objB = arr; // Conversion fails.İlkel türler için örtük dönüştürmeler, açıkça dönüştürme işlevleri tarafından çağrılan aynı dahili dönüştürmealgoritmaları çağrılarak işlenir. İlerleyen bölümlerde bu ilkel tür dönüştürmeleri ayrıntılı şekilde ele alınmıştır.
    • 60ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiAçıkça dönüştürmelerDerleme zamanı hatası oluşturacak bir tür uyuşmazlığı istemediğiniz zamanlar olabileceğinden, katı modda derlemeyaparken açıkça dönüştürmeleri veya çevrimi kullanmanız yararlı olur. Zorlamanın değerlerinizi çalışma zamanındadoğru şekilde dönüştüreceğini bildiğinizde bu durum geçerli olabilir. Örneğin, bir formdan alınan verilerleçalıştığınızda, belirli dize değerlerini sayısal değerlere dönüştürmek için zorlamayı uygulamak isteyebilirsiniz.Aşağıdaki kod, standart modda doğru şekilde de çalışsa, bir derleme zamanı hatası oluşturur:var quantityField:String = "3";var quantity:int = quantityField; // compile time error in strict modeKatı modu kullanmaya devam etmek ancak bir yandan da dizenin bir tam sayıya dönüştürülmesini istiyorsanız,aşağıdaki gibi açıkça dönüştürmeyi kullanabilirsiniz:var quantityField:String = "3";var quantity:int = int(quantityField); // Explicit conversion succeeds.int, uint ve Number türlerine çevrimHerhangi bir veri türünü üç sayı türünden birine çevirebilirsiniz: int, uint ve Number. Flash Player veya Adobe AIRuygulaması herhangi bir nedenle sayıyı dönüştüremezse, int ve uint veri türleri için 0 varsayılan değeri atanır veNumber veri türü için de NaN varsayılan değeri atanır. Bir Boolean değerini bir sayıya dönüştürürseniz, true değeri 1ve false değeri de 0 olur.var myBoolean:Boolean = true;var myUINT:uint = uint(myBoolean);var myINT:int = int(myBoolean);var myNum:Number = Number(myBoolean);trace(myUINT, myINT, myNum); // 1 1 1myBoolean = false;myUINT = uint(myBoolean);myINT = int(myBoolean);myNum = Number(myBoolean);trace(myUINT, myINT, myNum); // 0 0 0Yalnızca rakam içeren dize değerleri, sayı türlerinden birine başarıyla dönüştürülebilir. Sayı türleri ayrıca negatif sayıgibi görünen dizeleri veya onaltılık bir değeri (örneğin, 0x1A) temsil eden dizeleri dönüştürebilir. Dönüştürme işlemi,dize değerinin başındaki ve sonundaki boşluk karakterlerini yoksayar. Ayrıca Number() öğesini kullanarak kayannokta sayısı gibi görünen dizeleri de çevirebilirsiniz. Ondalık işareti eklenmesi, uint() ve int() öğelerinin, ondalıkişaretini ve bu işareti takip eden karakterleri kırparak bir tam sayı döndürmesine neden olur. Örneğin, aşağıdaki dizedeğerleri sayılara çevrilebilir:trace(uint("5")); // 5trace(uint("-5")); // 4294967291. It wraps around from MAX_VALUEtrace(uint(" 27 ")); // 27trace(uint("3.7")); // 3trace(int("3.7")); // 3trace(int("0x1A")); // 26trace(Number("3.7")); // 3.7Sayısal olmayan karakterler içeren dize değerleri, int() veya uint() ile çevrildiğinde 0 değerini; Number() ileçevrildiğinde ise NaN değerini döndürür. Dönüştürme işlemi, baştaki ve sondaki boşlukları yoksayar ancak dizede ikisayıyı ayıran bir boşluk varsa, 0 veya NaN değerini döndürür.trace(uint("5a")); // 0trace(uint("ten")); // 0trace(uint("17 63")); // 0
    • 61ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiActionScript 3.0da, Number() işlevi artık sekizlik veya 8 tabanlı sayıları desteklemez. ActionScript 2.0 Number()işlevine başında sıfır bulunan bir dize sağlarsanız, sayı sekizlik bir sayı olarak yorumlanır ve ondalık eşdeğerinedönüştürülür. ActionScript 3.0daki Number() işlevinde ise bu geçerli değildir, burada baştaki sıfır yoksayılır. Örneğin,aşağıdaki kod, farklı ActionScript sürümleri kullanılarak derlendiğinde farklı çıktı oluşturur:trace(Number("044"));// ActionScript 3.0 44// ActionScript 2.0 36Bir sayısal türdeki değer, farklı bir sayısal türdeki değişkene atandığında çevrim gerekmez. Katı modda da sayısal türlerörtük olarak başka sayısal türlere dönüştürülür. Başka bir deyişle, bazı durumlarda bir tür aralığı aşıldığındabeklenmeyen değerler ortaya çıkabilir. Aşağıdaki değerlerin bazıları beklenmeyen değerler oluştursa da, tümü katımodda derlenir:var myUInt:uint = -3; // Assign int/Number value to uint variabletrace(myUInt); // 4294967293var myNum:Number = sampleUINT; // Assign int/uint value to Number variabletrace(myNum) // 4294967293var myInt:int = uint.MAX_VALUE + 1; // Assign Number value to uint variabletrace(myInt); // 0myInt = int.MAX_VALUE + 1; // Assign uint/Number value to int variabletrace(myInt); // -2147483648Aşağıdaki tabloda, başka veri türlerinden Number, int veya uint veri türüne çevrim sonuçları özetlenmektedir.Boolean değerine çevrimHerhangi bir sayısal veri türünden (uint, int ve Number) Boolean değerine çevrim, sayısal değer 0 olursa false, aksitakdirde true değerini verir. Number veri türü için, NaN değeri de false değerini verir. Aşağıdaki örnek, -1, 0 ve 1sayılarının çevrim sonuçlarını gösterir:var myNum:Number;for (myNum = -1; myNum<2; myNum++){trace("Boolean(" + myNum +") is " + Boolean(myNum));}Örnekten elde edilen çıktı, üç sayıdan yalnızca 0 sayısının false değeri döndürdüğünü gösterir:Boolean(-1) is trueBoolean(0) is falseBoolean(1) is trueVeri türü veya değeri Number, int veya uint türüne dönüştürme sonucuBoolean Değer true olursa, 1; aksi takdirde, 0.Date Date nesnesinin dahili temsili; bu, 1 Ocak 1970, gece yarısı evrensel saatinden bu yana geçen milisaniyesayısıdır.null 0Object Örnek null olursa ve Number türüne dönüştürülürse, NaN; aksi takdirde, 0.String Flash Player veya Adobe AIR uygulaması dizeyi bir sayıya dönüştürebilirse bir sayı; aksi takdirde Number türünedönüştürülürse, NaN veya int ya da uint türüne dönüştürülürse 0.undefined Number türüne dönüştürülürse, NaN; int veya uint türüne dönüştürülürse, 0.
    • 62ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiBir String değerinden Boolean değerine çevrim, dize null veya boş dize ("") olduğunda false değerini döndürür.Aksi takdirde, true değerini döndürür.var str1:String; // Uninitialized string is null.trace(Boolean(str1)); // falsevar str2:String = ""; // empty stringtrace(Boolean(str2)); // falsevar str3:String = " "; // white space onlytrace(Boolean(str3)); // trueObject sınıfı örneğinden Boolean değerine çevrim, örnek null ise false değerini; aksi takdirde true değerinidöndürür:var myObj:Object; // Uninitialized object is null.trace(Boolean(myObj)); // falsemyObj = new Object(); // instantiatetrace(Boolean(myObj)); // trueBoolean değişkenleri katı modda özel değerlendirmeye tabidir; katı modda çevrim yapmadan herhangi bir veritüründeki değerleri Boolean değişkenine atayabilirsiniz. Tüm veri türlerinden Boolean veri türüne örtük zorlama katımodda da gerçekleşir. Başka bir deyişle, diğer tüm veri türlerinin hemen hemen hepsinden farklı olarak, katı modhatalarını önlemek için Boolean değerine çevrim gerekmez. Aşağıdaki örneklerin tümü katı modda derleme yapar veçalışma zamanında beklendiği şekilde davranır:var myObj:Object = new Object(); // instantiatevar bool:Boolean = myObj;trace(bool); // truebool = "random string";trace(bool); // truebool = new Array();trace(bool); // truebool = NaN;trace(bool); // falseAşağıdaki tabloda, başka veri türlerinden Boolean veri türüne çevrim sonuçları özetlenmektedir:String türüne çevrimHerhangi bir sayısal veri türünden String veri türüne çevrim, sayının dize halinde temsilini döndürür. Bir Booleandeğerinden String veri türüne çevrim, değer true olursa "true" dizesini ve değer false olursa "false" dizesinidöndürür.Bir Object sınıfı örneğinden String veri türüne çevrim, örnek null olursa "null" dizesini döndürür. Aksi takdirde,Object sınıfından String türüne çevrim, "[object Object]" dizesini döndürür.Array sınıfı örneğinden String türüne çevrim, tüm dizi öğelerinin virgül sınırlı bir listesini içeren bir dize döndürür.Örneğin, aşağıdaki String veri türüne çevrim işlemi, dizideki üç öğeyi de içeren tek bir dize döndürür:Veri türü veya değeri Boolean değerine dönüştürme sonucuString Değer null veya boş dize ("") olursa false; aksi takdirde true.null falseNumber, int veya uint Değer NaN veya 0 olursa false; aksi takdirde true.Object Örnek null olursa false; aksi takdirde true.
    • 63ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimivar myArray:Array = ["primary", "secondary", "tertiary"];trace(String(myArray)); // primary,secondary,tertiaryDate sınıfı örneğinden String türüne çevrim, örneğin içerdiği tarihin dize halinde temsilini döndürür. Örneğin,aşağıdaki örnek, Date sınıfı örneğinin dize halinde temsilini döndürür (çıktıda Pasifik Yaz Saati sonucugösterilmektedir):var myDate:Date = new Date(2005,6,1);trace(String(myDate)); // Fri Jul 1 00:00:00 GMT-0700 2005Aşağıdaki tabloda, başka veri türlerinden String veri türüne çevrim sonuçları özetlenmektedir.SözdizimiBir dilin sözdizimi, çalıştırılabilir kod yazarken izlenmesi gereken kurallar kümesini tanımlar.Büyük/küçük harf duyarlılığıActionScript 3.0, büyük/küçük harf duyarlı bir dildir. Yalnızca büyük/küçük harf durumu farklı olan tanımlayıcılar,farklı tanımlayıcılar olarak değerlendirilir. Örneğin, aşağıdaki kod iki farklı değişken oluşturur:var num1:int;var Num1:int;Nokta sözdizimiNokta operatörü (.), bir nesnenin özelliklerine ve yöntemlerine erişme yolu sağlar. Nokta sözdizimini kullanıp sıraylaörnek adı, nokta operatörü ve özellik veya yöntem adını kullanarak bir sınıf özelliğini ya da yöntemini ifadeedebilirsiniz. Örneğin, şu sınıf tanımını göz önünde bulundurun:class DotExample{public var prop1:String;public function method1():void {}}Nokta sözdizimini kullanıp aşağıdaki kodda oluşturulan örnek adını kullanarak prop1 özelliğine ve method1()yöntemine erişebilirsiniz:var myDotEx:DotExample = new DotExample();myDotEx.prop1 = "hello";myDotEx.method1();Veri türü veya değeri Dizeye dönüştürme sonucuArray Tüm dizi öğelerini içeren bir dize.Boolean "true" veya "false"Date Date nesnesinin dize halinde temsili.null "null"Number, int veya uint Sayının dize halinde temsili.Object Örnek null olursa, "null"; aksi takdirde, "[object Object]".
    • 64ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiPaketleri tanımlarken nokta sözdizimini kullanabilirsiniz. Yuvalanmış paketleri ifade etmek için nokta operatörünükullanırsınız. Örneğin, EventDispatcher sınıfı, flash adındaki paket içinde yuvalanmış events adındaki bir pakettebulunur. Aşağıdaki ifadeyi kullanarak events paketini ifade edebilirsiniz:flash.eventsBu ifadeyi kullanarak da EventDispatcher sınıfını ifade edebilirsiniz:flash.events.EventDispatcherEğik çizgi sözdizimiEğik çizgi sözdizimi ActionScript 3.0da desteklenmez. Eğik çizgi sözdizimi, bir film klibinin veya değişkenin yolunubelirtmek için önceki ActionScript sürümlerinde kullanılırdı.Değişmez değerlerDeğişmez değer, doğrudan kodunuzda görüntülenen bir değerdir. Aşağıdaki örneklerin tümü değişmezdir:17"hello"-39.4nullundefinedtruefalseDeğişmez değerler, bileşik değişmez değerler oluşturmak için de gruplandırılabilir. Dizi değişmezleri, köşeli ayraçkarakterleri ([]) içine alınır ve dizi öğelerini ayırmak için virgül kullanır.Dizi değişmezi, bir diziyi başlatmak için kullanılabilir. Aşağıdaki örnekler, dizi değişmezleri kullanılarak başlatılan ikidiziyi gösterir. new deyimini kullanabilir ve bileşik değişmezi parametre olarak Array sınıfı yapıcısına iletebilirsiniz,ancak değişmez değerleri şu ActionScript çekirdek sınıflarının örneklerini başlatırken doğrudan da atayabilirsiniz:Object, Array, String, Number, int, uint, XML, XMLList ve Boolean.// Use new statement.var myStrings:Array = new Array(["alpha", "beta", "gamma"]);var myNums:Array = new Array([1,2,3,5,8]);// Assign literal directly.var myStrings:Array = ["alpha", "beta", "gamma"];var myNums:Array = [1,2,3,5,8];Değişmez değerler, genel bir nesneyi başlatmak için de kullanılabilir. Genel bir nesne, Object sınıfının bir örneğidir.Nesne değişmezleri küme ayraçları ({}) içine alınır ve nesne özelliklerini ayırmak için virgül kullanır. Her özellik,özellik adını özelliğin değerinden ayıran iki nokta karakteri (:) ile bildirilir.new deyimini kullanarak genel bir nesne oluşturabilir ve nesne değişmezini parametre olarak Object sınıfı yapıcısınailetebilir veya nesne değişmezini, bildirdiğiniz örneğe doğrudan atayabilirsiniz. Aşağıdaki örnek, yeni bir genel nesneoluşturup her biri sırayla 1, 2 ve 3 değerlerine ayarlanmış üç özellikle (propA, propB ve propC) nesneyi başlatmanıniki alternatif yolunu gösterir:
    • 65ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimi// Use new statement and add properties.var myObject:Object = new Object();myObject.propA = 1;myObject.propB = 2;myObject.propC = 3;// Assign literal directly.var myObject:Object = {propA:1, propB:2, propC:3};Daha fazla bilgi için, bkz. “Dizelerin temelleri” sayfa 138, “Normal ifadelerin temelleri” sayfa 202 ve “XMLdeğişkenlerini başlatma” sayfa 230.Noktalı virgüllerBir deyimi sonlandırmak için noktalı virgül karakterini (;) kullanabilirsiniz. Alternatif olarak, noktalı virgülkarakterini çıkarırsanız, derleyici, her kod satırının tek bir deyimi temsil ettiğini varsayar. Programcıların çoğu deyimsonunu belirtmek için noktalı virgül kullanmaya alışkın olduğundan, deyimlerinizi sonlandırmak için sürekli olaraknoktalı virgül kullanırsanız, kodunuzun okunması daha kolay olabilir.Bir deyimi sonlandırmak için noktalı virgül kullanmanız, tek bir satıra birden çok deyim yerleştirmenize olanak sağlarancak bu, kodunuzun okunmasını güçleştirebilir.ParantezlerActionScript 3.0da parantezleri (()) üç şekilde kullanabilirsiniz. İlk olarak, bir ifadedeki işlemlerin sırasınıdeğiştirmek için parantezleri kullanabilirsiniz. Parantezler içinde gruplandırılan işlemler her zaman önce çalıştırılır.Örneğin, aşağıdaki kodda işlemlerin sırasını değiştirmek için parantezler kullanılmıştır:trace(2 + 3 * 4); // 14trace((2 + 3) * 4); // 20İkinci olarak, aşağıdaki örnekte olduğu gibi, bir ifadeler dizisini değerlendirmek ve son ifadenin sonucunu döndürmekiçin virgül operatörüyle (,) birlikte parantezleri kullanabilirsiniz:var a:int = 2;var b:int = 3;trace((a++, b++, a+b)); // 7Üçüncü olarak, aşağıdaki örnekte gösterildiği gibi, işlevlere veya yöntemlere bir ya da daha fazla parametre iletmek içinparantezleri kullanabilirsiniz, böylece trace() işlevine bir String değeri iletilir:trace("hello"); // helloYorumlarActionScript 3.0 kodu, iki tür yorumu destekler: tek satırlı yorumlar ve çok satırlı yorumlar. Bu yorumlamamekanizması, C++ ve Java uygulamalarındaki yorumlama mekanizmalarına benzer. Derleyici, yorum olarakişaretlenen metni yoksayar.Tek satırlı yorumlar, iki eğik çizgi karakteriyle (//) başlar ve satırın sonuna kadar devam eder. Örneğin, aşağıdakikodda tek satırlı bir yorum bulunmaktadır:var someNumber:Number = 3; // a single line commentÇok satırlı yorumlar, bir eğik çizgi ve yıldız işareti (/*) ile başlar ve bir yıldız işareti ve eğik çizgi (*/) ile sona erer./* This is multiline comment that can spanmore than one line of code. */
    • 66ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiAnahtar sözcükler ve ayrılmış sözcüklerAyrılmış sözcükler, ActionScript tarafından kullanılmak üzere ayrılmış olduğundan, kodunuzda tanımlayıcılar olarakkullanamadığınız sözcüklerdir. Ayrılmış sözcükler arasında, derleyici tarafından programdan kaldırılmayan sözlüanahtar sözcükler yer alır. Tanımlayıcı olarak sözlü bir anahtar sözcük kullanırsanız, derleyici bir hata bildirir.Aşağıdaki tabloda, ActionScript 3.0 sözlü anahtar sözcükleri listelenmektedir.Sözdizimi anahtar sözcükleri adı verilen, tanımlayıcı olarak kullanılabilen ancak belirli bağlamlarda özel anlamı olanküçük bir anahtar sözcükleri kümesi vardır. Aşağıdaki tabloda, ActionScript 3.0 sözdizimi anahtar sözcüklerilistelenmektedir.Ayrıca bazen gelecekteki ayrılmış sözcükler olarak ifade edilen birkaç tanımlayıcı da vardır. Bu tanımlayıcılardanbazıları, ActionScript 3.0 içeren yazılımlar tarafından anahtar sözcük olarak değerlendirilebilse de, bunlarActionScript 3.0 tarafından ayrılmamıştır. Bu tanımlayıcıların çoğunu kodunuzda kullanabilirsiniz ancak bunlarsonraki dil sürümlerinde anahtar sözcük olarak görünebileceğinden, Adobe, bunları kullanmamanızı önerir.as break case catchclass const continue defaultdelete do else extendsfalse finally for functionif implements import ininstanceof interface internal isnative new null packageprivate protected public returnsuper switch this throwto true try typeofuse var void whilewitheach get set namespaceinclude dynamic final nativeoverride staticabstract boolean byte castchar debugger double enumexport float goto intrinsiclong prototype short synchronizedthrows to transient typevirtual volatile
    • 67ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiSabitlerActionScript 3.0, sabitler oluşturmak için kullanabildiğiniz const deyimini destekler. Sabitler, değiştirilemeyen sabitbir değere sahip özelliklerdir. Bir sabite yalnızca bir defa değer atayabilirsiniz ve atamanın, sabitin bildirimine yakınbir yerde gerçekleşmesi gerekir. Örneğin, bir sabit bir sınıfın üyesi olarak bildirilirse, bu sabite yalnızca bildiriminparçası olarak veya sınıf yapıcısının içinde bir değer atayabilirsiniz.Aşağıdaki kod iki sabit bildirir. Birinci sabit olan MINIMUM, bildirim deyiminin parçası olarak atanmış bir değeresahiptir. İkinci sabit olan MAXIMUM, yapıcıda atanmış bir değere sahiptir. Katı mod bir sabitin değerinin yalnızcabaşlatma zamanında atanmasına olanak sağladığından, bu örneğin yalnızca standart modda derleme yaptığınıunutmayın.class A{public const MINIMUM:int = 0;public const MAXIMUM:int;public function A(){MAXIMUM = 10;}}var a:A = new A();trace(a.MINIMUM); // 0trace(a.MAXIMUM); // 10Bir sabite başka bir şekilde bir başlangıç değeri atamayı denerseniz bir hata oluşur. Örneğin, sınıfın dışında MAXIMUMbaşlangıç değerini ayarlamaya çalışırsanız, bir çalışma zamanı hatası oluşur.class A{public const MINIMUM:int = 0;public const MAXIMUM:int;}var a:A = new A();a["MAXIMUM"] = 10; // run-time errorActionScript 3.0, kullanmanız için çok çeşitli sabitleri tanımlar. Kural gereği, ActionScriptteki sabitlerin tümü, alt çizgikarakteri (_) ile ayrılmış sözcüklerde büyük harf kullanır. Örneğin, MouseEvent sınıfı tanımı, her biri fare girdisiyleilgili bir olayı temsil eden sabitleri için bu adlandırma kuralını kullanır:package flash.events{public class MouseEvent extends Event{public static const CLICK:String = "click";public static const DOUBLE_CLICK:String = "doubleClick";public static const MOUSE_DOWN:String = "mouseDown";public static const MOUSE_MOVE:String = "mouseMove";...}}
    • 68ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiOperatörlerOperatörler, bir veya birkaç işleneni alıp bir değer döndüren özel işlevlerdir. İşlenen, bir operatörün girdi olarakkullandığı, genellikle değişmez değer, değişken veya ifade olan bir değerdir. Örneğin, aşağıdaki kodda bir değerdöndürmek için, üç değişmez işlenenle (2, 3 ve 4) toplama (+) ve çarpma (*) operatörleri kullanılır. Daha sonra,döndürülen değeri (14) sumNumber değişkenine atamak için atama (=) operatörü tarafından bu değer kullanılır.var sumNumber:uint = 2 + 3 * 4; // uint = 14Operatörler tekli, ikili veya üçlü olabilir. Tekli operatör tek bir işlenen alır. Örneğin, artırma (++) operatörü tek birişlenen aldığından tekli bir operatördür. İkili operatör iki işlenen alır. Örneğin, bölme (/) operatörü iki işlenen alır.Üçlü operatör üç işlenen alır. Örneğin, koşul (?:) operatörü üç işlenen alır.Bazı operatörler aşırı yüklüdür, başka bir deyişle, kendilerine iletilen işlenenlerin türüne ve miktarına bağlı olarakfarklı şekilde davranır. Toplama (+) operatörü, işlenenlerin veri türüne bağlı olarak farklı şekilde davranan bir aşırıyüklü operatör örneğidir. Her iki işlenen de sayı olursa, toplama operatörü değerlerin toplamını döndürür. Her ikiişlenen de dize olursa, toplama operatörü iki işlenenin bitiştirilmiş halini döndürür. Aşağıdaki örnek kod, işlenenlerebağlı olarak operatörün nasıl farklı şekilde davrandığını gösterir:trace(5 + 5); // 10trace("5" + "5"); // 55Operatörler de sağlanan işlenenlerin sayısına bağlı olarak farklı şekilde davranabilir. Çıkarma (-) operatörü hem teklihem de ikili bir operatördür. Yalnızca bir işlenen sağlandığında, çıkarma operatörü işleneni negatif duruma getiripsonucu döndürür. İki işlenen sağlandığında, çıkarma operatörü işlenenlerin farkını döndürür. Aşağıdaki örnek, ilkolarak tekli operatör olarak ve sonra da ikili operatör olarak kullanılan çıkarma operatörünü gösterir.trace(-3); // -3trace(7 - 2); // 5Operatör önceliği ve ilişkilendirilebilirlikOperatör önceliği ve ilişkilendirilebilirliği, operatörlerin işleneceği sırayı belirler. Derleyicinin, toplama (+)operatöründen önce çarpma (*) operatörünü işlediği aritmetiği bilenler için bu doğal görünse de, derleyicinin ilkolarak hangi operatörlerin işleneceği hakkında açıkça talimatlara ihtiyacı vardır. Bu talimatların hepsi operatör önceliğiolarak ifade edilir. ActionScript, parantez (()) operatörünü kullanarak değiştirebileceğiniz varsayılan bir operatörönceliğini tanımlar. Örneğin, aşağıdaki kod, derleyiciyi çarpma operatöründen önce toplama operatörünü işlemeyezorlamak için önceki örnekteki varsayılan önceliği değiştirir:var sumNumber:uint = (2 + 3) * 4; // uint == 20Aynı önceliğe sahip iki veya daha fazla operatörün aynı ifadede bulunduğu durumlarla karşılaşabilirsiniz. Budurumlarda, derleyici, hangi operatörün önce işleneceğini belirlemek için ilişkilendirilebilirlik kurallarını kullanır.Atama operatörleri dışındaki tüm ikili operatörler sola ilişkilendirilebilir, başka bir deyişle, soldaki operatörler, sağdakioperatörlerden önce işlenir. Atama operatörleri ve koşul (?:) operatörü sağa ilişkilendirilebilir, başka bir deyişle,sağdaki operatörler, soldaki operatörlerden önce işlenir.Örneğin, aynı önceliğe sahip olan küçüktür (<) ve büyüktür (>) operatörlerini göz önünde bulundurun. Aynı ifadedeher iki operatör de kullanılırsa, her iki operatör de sola ilişkilendirilebilir olduğundan, soldaki operatör önce işlenir.Başka bir deyişle, aşağıdaki iki deyim aynı çıktıyı oluşturur:trace(3 > 2 < 1); // falsetrace((3 > 2) < 1); // falseBüyüktür operatörü önce işlenir, bu da, 3 işleneni, 2 işleneninden büyük olduğundan true değerini verir. Daha sonratrue değeri, 1 işleneniyle birlikte küçüktür operatörüne iletilir. Aşağıdaki kod, bu ara durumu temsil eder:
    • 69ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimitrace((true) < 1);Küçüktür operatörü, true değerini 1 sayısal değerine dönüştürür ve bu sayısal değeri ikinci işlenen olan 1 ilekarşılaştırarak false değerini döndürür (1 değeri 1den küçük değildir).trace(1 < 1); // falseParantez operatörüyle, varsayılan sola ilişkilendirilebilirliği değiştirebilirsiniz. Küçüktür operatörünü ve buoperatörün işlenenlerini parantez içine alarak, derleyiciye, ilk önce küçüktür operatörünü işlemesini bildirebilirsiniz.Aşağıdaki örnek, önceki örnekle aynı sayıları kullanarak farklı bir çıktı oluşturmak için parantez operatörünü kullanır:trace(3 > (2 < 1)); // trueKüçüktür operatörü önce işlenir, bu da, 2 işleneni, 1 işleneninden küçük olmadığından false değerini verir. Dahasonra false değeri, 3 işleneniyle birlikte büyüktür operatörüne iletilir. Aşağıdaki kod, bu ara durumu temsil eder:trace(3 > (false));Büyüktür operatörü, false değerini 0 sayısal değerine dönüştürür ve bu sayısal değeri diğer 3 işleneniylekarşılaştırarak true değerini döndürür (3 değeri 0dan büyüktür).trace(3 > 0); // trueAşağıdaki tabloda, azalan öncelik sırasıyla ActionScript 3.0ın operatörleri listelenmektedir. Her tablo satırında, aynıönceliğe sahip operatörler bulunmaktadır. Her operatör satırı, tablonun aşağısında görüntülenen satırdan daha yüksekönceliğe sahiptir.Birincil operatörlerBirincil operatörler arasında, Array ve Object değişmezleri oluşturmak, ifadeleri gruplandırmak, işlevleri çağırmak,sınıf örneklerini başlatmak ve özelliklere erişmek için kullanılan operatörler yer alır.Grup OperatörlerBirincil [] {x:y} () f(x) new x.y x[y] <></> @ :: ..Sonek x++ x--Tekli ++x --x + - ~ ! delete typeof voidÇarpma * / %Toplama + -Bitsel kaydırma << >> >>>İlişkili < > <= >= as in instanceof isEşitlik == != === !==Bitsel AND &Bitsel XOR ^Bitsel OR |Mantıksal AND &&Mantıksal OR ||Koşul ?:Atama = *= /= %= += -= <<= >>= >>>= &= ^= |=Virgül ,
    • 70ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiAşağıdaki tabloda listelendiği gibi, tüm birincil operatörler eşit önceliğe sahiptir. E4X belirtiminin parçası olanoperatörler, (E4X) notasyonuyla belirtilir.Sonek operatörleriSonek operatörleri bir operatörü alır ve değeri artırır veya azaltır. Bu operatörler tekli operatörler olsa da, yükseköncelikleri ve özel davranışları nedeniyle diğer tekli operatörlerden ayrı olarak sınıflandırılır. Sonek operatörü büyükbir ifadenin parçası olarak kullanıldığında, sonek operatörü işlenmeden önce ifadenin değeri döndürülür. Örneğin,aşağıdaki kod, değer artırılmadan önce xNum++ ifadesinin değerinin nasıl döndürüldüğünü gösterir:var xNum:Number = 0;trace(xNum++); // 0trace(xNum); // 1Aşağıdaki tabloda listelendiği gibi, tüm sonek operatörleri eşit önceliğe sahiptir:Tekli operatörlerTekli operatörler tek bir işlenen alır. Bu gruptaki artırma (++) ve azaltma (--) operatörleri, önekoperatörleridir, başkabir deyişle, bunlar bir ifadede işlenenden önce görüntülenir. Önek operatörleri, tüm ifadenin değeri döndürülmedenönce artırma veya azaltma işleminin tamamlanmasıyla sonek eşlerinden farklılık gösterir. Örneğin, aşağıdaki kod,değer artırıldıktan sonra ++xNum ifadesinin değerinin nasıl döndürüldüğünü gösterir:var xNum:Number = 0;trace(++xNum); // 1trace(xNum); // 1Aşağıdaki tabloda listelendiği gibi, tüm tekli operatörler eşit önceliğe sahiptir:Operatör Gerçekleştirilen işlem[] Bir diziyi başlatır{x:y} Bir nesneyi başlatır() İfadeleri gruplandırırf(x) Bir işlevi çağırırnew Bir yapıcıyı çağırırx.y x[y] Bir özelliğe erişir<></> Bir XMLList nesnesini (E4X) başlatır@ Bir niteliğe (E4X) erişir:: Bir adı (E4X) niteler.. Bir alt XML öğesine (E4X) erişirOperatör Gerçekleştirilen işlem++ Artırır (sonek)-- Azaltır (sonek)
    • 71ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiÇarpma operatörleriÇarpma operatörleri iki işlenen alır ve çarpma, bölme veya modulo hesaplamaları yapar.Aşağıdaki tabloda listelendiği gibi, tüm çarpma operatörleri eşit önceliğe sahiptir:Toplama operatörleriToplama operatörleri iki işlenen alır ve toplama veya çıkarma hesaplamaları yapar: Aşağıdaki tabloda listelendiği gibi,tüm toplama operatörleri eşit önceliğe sahiptir:Bitsel kaydırma operatörleriBitsel kaydırma operatörleri iki işlenen alır ve birinci işlenenin bitlerini ikinci işlenen tarafından belirtilen ölçüdekaydırır. Aşağıdaki tabloda listelendiği gibi, tüm bitsel kaydırma operatörleri eşit önceliğe sahiptir:Operatör Gerçekleştirilen işlem++ Artırır (önek)-- Azaltır (önek)+ Tekli +- Tekli - (değilleme)! Mantıksal NOT~ Bitsel NOTdelete Bir özelliği silertypeof Tür bilgilerini döndürürvoid Tanımsız değer döndürürOperatör Gerçekleştirilen işlem* Çarpma/ Bölme% ModuloOperatör Gerçekleştirilen işlem+ Toplama- ÇıkarmaOperatör Gerçekleştirilen işlem<< Bitsel sola kaydırma>> Bitsel sağa kaydırma>>> Bitsel işaretsiz sağa kaydırma
    • 72ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiİlgili operatörlerİlgili operatörler iki işlenen alır, bunların değerlerini karşılaştırır ve bir Boolean değeri döndürür. Aşağıdaki tablodalistelendiği gibi, tüm ilgili operatörler eşit önceliğe sahiptir:Eşitlik operatörleriEşitlik operatörleri iki işlenen alır, bunların değerlerini karşılaştırır ve bir Boolean değeri döndürür. Aşağıdaki tablodalistelendiği gibi, tüm eşitlik operatörleri eşit önceliğe sahiptir:Bitsel mantıksal operatörlerBitsel mantıksal operatörler iki işlenen alır ve bit düzeyinde mantıksal işlemler gerçekleştirir. Bitsel mantıksaloperatörler, öncelikleri konusunda farklılık gösterir ve azalan öncelik sırasıyla aşağıdaki tabloda listelenmektedir:Mantıksal operatörlerMantıksal operatörler iki işlenen alır ve bir Boolean sonucu döndürür. Mantıksal operatörler, öncelikleri konusundafarklılık gösterir ve azalan öncelik sırasıyla aşağıdaki tabloda listelenmektedir:Operatör Gerçekleştirilen işlem< Küçüktür> Büyüktür<= Küçüktür veya eşittir>= Büyüktür veya eşittiras Veri türünü kontrol ederin Nesne özelliklerini kontrol ederinstanceof Prototip zincirini kontrol ederis Veri türünü kontrol ederOperatör Gerçekleştirilen işlem== Eşitlik!= Eşitsizlik=== Katı eşitlik!== Katı eşitsizlikOperatör Gerçekleştirilen işlem& Bitsel AND^ Bitsel XOR| Bitsel OR
    • 73ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiKoşul operatörüKoşul operatörü üçlü operatördür, başka bir deyişle, üç işlenen alır. Koşul operatörü, if..else koşul deyiminiuygulamanın kısayol yöntemidir.Atama operatörleriAtama operatörleri iki işlenen alır ve bir işlenene diğer işlenenin değerini esas alarak bir değer atar. Aşağıdaki tablodalistelendiği gibi, tüm atama operatörleri eşit önceliğe sahiptir:KoşullarActionScript 3.0, program akışını denetlemek için kullanabileceğiniz üç temel koşul deyimi sağlar.if..elseif..else koşul deyimi, bir koşulu test etmenize ve bu koşul varsa bir kod bloğu çalıştırmanıza veya koşul yoksaalternatif bir kod bloğu çalıştırmanıza olanak sağlar. Örneğin, aşağıdaki kod, x değerinin 20 değerini aşıp aşmadığınıtest eder, aşıyorsa bir trace() işlevi oluşturur veya aşmıyorsa farklı bir trace() işlevi oluşturur:Operatör Gerçekleştirilen işlem&& Mantıksal AND|| Mantıksal OROperatör Gerçekleştirilen işlem?: KoşulOperatör Gerçekleştirilen işlem= Atama*= Çarpma ataması/= Bölme ataması%= Modulo ataması+= Toplama ataması-= Çıkarma ataması<<= Bitsel sola kaydırma ataması>>= Bitsel sağa kaydırma ataması>>>= Bitsel işaretsiz sağa kaydırma ataması&= Bitsel AND ataması^= Bitsel XOR ataması|= Bitsel OR ataması
    • 74ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiif (x > 20){trace("x is > 20");}else{trace("x is <= 20");}Alternatif kod bloğu çalıştırmak istemiyorsanız, if deyimini else deyimi olmadan kullanabilirsiniz.if..else ifif..else ifkoşul deyimini kullanarak, birden çok koşul için test yapabilirsiniz. Örneğin, aşağıdaki kod yalnızca xdeğerinin 20 değerini aşıp aşmadığını değil, aynı zamanda x değerinin negatif olup olmadığını da test eder:if (x > 20){trace("x is > 20");}else if (x < 0){trace("x is negative");}Bir if veya else deyiminden sonra yalnızca tek bir deyim geliyorsa, deyimin ayraç içine alınması gerekmez. Örneğin,aşağıdaki kod ayraç kullanmaz:if (x > 0)trace("x is positive");else if (x < 0)trace("x is negative");elsetrace("x is 0");Ancak ayraç bulunmayan bir koşul deyimine daha sonra if deyimleri eklenirse beklenmedik davranışoluşabileceğinden Adobe, her zaman ayraç kullanmanızı önerir. Örneğin, aşağıdaki kodda koşul true olarakdeğerlendirilse de değerlendirilmese de, positiveNums değeri 1 artar:var x:int;var positiveNums:int = 0;if (x > 0)trace("x is positive");positiveNums++;trace(positiveNums); // 1switchAynı koşul ifadesine bağlı birden çok çalıştırma yolunuz varsa switch deyimi kullanışlıdır. Bu, uzun if..else ifdeyimleri dizisine benzer şekilde işlevsellik sağlar ancak daha kolay okunabilir. switch deyimi, bir Boolean değerininkoşulunu test etmek yerine, bir ifade olarak değerlendirilir ve hangi kod bloğunun çalıştırılacağını belirlemek içinsonucu kullanır. Kod blokları bir case deyimiyle başlar ve bir break deyimiyle sona erer Örneğin, aşağıdaki switchdeyimi, Date.getDay() yönteminin döndürdüğü gün sayısını esas alarak haftanın gününü yazdırır:
    • 75ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimivar someDate:Date = new Date();var dayNum:uint = someDate.getDay();switch(dayNum){case 0:trace("Sunday");break;case 1:trace("Monday");break;case 2:trace("Tuesday");break;case 3:trace("Wednesday");break;case 4:trace("Thursday");break;case 5:trace("Friday");break;case 6:trace("Saturday");break;default:trace("Out of range");break;}DöngüDöngü deyimleri, bir değerler veya değişkenler dizisi kullanarak art arda belirli bir kod bloğu gerçekleştirmenizeolanak sağlar. Adobe, kod bloğunu her zaman ayraç ({}) içine almanızı önerir. Kod bloğu yalnızca bir deyim içeriyorsaayraçları çıkarabilseniz de, koşullar için geçerli olan aynı nedenden dolayı bu uygulama önerilmez: bu, daha sonraeklenen deyimlerin yanlışlıkla kod bloğundan hariç tutulması olasılığını artırır. Daha sonra, kod bloğuna dahil etmekistediğiniz bir deyimi eklerseniz ancak gerekli ayraçları koymayı unutursanız, deyim döngünün bir parçası olarakçalıştırılmaz.forfor döngüsü, belirli bir değer aralığı için bir değişkeni yinelemenize olanak sağlar. for deyiminde üç ifade sağlamanızgerekir: başlangıç değerine ayarlı bir değişken, döngünün ne zaman sona ereceğini belirleyen bir koşul deyimi ve herdöngüyle değişkenin değerini değiştiren bir ifade. Örneğin, aşağıdaki kod beş defa döngü sağlar. i değişkeninin değeri0da başlar ve 4te sona erer, çıktı da her biri kendi satırında olan 0 ile 4 arasındaki sayılar olur.var i:int;for (i = 0; i < 5; i++){trace(i);}
    • 76ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimifor..infor..in döngüsü, bir nesnenin özelliklerini veya dizideki öğeleri yineler. Örneğin, genel bir nesnenin özellikleriniyinelemek için bir for..in döngüsünü kullanabilirsiniz (nesne özellikleri belirli bir sırada tutulmaz, bu nedendeözellikler rastgele sırada görüntüleniyor gibi gelebilir):var myObj:Object = {x:20, y:30};for (var i:String in myObj){trace(i + ": " + myObj[i]);}// output:// x: 20// y: 30Bir dizinin öğelerini de yineleyebilirsiniz:var myArray:Array = ["one", "two", "three"];for (var i:String in myArray){trace(myArray[i]);}// output:// one// two// threeBir nesne, kullanıcı tanımlı sınıfın bir örneğiyse, sınıf dinamik bir sınıf olmadığı sürece nesnenin özellikleriniyineleyemezsiniz. Dinamik sınıf örnekleriyle de, yalnızca dinamik olarak eklenen özellikleri yineleyebilirsiniz.for each..infor each..in döngüsü, bir koleksiyonun öğelerini yineler, bu öğeler bir XML veya XMLList nesnesindeki etiketler,nesne özellikleri tarafından tutulan değerler veya bir dizinin öğeleri olabilir. Örneğin, aşağıdaki alıntıda da gösterildiğigibi, genel bir nesnenin özelliklerini yinelemek için for each..in döngüsünü kullanabilirsiniz ancak for..indöngüsünden farklı olarak, for each..in döngüsündeki yineleyici değişken, özelliğin adı yerine özelliğin kendisitarafından tutulan değeri içerir:var myObj:Object = {x:20, y:30};for each (var num in myObj){trace(num);}// output:// 20// 30Aşağıdaki örnekte gösterildiği gibi, bir XML veya XMLList nesnesini yineleyebilirsiniz:
    • 77ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimivar myXML:XML = <users><fname>Jane</fname><fname>Susan</fname><fname>John</fname></users>;for each (var item in myXML.fname){trace(item);}/* outputJaneSusanJohn*/Bu örnekte gösterildiği gibi, bir dizinin öğelerini de yineleyebilirsiniz:var myArray:Array = ["one", "two", "three"];for each (var item in myArray){trace(item);}// output:// one// two// threeBir nesne mühürlenmiş bir sınıf örneğiyse, o nesnenin özelliklerini yineleyemezsiniz. Dinamik sınıf örnekleri için de,sınıf tanımının bölümü olarak tanımlanan özellikler olan sabit özellikleri yineleyemezsiniz.whilewhile döngüsü, koşul true olduğu sürece yinelenen if deyimine benzer. Örneğin, aşağıdaki kod, for döngüsüörneğiyle aynı çıktıyı oluşturur:var i:int = 0;while (i < 5){trace(i);i++;}for döngüsü yerine while döngüsü kullanılmasının bir dezavantajı, sonsuz döngülerin while döngüleriyle dahakolay yazılmasıdır. Sayaç değişkenini artıran ifadeyi çıkarırsanız, for döngüsü örneği derleme yapmaz ancak bu adımıçıkarırsanız while döngüsü örneği derleme yapar. i değerini artıran ifade olmadan döngü sonsuz döngü olur.do..whiledo..while döngüsü, kod bloğu çalıştırıldıktan sonra koşul denetlendiğinden, kod bloğunun en az bir defaçalıştırılmasını garantileyen bir while döngüsüdür. Aşağıdaki kod, koşul karşılanmasa da çıktı oluşturan basit birdo..while döngüsü örneğini göstermektedir:
    • 78ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimivar i:int = 5;do{trace(i);i++;} while (i < 5);// output: 5İşlevlerİşlevler, belirli görevleri gerçekleştirdiğiniz ve programınızda yeniden kullanılabilen kod bloklarıdır. ActionScript3.0da iki tür işlev vardır: yöntemler ve işlev kapanışları. Bir işlevin yöntem veya işlev kapanışı olarak adlandırılması,işlevin tanımlandığı bağlama bağlıdır. Bir işlevi sınıf tanımının parçası olarak tanımlarsanız veya bunu bir nesneörneğine eklerseniz bu işlev yöntem olarak adlandırılır. Bir işlev başka bir şekilde tanımlanırsa, işlev kapanışı olarakadlandırılır.İşlevler ActionScriptte her zaman çok önemli olmuştur. Örneğin, ActionScript 1.0da class anahtar sözcüğü yoktu,bu nedenle “sınıflar” yapıcı işlevleri tarafından tanımlanırdı. Bu nedenle dile class anahtar sözcüğü eklenmiş olsa da,dilin sunması gereken şeylerden tam anlamıyla yararlanmak istiyorsanız, işlevlerin düzgün bir şekilde anlaşılması halaçok önemlidir. ActionScript işlevlerinin C++ veya Java gibi dillerdeki işlevlere benzer şekilde davranmasını bekleyenprogramcılar için bu güçlük yaratabilir. Temel işlev tanımı ve çağırma işlemi deneyimli programcılar için güçlükoluşturmasa da, ActionScript işlevlerinin daha gelişmiş olan bazı özelliklerinin açıklanması gerekir.Temel işlev kavramlarıBu bölümde, temel işlev tanımı ve çağırma teknikleri ele alınmaktadır.İşlevleri çağırmaBir işlevin, ardından parantez operatörü (()) gelen tanımlayıcısını kullanarak o işlevi çağırabilirsiniz. İşlevegöndermek istediğiniz herhangi bir işlev parametresini kapsamak için parantez operatörünü kullanırsınız. Örneğin,bu kitapta, ActionScript 3.0da üst düzey işlev olan trace() işlevi kullanılmıştır:trace("Use trace to help debug your script");Herhangi bir parametre içermeyen bir işlevi çağırıyorsanız, boş bir parantez çifti kullanmanız gerekir. Örneğin,rastgele bir sayı oluşturmak için, herhangi bir parametre almayan Math.random() yöntemini kullanabilirsiniz:var randomNum:Number = Math.random();Kendi işlevlerinizi tanımlamaActionScript 3.0da bir işlevi tanımlamanın iki yolu vardır: bir işlev deyimini veya işlev ifadesini kullanabilirsiniz.Seçtiğiniz teknik, daha statik veya daha dinamik bir programlama stili seçmenize bağlıdır. Statik veya katı modprogramlamayı tercih ediyorsanız işlevlerinizi işlev deyimleriyle tanımlayın. Aksini yapmanız gerekiyorsa, işlevleriniziişlev ifadeleriyle tanımlayın. İşlev ifadeleri, dinamik veya standart mod programlamada daha sık kullanılır.İşlev deyimleriİşlev deyimleri, katı modda işlevleri tanımlamak için tercih edilen tekniktir. Bir işlev deyimi, function anahtarsözcüğüyle başlar ve şunlarla devam eder:• İşlev adı• Parantez içindeki virgül sınırlı bir listede yer alan parametreler
    • 79ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimi• İşlev gövdesi—başka bir deyişle, işlev çağrıldığında çalıştırılacak, küme ayracı içine alınmış ActionScript koduÖrneğin, aşağıdaki kod, bir parametreyi tanımlayan bir işlev oluşturur ve sonra parametre değeri olarak “ hello"dizesini kullanarak işlevi çağırır:function traceParameter(aParam:String){trace(aParam);}traceParameter("hello"); // helloİşlev ifadeleriBir işlev bildirmenin ikinci yolu, aynı zamanda bazen bir işlev değişmezini veya adsız işlevi çağıran işlev ifadesiyle biratama deyiminin kullanılmasıdır. Bu, önceki ActionScript sürümlerinde yaygın olarak kullanılan daha ayrıntılı biryöntemdir.İşlev ifadesi içeren bir atama deyimi, var anahtar sözcüğüyle başlar ve şunlarla devam eder:• İşlev adı• İki nokta operatörü (:)• Veri türünü belirtecek Function sınıfı• Atama operatörü (=)• function anahtar sözcüğü• Parantez içindeki virgül sınırlı bir listede yer alan parametreler• İşlev gövdesi—başka bir deyişle, işlev çağrıldığında çalıştırılacak, küme ayracı içine alınmış ActionScript koduÖrneğin, aşağıdaki kod, bir işlev ifadesi kullanarak traceParameter işlevini bildirir:var traceParameter:Function = function (aParam:String){trace(aParam);};traceParameter("hello"); // helloİşlev deyiminde yaptığınız gibi bir işlev adı belirtmediğinize dikkat edin. İşlev ifadeleri ile işlev deyimleri arasındakibaşka bir önemli fark, işlev ifadesinin deyim yerine bir ifade olmasıdır. Başka bir deyişle, bir işlev ifadesi, işlevdeyimi gibi tek başına duramaz. İşlev ifadesi yalnızca bir deyimin parçası olarak kullanılabilir ve bu genellikle biratama deyimi olur. Aşağıdaki örnek, bir dizi örneğine atanmış işlev ifadesini gösterir:var traceArray:Array = new Array();traceArray[0] = function (aParam:String){trace(aParam);};traceArray[0]("hello");Deyimler ile ifadeler arasında tercih yapmaGenel bir kural olarak, belirli koşullar bir ifade kullanımını gerektirmediği sürece, işlev deyimini kullanın. İşlevdeyimleri daha az ayrıntılıdır ve katı mod ile standart mod arasında işlev ifadelerine göre daha tutarlı bir deneyimsağlar.
    • 80ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiİşlev deyimlerinin okunması, işlev ifadelerini içeren atama deyimlerinden daha kolaydır. İşlev deyimleri kodunuzudaha kısa hale getirir; hem var hem de function anahtar sözcüklerini kullanmanızı gerektiren işlev ifadelerindendaha az karmaşıktır.İşlev deyimleri, bir işlev deyimi kullanılarak bildirilmiş bir yöntemi çağırmak için nokta sözdizimini hem katı hem destandart modda kullanabilmenize olanak sağladığından, iki derleyici modu arasında daha tutarlı bir deneyim sağlar.Bu bir işlev ifadesiyle bildirilmiş yöntemler için her zaman geçerli değildir. Örneğin, aşağıdaki kod, iki yöntemleExample adında bir sınıfı tanımlar: bir işlev ifadesiyle bildirilen methodExpression() yöntemi ve bir işlev deyimiyleçağrılan methodStatement() yöntemi. Katı modda, methodExpression() yöntemini çağırmak için noktasözdizimini kullanamazsınız.class Example{var methodExpression = function() {}function methodStatement() {}}var myEx:Example = new Example();myEx.methodExpression(); // error in strict mode; okay in standard modemyEx.methodStatement(); // okay in strict and standard modesİşlev deyimleri, çalışma zamanını veya dinamik davranışı esas alan programlamalar için daha uygun olarakdeğerlendirilir. Katı modu kullanmayı tercih ediyorsanız ancak diğer yandan bir işlev ifadesiyle bildirilmiş bir yöntemiçağırmanız gerekiyorsa, iki teknikten herhangi birini kullanabilirsiniz. İlk olarak, köşeli ayraçları ([]) nokta (.)operatörü yerine kullanarak yöntemi çağırabilirsiniz. Aşağıdaki yöntem çağrısı hem katı modda hem de standartmodda başarılı olur:myExample["methodLiteral"]();İkinci olarak, sınıfın tamamını dinamik sınıf olarak bildirebilirsiniz. Bu, nokta operatörünü kullanarak yöntemiçağırmanıza olanak sağlasa da, bunun dezavantajı, söz konusu sınıfın tüm örnekleri için bazı katı mod işlevselliğindentaviz vermenizdir. Örneğin, bir dinamik sınıf örneğinde tanımsız bir özelliğe erişmeyi denerseniz, derleyici bir hataoluşturmaz.İşlev ifadelerinin kullanışlı olduğu bazı koşullar vardır. İşlev ifadelerinin yaygın olarak kullanıldığı koşullardan biri,yalnızca bir defa kullanılan ve sonra atılan işlevlerdir. Daha az yaygın olarak da bir işlevin bir prototip özelliğineeklenmesi için kullanılabilir. Daha fazla bilgi için, bkz. “Prototip nesnesi” sayfa 118.İşlev deyimleri ile işlev ifadeleri arasında, kullanılacak tekniği seçerken dikkate almanız gereken iki küçük fark vardır.Birinci fark, işlev ifadelerinin bellek yönetimi ve çöp toplamaya göre nesneler olarak bağımsız şekilde bulunmamasıdır.Başka bir deyişle, dizi öğesi veya nesne özelliği gibi başka bir nesneye bir işlev ifadesi atadığınızda, kodunuzda yalnızcao işlev ifadesine başvuru oluşturursunuz. İşlev ifadenizin eklendiği dizi veya nesne kapsam dışına çıkarsa ya da artıkkullanılamazsa, artık işlev ifadesine erişemezsiniz. Dizi veya nesne silinirse, işlev ifadesinin kullandığı bellek, çöptoplama için uygun olur; başka bir deyişle, bellek başka amaçlar için geri istenmeye ve yeniden kullanılmaya uygun olur.Aşağıdaki örnek, bir işlev ifadesi için, ifadenin atandığı özellik silindikten sonra işlevin artık kullanılamadığınıgösterir. Test sınıfı dinamiktir, başka bir deyişle, bir işlev ifadesi içeren functionExp adında bir özellikekleyebilirsiniz. functionExp() işlevi nokta operatörüyle çağrılabilir, ancak functionExp özelliği silindikten sonraartık işleve erişilemez.
    • 81ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimidynamic class Test {}var myTest:Test = new Test();// function expressionmyTest.functionExp = function () { trace("Function expression") };myTest.functionExp(); // Function expressiondelete myTest.functionExp;myTest.functionExp(); // errorDiğer bir yandan, işlev ilk olarak bir işlev deyimiyle tanımlanırsa, kendi nesnesi olarak varolur ve siz işlevin eklendiğiözelliği sildikten sonra da işlev varolmaya devam eder. delete operatörü yalnızca nesnelerin özelliklerinde çalışır, bunedenle, stateFunc() işlevini silme çağrısı çalışmaz.dynamic class Test {}var myTest:Test = new Test();// function statementfunction stateFunc() { trace("Function statement") }myTest.statement = stateFunc;myTest.statement(); // Function statementdelete myTest.statement;delete stateFunc; // no effectstateFunc();// Function statementmyTest.statement(); // errorİşlev deyimleri ile işlev ifadeleri arasındaki ikinci bir fark, işlev deyimlerinin, işlev deyiminden önce görüntülenendeyimler de dahil olmak üzere, tanımlandıkları kapsamda varolmalarıdır. İşlev ifadeleri, bunun tersine yalnızcasonraki deyimler için tanımlanır. Örneğin, aşağıdaki kod tanımlanmadan önce scopeTest() işlevini başarıylaçağırırsa:statementTest(); // statementTestfunction statementTest():void{trace("statementTest");}İşlev ifadeleri, tanımlanmadan önce kullanılamaz, bu nedenle de aşağıdaki kod bir çalışma zamanı hatası oluşturur:expressionTest(); // run-time errorvar expressionTest:Function = function (){trace("expressionTest");}İşlevlerden değerleri döndürmeİşlevinizden bir değer döndürmek için, ardından, döndürmek istediğiniz ifade veya değişmez değerin geldiği returndeyimini kullanın. Örneğin, aşağıdaki kod, parametreyi temsil eden bir ifade döndürür:function doubleNum(baseNum:int):int{return (baseNum * 2);}return deyiminin işlevi sonlandırdığına dikkat edin, böylece aşağıdaki gibi, return deyiminin aşağısındaki deyimlerçalıştırılmaz:
    • 82ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimifunction doubleNum(baseNum:int):int {return (baseNum * 2);trace("after return"); // This trace statement will not be executed.}Katı modda, bir döndürme türü belirtmeyi seçerseniz, ilgili türde bir değer döndürmeniz gerekir. Örneğin, aşağıdakikod geçerli bir değer döndürmediğinden, katı modda bir hata oluşturur:function doubleNum(baseNum:int):int{trace("after return");}Yuvalanmış işlevlerİşlevleri yuvalayabilirsiniz, başka bir deyişle, işlevler diğer işlevler içinde bildirilebilir. Yuvalanmış işlevin başvurusuharici koda iletilmediği sürece, yuvalanmış bir işlev yalnızca üst işlevi içinde kullanılabilir. Örneğin, aşağıdaki kod,getNameAndVersion() işlevi içinde iki yuvalanmış işlev bildirir:function getNameAndVersion():String{function getVersion():String{return "10";}function getProductName():String{return "Flash Player";}return (getProductName() + " " + getVersion());}trace(getNameAndVersion()); // Flash Player 10Yuvalanmış işlevler harici koda iletildiğinde, işlev kapanışları olarak iletilir; başka bir deyişle, işlev tanımlandığındakapsamda olan tüm tanımlar işlevde saklanır. Daha fazla bilgi için, bkz. “İşlev kapsamı” sayfa 87.İşlev parametreleriActionScript 3.0, dil kullanımında tecrübesiz olan programcılar için yeni gibi görünen bazı işlev parametreleri işlevlerisağlar. Değere veya başvuruya göre parametre iletme kavramı çoğu programcılara tanıdık gelse de, arguments nesnesive ... (rest)parametresi birçoğu için yeni olabilir.Değere veya başvuruya göre argümanları iletmeÇoğu programlama dilinde, değere veya başvuruya göre argümanları iletme arasındaki ayrımın anlaşılması önemlidir;bu ayrım kodun tasarlanma şeklini etkileyebilir.Değere göre iletilme, argüman değerinin, işlev içinde kullanılmak üzere yerel bir değişkene kopyalanması anlamınagelir. Başvuruya göre iletilme ise gerçek değerin değil, yalnızca argümanın bir başvurusunun iletilmesi anlamına gelir.Gerçek argümanın herhangi bir kopyası oluşturulmaz. Bunun yerine, argüman olarak iletilen değişkenin başvurusuoluşturulur ve işlev içinde kullanılmak üzere yerel değişkene atanır. Yerel değişken, işlev dışındaki bir değişkeninbaşvurusu olarak, size orijinal değişkenin değerini değiştirme yeteneği sağlar.
    • 83ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiActionScript 3.0da, tüm değerler nesneler olarak saklandığından, tüm argümanlar başvuruya göre iletilir. Ancak,Boolean, Number, int, uint ve String gibi ilkel veri türlerine ait olan nesneler, değere göre iletilmiş gibi davranmasınısağlayan özel operatörlere sahiptir. Örneğin, aşağıdaki kod, her ikisi de int türünde olan xParam ve yParam adında ikiparametreyi tanımlayan passPrimitives() adında bir işlev oluşturur. Bu parametreler, passPrimitives()işlevinin gövdesinde bildirilen yerel değişkenlere benzer. İşlev, xValue ve yValue argümanlarıyla çağrılırsa, xParamve yParam parametreleri, xValue ve yValue tarafından temsil edilen int nesnelerinin başvurularıyla başlatılır.Argümanlar ilkel olduğundan, bunlar değere göre iletilmiş gibi davranır. xParam ve yParam öğeleri başlangıçta xValueve yValue nesnelerini içerse de, işlev gövdesi içinde değişkenler üzerinde yapılan tüm değişiklikler bellekte değerlerinyeni kopyalarını oluşturur.function passPrimitives(xParam:int, yParam:int):void{xParam++;yParam++;trace(xParam, yParam);}var xValue:int = 10;var yValue:int = 15;trace(xValue, yValue);// 10 15passPrimitives(xValue, yValue); // 11 16trace(xValue, yValue);// 10 15passPrimitives() işlevi içinde, xParam ve yParam değerleri artırılır ancak bu, son trace deyiminde gösterildiğigibi, xValue ve yValue değerlerini etkilemez. İşlevin içindeki xValue ve yValue öğeleri, bellekte, işlev dışında aynıaddaki değişkenlerden ayrı olarak varolan yeni konumları işaret ettiğinden, parametreler xValue ve yValuedeğişkenleriyle aynı şekilde adlandırılsaydı da bu durum geçerli olurdu.Diğer tüm nesneler—başka bir deyişle, ilkel veri türünde olmayan nesneler—her zaman başvuruya göre iletilir ve buda size orijinal değişkenin değerini değiştirme yeteneği sağlar. Örneğin, aşağıdaki kod, x ve y olmak üzere iki özellikleobjVar adında bir nesne oluşturur. passByRef() işlevine argüman olarak iletilen nesne. Nesne ilkel türdeolmadığından, yalnızca başvuruya göre iletilmekle kalmaz aynı zamanda başvuru olmaya devam eder. Başka birdeyişle, işlev içinde parametreler üzerinde yapılan değişiklikler, işlev dışındaki nesne özelliklerini etkiler.function passByRef(objParam:Object):void{objParam.x++;objParam.y++;trace(objParam.x, objParam.y);}var objVar:Object = {x:10, y:15};trace(objVar.x, objVar.y); // 10 15passByRef(objVar); // 11 16trace(objVar.x, objVar.y); // 11 16objParam parametresi, genel objVar değişkeniyle aynı nesneye başvurur. Örnekteki trace deyimlerinde degörebileceğiniz gibi, objParam nesnesinin x ve y özellikleri üzerinde yapılan değişiklikler, objVar nesnesindeyansıtılır.
    • 84ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiVarsayılan parametre değerleriActionScript 3.0daki bir yenilik de, bir işlev için varsayılan parametre değerleri bildirme yeteneğidir. Varsayılanparametre değerleri içeren bir işleve yapılan çağrı, varsayılan değerleri içeren bir parametreyi çıkarırsa, o parametreiçin işlev tanımında belirtilen değer kullanılır. Varsayılan değerlere sahip tüm parametrelerin parametre listesininsonuna yerleştirilmesi gerekir. Varsayılan değer olarak atanan değerlerin derleme zamanı sabitleri olması gerekir. Birparametre için varsayılan bir değerin olması, o parametreyi etkili şekilde isteğe bağlı parametre yapar. Varsayılan değeriçermeyen bir parametre, zorunlu parametre olarak değerlendirilir.Örneğin, aşağıdaki kod üç parametre içeren bir işlev oluşturur, bu parametrelerin ikisi varsayılan değerleri içerir.Yalnızca bir parametreyle işlev çağrıldığında, parametrelerin varsayılan değerleri kullanılır.function defaultValues(x:int, y:int = 3, z:int = 5):void{trace(x, y, z);}defaultValues(1); // 1 3 5arguments nesnesiBir işleve parametreler iletildiğinde, işlevinize iletilen parametreler hakkındaki bilgilere erişmek için argumentsnesnesini kullanabilirsiniz. arguments nesnesinin önemli yönlerinden bazıları şunlardır:• arguments nesnesi, işleve iletilen tüm parametreleri içeren bir dizidir.• arguments.length özelliği, işleve iletilen parametrelerin sayısını bildirir.• arguments.callee özelliği, işlevin kendisine bir başvuru sağlar, bu da işlev ifadelerine yapılan yinelemeli çağrılariçin kullanışlıdır.Not: Herhangi bir parametre arguments olarak adlandırılırsa veya ... (rest) parametresini kullanırsanız,arguments nesnesi kullanılamaz.İşlev gövdesinde arguments nesnesie başvurulursa, ActionScript 3.0, işlev çağrılarının, işlev tanımındatanımlananlardan daha fazla parametre içermesine olanak sağlar, ancak parametre sayısı, zorunlu parametre (veisteğe bağlı olarak isteğe bağlı parametre) sayısıyla eşleşmezse, bu katı modda bir derleyici hatası oluşturur. İşlevtanımında tanımlansa da tanımlanmasa da, işleve iletilen herhangi bir parametreye erişmek için argumentsnesnesinin dizi yönünü kullanabilirsiniz. Yalnızca standart modda derleme yapan aşağıdaki örnek,traceArgArray() işlevine iletilen tüm parametreleri izlemek için arguments.length özelliğiyle birliktearguments dizisini kullanır:function traceArgArray(x:int):void{for (var i:uint = 0; i < arguments.length; i++){trace(arguments[i]);}}traceArgArray(1, 2, 3);// output:// 1// 2// 3
    • 85ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiarguments.callee özelliği genellikle yineleme oluşturmak için adsız işlevlerde kullanılır. Kodunuza esneklikkatmak için bunu kullanabilirsiniz. Yinelemeli işlevin adı, geliştirme döngünüzde değişirse, işlev adı yerinearguments.callee öğesini kullanıyorsanız, işlev gövdenizde yinelemeli çağrıyı değiştirmekle ilgili endişeduymanız gerekmez. Yinelemeyi etkinleştirmek için, aşağıdaki işlev ifadesinde arguments.callee özelliğikullanılır:var factorial:Function = function (x:uint){if(x == 0){return 1;}else{return (x * arguments.callee(x - 1));}}trace(factorial(5)); // 120İşlev bildiriminizde ... (rest) parametresini kullanırsanız, arguments nesnesini kullanamazsınız. Bunun yerine,parametreler için bildirdiğiniz parametre adlarını kullanarak parametrelere erişmeniz gerekir.Ayrıca parametre adı olarak "arguments" dizesini kullanmaktan kaçınmalısınız, aksi takdirde bu, argumentsnesnesini gölgeler. Örneğin, bir arguments parametresi eklenecek şekilde traceArgArray() işlevi yenidenyazılırsa, işlev gövdesinde arguments öğesine başvurular, arguments nesnesini değil, parametreyi ifade eder.Aşağıdaki kod herhangi bir çıktı oluşturmaz:function traceArgArray(x:int, arguments:int):void{for (var i:uint = 0; i < arguments.length; i++){trace(arguments[i]);}}traceArgArray(1, 2, 3);// no outputÖnceki ActionScript sürümlerinde bulunan arguments nesnesi de geçerli işlevi çağıran işlevin başvurusuniteliğindeki caller adında bir özellik içerirdi. caller özelliği ActionScript 3.0da yoktur ancak çağıran işlevebaşvuru gerekiyorsa, çağıran işlevi, başvurunun kendisi olan fazladan bir parametreyi iletecek şekildedeğiştirebilirsiniz.... (rest) parametresiActionScript 3.0, ... (rest) parametresi adında yeni bir parametre içerir. Bu parametre, virgül sınırlı herhangi bir sayıdaargümanı kabul eden bir dizi parametresi belirtmenize olanak sağlar. Parametre, ayrılmış sözcükler dışında herhangibir ada sahip olabilir. Bu parametre bildiriminin belirtilen son parametre olması gerekir. Bu parametreninkullanılması, arguments nesnesini kullanılamaz duruma getirir. ... (rest) parametresi, arguments dizisi vearguments.length özelliğiyle aynı işlevselliği verse de, bu, arguments.callee tarafından sağlanan işlevselliğebenzer bir işlevsellik sağlamaz. ... (rest) parametresini kullanmadan önce arguments.callee öğesinikullanmadığınızdan emin olmanız gerekir.
    • 86ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiAşağıdaki örnek, arguments nesnesi yerine ... (rest) parametresini kullanarak traceArgArray() işlevini yenidenyazar:function traceArgArray(... args):void{for (var i:uint = 0; i < args.length; i++){trace(args[i]);}}traceArgArray(1, 2, 3);// output:// 1// 2// 3... (rest) parametresi ayrıca listedeki son parametre olduğu sürece diğer parametrelerle de kullanılabilir. Aşağıdakiörnek, işlevin birinci parametresi (x) int türünde olacak ve ikinci parametre de ... (rest) parametresini kullanacakşekilde traceArgArray() işlevini değiştirir. Birinci parametre artık ... (rest) parametresi tarafından oluşturulandizinin bölümü olmadığından, çıktı birinci değeri atlar.function traceArgArray(x: int, ... args){for (var i:uint = 0; i < args.length; i++){trace(args[i]);}}traceArgArray(1, 2, 3);// output:// 2// 3Nesne olarak işlevlerActionScript 3.0daki işlevler nesnelerdir. Bir işlev oluşturduğunuzda, yalnızca başka bir işleve parametre olarakiletilmekle kalmayan aynı zamanda kendisine eklenmiş özellik ve yöntemlerin de bulunduğu bir nesneoluşturursunuz.Başka bir işleve argümanlar olarak iletilen işlevler, değere göre değil, başvuruya göre iletilir. Bir işlevi argüman olarakilettiğinizde, yöntemi çağırmak için parantez operatörünü değil yalnızca tanımlayıcıyı kullanırsınız. Örneğin,aşağıdaki kod, addEventListener() yöntemine argüman olarak clickListener() adında bir işlev iletir:addEventListener(MouseEvent.CLICK, clickListener);Array.sort() yöntemi ayrıca bir işlevi kabul eden bir parametreyi de tanımlar. Array.sort() işlevine argümanolarak kullanılan özel bir sıralama işlevi örneği için, bkz. “Diziyi sıralama” sayfa 159.
    • 87ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiActionScripti ilk defa kullanan programcılar için bu garip görünse de, işlevler tıpkı diğer nesneler gibi özelliklere veyöntemlere sahip olabilir. Aslında, her işlev, kendisi için tanımlı parametrelerin sayısını saklayan length adında saltokunur bir özelliğe sahiptir. Bu, işleve gönderilen argümanların sayısını bildiren arguments.length özelliğindenfarklıdır. ActionScriptte, bir işleve gönderilen argüman sayısının, o işlev için tanımlanmış parametre sayısınıaşabileceğini unutmayın. Katı mod, iletilen argümanların sayısı ile tanımlanan parametrelerin sayısı arasında tameşleşme gerektirdiğinden yalnızca standart modda derleme yapan aşağıdaki örnek, iki özellik arasındaki farkı gösterir:// Compiles only in standard modefunction traceLength(x:uint, y:uint):void{trace("arguments received: " + arguments.length);trace("arguments expected: " + traceLength.length);}traceLength(3, 5, 7, 11);/* output:arguments received: 4arguments expected: 2 */Standart modda, kendi işlev özelliklerinizi işlev gövdesinin dışında tanımlayabilirsiniz. İşlev özellikleri, işlevle ilgili birdeğişkenin durumunu kaydetmenize olanak sağlayan yarı durağan özellikler görevi görebilir. Örneğin, belirli birişlevin kaç defa çağrıldığını izlemek isteyebilirsiniz. Bir oyun yazıyorsanız ve bir kullanıcının belirli bir komutu kaçdefa kullandığını izlemek istiyorsanız, statik sınıf özelliği kullanabilseniz de, bu işlevsellik kullanışlı olabilir. Katı mod,işlevlere dinamik özellikler eklemenize olanak sağlamadığından yalnızca standart modda derleme yapan aşağıdakiörnek, işlev bildirimi dışında bir işlev özelliği oluşturur ve işlev her çağrıldığında özelliği artırır:// Compiles only in standard modevar someFunction:Function = function ():void{someFunction.counter++;}someFunction.counter = 0;someFunction();someFunction();trace(someFunction.counter); // 2İşlev kapsamıBir işlevin kapsamı, yalnızca programın neresinde işlevin çağrılabileceğini değil, işlevin hangi tanımlara erişebildiğinide belirler. Değişken tanımlayıcıları için geçerli olan aynı kapsam kuralları, işlev tanımlayıcıları için de geçerlidir.Genel kapsamda bildirilen bir işlev, tüm kodunuzda kullanılabilir. Örneğin, ActionScript 3.0, kodunuzun herhangi biryerinde kullanılabilir olan isNaN() ve parseInt() gibi genel işlevler içerir. Yuvalanmış bir işlev—başka bir işleviçinde bildirilen bir işlev—bildirildiği işlevin herhangi bir yerinde kullanılabilir.
    • 88ACTIONSCRIPT 3.0I PROGRAMLAMAActionScript dili ve sözdizimiKapsam zinciriBir işlev her çalıştırılmaya başladığında, birçok nesne ve özellik oluşturulur. İlk olarak, işlev gövdesinde bildirilenparametreleri ve yerel değişkenleri veya işlevleri saklayan etkinleştirme nesnesi adında özel bir nesne oluşturulur.Etkinleştirme nesnesi dahili bir mekanizma olduğundan bu nesneye doğrudan erişemezsiniz. İkinci olarak, FlashPlayer veya Adobe AIR uygulamalarının tanımlayıcı bildirimleri için denetleyeceği nesnelerin sıralanmış bir listesiniiçeren bir kapsam zinciri oluşturulur. Çalıştırılan her işlev, dahili bir özellikte saklanan bir kapsam zincirine sahiptir.Yuvalanmış bir işlev için, kapsam zinciri kendi etkinleştirme nesnesiyle başlar ve üst işlevinin etkinleştirme nesnesiyledevam eder. Zincir, genel nesneye ulaşıncaya kadar bu şekilde devam eder. Bir ActionScript programı başlatıldığındagenel bir nesne oluşturulur ve bu nesne tüm genel değişkenleri ve işlevleri içerir.İşlev kapanışlarıİşlev kapanışı, işlevin anlık görüntüsünü ve sözlü ortamını içeren bir nesnedir. İşlevin sözlü ortamı, işlevin değerleriylebirlikte kapsam zincirinde bulunan tüm değişkenleri, özellikleri, yöntemleri ve nesneleri içerir. Nesne veya sınıftanayrı olarak bir işlev her çalıştırıldığında işlev kapanışları oluşturulur. İşlev kapanışlarının tanımlandıkları kapsamdabulunması, bir işlev farklı bir kapsama bir argüman veya bir döndürme değeri olarak iletildiğinde ilginç sonuçlaroluşturur.Örneğin, aşağıdaki kod iki işlev oluşturur: bir dikdörtgenin alanını hesaplayan rectArea() adında yuvalanmış birişlevi döndüren foo() ve foo() öğesini çağırıp döndürülen işlev kapanışını myProduct adında bir değişkendesaklayan bar(). bar() işlevi, kendi x yerel değişkenini (2 değeriyle) tanımlasa da, myProduct() işlev kapanışıçağrıldığında bu, foo() i levinde tanımlı x de i kenini (40 de eriyle) içerir. Bu nedenle de bar()işlevi, 8 değerini değil, 160 değerini döndürür.function foo():Function{var x:int = 40;function rectArea(y:int):int // function closure defined{return x * y}return rectArea;}function bar():void{var x:int = 2;var y:int = 4;var myProduct:Function = foo();trace(myProduct(4)); // function closure called}bar(); // 160Yöntemler, oluşturuldukları sözlü ortamla ilgili bilgi içermeleri yönünden benzer şekilde davranır. Bir yöntem,örneğinden ayıklanıp bağımlı bir yöntem oluşturduğunda bu özellik en belirgin durumda olur. İşlev kapanışı ilebağımlı yöntem arasındaki ana fark, bir işlev kapanışında thisanahtar sözcüğünün değeri değişebilirken, bağımlıyöntemdeki this anahtar sözcüğünün değerinin her zaman başlangıçta eklendiği örneği ifade etmesidir. Daha fazlabilgi için, bkz. “Yöntemler” sayfa 96.
    • 89Bölüm 5: ActionScriptte nesne tabanlıprogramlamaBu bölümde, ActionScript uygulamasının, nesne tabanlı programlamayı (OOP) destekleyen öğeleri açıklanmaktadır.Nesne tasarımı, soyutlama, kapsülleme, miras ve çok biçimlilik gibi genel OOP ilkeleri bu bölümde ele alınmamıştır.Bu bölüm daha çok ActionScript 3.0 kullanılarak bu ilkelerin nasıl uygulandığını açıklamaktadır.ActionScript’in komut dosyası oluşturma dili olarak köklerinden dolayı, ActionScript 3.0 OOP desteği isteğe bağlıdır.Bu, programcılara çeşitli kapsam ve karmaşıklık düzeyine sahip projeleri için en iyi yaklaşımı seçmelerinde esnekliksağlar. Küçük görevler için, yalnızca prosedür gereği programlama paradigması ile ActionScriptin kullanılmasınınyeterli olduğunu düşünebilirsiniz. Daha büyük projeler için OOP ilkelerinin uygulanması, kodunuzun anlaşılmasını,korunmasını ve genişletilmesini kolaylaştırabilir.Nesne tabanlı programlama temelleriNesne tabanlı programlamaya girişNesne tabanlı programlama (OOP), bir programdaki kodların nesneler (bilgi (veri değerleri) ve işlevler içeren ayrı ayrıöğeler) halinde gruplandırılarak organize edilmesinin bir yoludur. Programı organize etmek için nesne tabanlı biryaklaşım kullanılması, belirli bilgileri (örneğin, albüm başlığı, parça başlığı veya sanatçı adı gibi müzik bilgileri), obilgiyle ilişkilendirilmiş ortak işlevler veya eylemlerle ("çalma listesine ekleme" veya "tüm şarkıları sanatçıya göreçalma") birlikte gruplandırmanıza olanak sağlar. Bu öğeler, nesne adı verilen tek bir öğede (örneğin, bir “Album” veya“MusicTrack”) birleştirilir. Bu değerlerin ve işlevlerin birlikte gruplandırılabilmesi, örneğin, birden çok değişkenyerine yalnızca bir değişkenin izlenmesinin gerekmesi, ilgili işlevlerin bir arada organize edilmesi ve programlarıngerçek dünyadakine benzer şekilde yapılandırılabilmesi gibi birçok avantaj sağlar.Ortak nesne tabanlı programlama görevleriUygulamada, nesne tabanlı programlama iki bölüm içerir. Bu bölümlerden biri, program tasarlama stratejileri veteknikleridir (genellikle nesne tabanlı tasarım olarak adlandırılır). Bu geniş bir konu olup bu bölümde elealınmamıştır. OOPnin diğer bölümü ise, nesne tabanlı bir yaklaşım kullanan program oluşturulması için belirli birprogramlama dilinde kullanılabilir olan gerçek programlama yapılarıdır. Bu bölümde, OOPdeki şu ortak görevleraçıklanmaktadır:• Sınıfları tanımlama• Özellikler, yöntemler ve alma ve ayarlama erişimcileri (erişimci yöntemleri) oluşturma• Sınıflara, özelliklere, yöntemlere ve erişimcilere erişimi denetleme• Statik özellikler ve yöntemler oluşturma• Numaralandırmaya benzer yapılar oluşturma• Arabirimleri tanımlama ve kullanma• Sınıf öğelerini geçersiz kılma da dahil, miras ile çalışma
    • 90ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaÖnemli kavramlar ve terimlerAşağıdaki başvuru listesinde, bu bölümde karşınıza çıkacak önemli terimler bulunmaktadır:• Nitelik: Sınıf tanımında bir sınıf öğesine (örn. bir özellik veya yöntem) atanan özellik. Nitelikler genellikle,programın diğer bölümlerindeki kodlar tarafından özellik veya yöntemin erişilebilir olup olmayacağınıtanımlamak için kullanılır. Örneğin, private ve public niteliklerdir. Özel bir yöntem yalnızca sınıfın içindeki kodtarafından çağrılabilirken genel bir yöntem programdaki herhangi bir kod tarafından çağrılabilir.• Sınıf: Belirli bir türdeki nesnelerin yapı ve davranışının tanımı (bu veri türündeki nesnelerin bir şablonu veyaşeması gibi).• Sınıf hiyerarşisi: Hangi sınıfların diğer sınıflardan miras aldığını belirten, ilişkili birden çok sınıfın yapısı.• Yapıcı: Sınıfın örneği oluşturulduğunda çağrılan, bir sınıfta tanımlayabildiğiniz özel bir yöntem. Yapıcı genelliklevarsayılan değerleri belirtmek veya nesne için kurulum işlemlerini gerçekleştirmek için kullanılır.• Veri türü: Belirli bir değişkenin saklayabildiği bilgi türü. Genellikle veri türü ile sınıf aynı anlamdadır.• Nokta operatörü: ActionScriptte (ve diğer birçok programlama dilinde), bir adın, bir nesnenin alt öğesini (örn. birözellik ya da yöntem) ifade ettiğini belirtmek için kullanılan nokta işareti (.). Örneğin, myObject.myPropertyifadesinde nokta operatörü, myProperty teriminin, myObject adındaki nesnenin öğesi olan bir değeri ifade ettiğinibelirtir.• Numaralandırma: Tek bir sınıfın özellikleri olarak rahatlık sağlaması için birlikte gruplandırılmış ilgili sabitdeğerleri kümesi.• Miras: Bir sınıf tanımının, farklı bir sınıf tanımının tüm işlevlerini içermesine (ve genellikle bu işleve katkıdabulunmasına ) olanak sağlayan OOP mekanizması.• Örnek: Bir programda oluşturulmuş gerçek bir nesne.• Ad alanı: Temel anlamda, kodun diğer koda erişmesi konusunda daha düzgün denetim sağlayan özel bir nitelik.Bölüm içi örneklerle çalışmaBu bölümde çalışırken örnek kod listelerinin bazılarını test etmek isteyebilirsiniz. Bu bölümdeki kod listeleri öncelikliolarak veri türlerinin tanımlanması ve işlenmesiyle ilgili olduğundan, örneklerin test edilmesi işlemi kapsamında,tanımlanan sınıfın bir örneğinin oluşturulması, örneğin özellikleri ya da yöntemleri kullanılarak işlenmesi ve dahasonra bu örneğin özelliklerinin değerlerinin görüntülenmesi yer alır. Bu değerleri görüntülemek için, SahneAlanındaki metin alanı örneğine değerleri yazmak veya değerleri Çıktı panelinde yazdırmak için trace() işlevinikullanmak isteyebilirsiniz. Bu teknikler, “Bölüm içi örnek kod listelerini test etme” sayfa 34 bölümünde ayrıntılışekilde açıklanmıştır.SınıflarSınıf, bir nesnenin soyut temsilidir. Sınıfta, bir nesnenin barındırabileceği veri türleri ve nesnenin sergileyebileceğidavranışlar hakkında bilgiler yer alır. Böyle bir soyutlamanın yararı, yalnızca birbiriyle etkileşim kuran birkaçnesnenin yer aldığı küçük komut dosyaları yazdığınızda belirgin olmayabilir. Ancak programın kapsamı genişledikçeve yönetilmesi gereken nesne sayısı arttıkça, nesnelerin nasıl oluşturulduğu ve birbiriyle nasıl etkileşim kurduğukonusunda sınıfların size daha iyi denetim sağladığını fark edebilirsiniz.
    • 91ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaActionScript 1.0a kadar ActionScript programcıları, sınıflara benzeyen yapılar oluşturmak için Function nesnelerinikullanabilirdi. ActionScript 2.0 ise class ve extends gibi anahtar sözcüklerle sınıflar için biçimsel destek ekledi.ActionScript 3.0, hem ActionScript 2.0da ilk defa sunulan anahtar sözcüklerini desteklemeye devam eder hem deprotected ve internal nitelikleriyle gelişmiş erişim denetimi ve final ve override anahtar sözcükleriyle mirasüzerinden daha iyi denetim gibi yeni yetenekler de içerir.Java, C++ veya C# gibi programlama dillerinde sınıf oluşturduysanız, ActionScriptin de benzer bir deneyimsunduğunu göreceksiniz. ActionScript, ilerleyen bölümlerde her biri ele alınan class, extends ve public gibi aynıanahtar sözcüklerin ve nitelik adlarının çoğunu paylaşır.Not: Bu bölümde, özellik terimiyle değişkenler, sabitler ve yöntemler gibi herhangi bir nesne veya sınıf üyesi ifadeedilmektedir. Ayrıca sınıf ve statik terimleri sık sık birbirinin yerine kullanılsa da, bu bölümde bu terimler birbirindenfarklı şekilde ele alınmıştır. Örneğin, bu bölümde deyim sınıfı özellikleri, yalnızca statik üyeleri değil, bir sınıfın tümüyelerini ifade eder.Sınıf tanımlarıActionScript 3.0 sınıf tanımları, ActionScript 2.0 sınıf tanımlarında kullanılana benzer bir sözdizimi kullanır. Sınıftanımının düzgün sözdizimi, ardından sınıf adının geldiği class anahtar sözcüğüdür. Sınıf adından sonra da, kümeayraçları ({}) içine alınmış sınıf gövdesi gelir. Örneğin, aşağıdaki kod, visible adında tek bir değişken içeren Shapeadında bir sınıf oluşturur:public class Shape{var visible:Boolean = true;}Önemli sözdizimi değişikliklerinden biri, paket içindeki sınıf tanımlarında gerçekleşmiştir. ActionScript 2.0da, birsınıf bir paketin içindeyse, sınıf bildirimine paket adının da dahil edilmesi gerekir. package deyimini ilk defa sunanActionScript 3.0da, paket adının, sınıf bildirimine değil, paket bildirimine dahil edilmesi gerekir. Örneğin, aşağıdakisınıf bildirimleri, flash.display paketinin bir parçası olan BitmapData sınıfının ActionScript 2.0 ve ActionScript 3.0danasıl tanımlandığını gösterir:// ActionScript 2.0class flash.display.BitmapData {}// ActionScript 3.0package flash.display{public class BitmapData {}}Sınıf nitelikleriActionScript 3.0, aşağıdaki dört nitelikten birini kullanarak sınıf tanımlarını değiştirmenize olanak sağlar:Nitelik Tanımdynamic Çalışma zamanında örneklere özellik eklenmesine olanak sağlar.final Başka bir sınıf tarafından genişletilmemelidir.internal (varsayılan) Geçerli paketin içindeki başvurular tarafından görülebilir.public Her yerdeki başvurular tarafından görülebilir
    • 92ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamainternal dışında bu niteliklerin her biri için, ilişkilendirilmiş davranışı elde etmek üzere açıkça niteliği dahil etmenizgerekir. Örneğin, bir sınıfı tanımlarken dynamic niteliğini dahil etmezseniz, çalışma zamanında sınıfa özelliklerekleyemezsiniz. Aşağıdaki kodun gösterdiği gibi, sınıf tanımının başına niteliği yerleştirerek açıkça o niteliği atamışolursunuz:dynamic class Shape {}Listede abstract adında bir nitelik bulunmadığına dikkat edin. Bunun nedeni, abstract sınıflarının ActionScript3.0da desteklenmemesidir. Ayrıca listede private ve protected adındaki niteliklerin de bulunmadığına dikkat edin.Bu nitelikler yalnızca bir sınıf tanımı içinde anlam içerir ve tek başlarına sınıflara uygulanamaz. Bir sınıfın paketdışında herkes tarafından görülebilir olmasını istemiyorsanız, sınıfı bir paketin içine yerleştirin ve internal niteliğiyleişaretleyin. Alternatif olarak, hem internal hem de public niteliklerini çıkarabilirsiniz, böylece derleyici internalniteliğini otomatik olarak sizin için ekler. Bir sınıfın tanımlandığı kaynak dosya dışında görülebilir olmasınıistemiyorsanız, sınıfı paket tanımının kapatma küme ayracının aşağısına, kaynak dosyanızın en altına yerleştirin.Sınıf gövdesiKüme ayraçları içine alınan sınıf gövdesi, sınıfınızın değişkenlerini, sabitlerini ve yöntemlerini tanımlamak içinkullanılır. Aşağıdaki örnek, Adobe Flash Player APIsinde Accessibility sınıfının bildirimini gösterir:public final class Accessibility{public static function get active():Boolean;public static function updateProperties():void;}Bir sınıf gövdesinin içinde bir ad alanını da tanımlayabilirsiniz. Aşağıdaki örnek, bir ad alanının, nasıl sınıf gövdesiiçinde tanımlanabildiğini ve o sınıftaki yöntemin bir niteliği olarak kullanılabildiğini gösterir:public class SampleClass{public namespace sampleNamespace;sampleNamespace function doSomething():void;}ActionScript 3.0, tanımları yalnızca sınıf gövdesine değil, deyimlere de dahil etmenize olanak sağlar. Bir sınıfgövdesinin içinde bulunduğu halde yöntem tanımının dışında bulunan deyimler, tam olarak bir defa çalıştırılır—sınıftanımıyla ilk karşılaşılıp ilişkilendirilmiş sınıf nesnesi oluşturulduğunda. Aşağıdaki örnek, hello() adındaki bir hariciişleve yapılan çağrıyı ve sınıf tanımlandığında onaylama mesajı veren bir trace deyimini içerir:function hello():String{trace("hola");}class SampleClass{hello();trace("class created");}// output when class is createdholaclass createdÖnceki ActionScript sürümlerinin aksine, ActionScript 3.0da, aynı sınıf gövdesinde aynı ada sahip bir statik özelliğinve örnek özelliğinin tanımlanmasına izin verilir. Örneğin, aşağıdaki kod, message adında bir statik değişkeni ve aynıada sahip bir örnek değişkenini bildirir:
    • 93ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaclass StaticTest{static var message:String = "static variable";var message:String = "instance variable";}// In your scriptvar myST:StaticTest = new StaticTest();trace(StaticTest.message); // output: static variabletrace(myST.message); // output: instance variableSınıf özelliği nitelikleriActionScript nesne modeli ele alınırken, property terimi, değişkenler, sabitler ve yöntemler gibi, sınıf öğesi olabilenherhangi bir şeyi ifade eder. Bu, terimin daha dar kapsamda kullanıldığı ve yalnızca değişken olan veya bir alıcı ya daayarlayıcı yöntemi tarafından tanımlanmış sınıf üyelerini içerdiği ActionScript 3.0 Dil ve Bileşenler Başvurusundakikullanım şeklinden farklıdır. ActionScript 3.0da, bir sınıfın herhangi bir özelliğiyle kullanılan bir nitelik kümesivardır. Aşağıdaki tabloda bu nitelik kümesi listelenmektedir.Erişim denetimi ad alanı nitelikleriActionScript 3.0, bir sınıf içinde tanımlanmış özelliklere erişimi denetleyen dört özel nitelik sağlar: public, private,protected ve internal.public niteliği, bir özelliği komut dosyanızın her yerinde görülebilir duruma getirir. Örneğin, bir yöntemi kendipaketinin dışındaki kodlar için kullanılabilir duruma getirmek üzere, yöntemi public niteliğiyle bildirmeniz gerekir.var, const veya function anahtar sözcükleriyle bildirilmiş tüm özellikler için bu geçerlidir.private niteliği, bir özelliğin yalnızca özelliğin tanımlayan sınıfı içindeki çağıranlar tarafından görülebilmesini sağlar.Bu davranış, alt sınıfın bir üst sınıftaki özel özelliğine erişmesine olanak sağlayan, ActionScript 2.0daki privateniteliğinin davranışından farklıdır. Davranıştaki başka bir önemli değişiklik de çalışma zamanı erişimiyle ilgilidir.ActionScript 2.0da, private anahtar sözcüğü yalnızca derleme zamanında erişimi yasaklarken çalışma zamanındakolayca atlatılabilirdi. ActionScript 3.0da ise artık bu durum geçerli değildir. private olarak işaretlenmiş özellikler,derleme zamanında da çalışma zamanında da kullanılamaz.Örneğin, aşağıdaki kod, tek bir değişkenle PrivateExample adında basit bir sınıf oluşturur ve sonra sınıfın dışındanözel değişkene erişmeyi dener. ActionScript 2.0da derleme zamanı erişimi yasaklanırdı ancak derleme zamanındadeğil de çalışma zamanında özellik araması yapan özellik erişimi operatörü ([]) kullanılarak bu yasak kolaycaatlatılabilirdi.Nitelik Tanıminternal (varsayılan) Aynı paketin içindeki başvurular tarafından görülebilir.private Aynı sınıftaki başvurular tarafından görülebilir.protected Aynı sınıftaki ve türetilmiş sınıflardaki başvurular tarafından görülebilir.public Her yerdeki başvurular tarafından görülebilirstatic Sınıf örneklerinin aksine, bir özelliğin bir sınıfa ait olduğunu belirtir.UserDefinedNamespace Kullanıcı tarafından tanımlanmış özel ad alanı adı
    • 94ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaclass PrivateExample{private var privVar:String = "private variable";}var myExample:PrivateExample = new PrivateExample();trace(myExample.privVar);// compile-time error in strict modetrace(myExample["privVar"]); // ActionScript 2.0 allows access, but in ActionScript 3.0, thisis a run-time error.ActionScript 3.0da ise, katı mod kullanıyorsanız, nokta operatörü (myExample.privVar) kullanılarak bir özel özelliğeerişme girişimi, derleme zamanı hatasına yol açar. Aksi takdirde, özellik erişimi operatörü (myExample["privVar"])kullandığınızda olduğu gibi, çalışma zamanında hata bildirilir.Aşağıdaki tabloda, mühürlenmiş (dinamik olmayan) bir sınıfa ait özel özelliğe erişme girişiminin sonuçlarıözetlenmektedir:dynamic niteliğiyle bildirilen sınıflarda, özel bir değişkene erişme girişimi, çalışma zamanı hatasına yol açmaz. Bununyerine değişken yalnızca görünmüyorsa, Flash Player veya Adobe® AIR™, undefined değerini döndürür. Ancak katımodda nokta operatörünü kullanırsanız derleme zamanı hatası oluşur. Aşağıdaki örnek, önceki örnekle aynıdır; tekfarkı, PrivateExample sınıfının bir dinamik sınıf olarak bildirilmesidir:dynamic class PrivateExample{private var privVar:String = "private variable";}var myExample:PrivateExample = new PrivateExample();trace(myExample.privVar);// compile-time error in strict modetrace(myExample["privVar"]); // output: undefinedDinamik sınıflar genellikle, bir sınıf için harici olan bir kod, özel bir özelliğe erişme girişiminde bulunduğunda hataoluşturmak yerine undefined değerini döndürür. Aşağıdaki tabloda, yalnızca katı modda özel bir özelliğe erişmek içinnokta operatörü kullanıldığında bir hata oluşturulduğu gösterilir:ActionScript 3.0da ilk defa sunulan protected niteliği, bir özelliği kendi sınıfı veya alt sınıfı içindeki çağıranlartarafından görülebilir duruma getirir. Başka bir deyişle, protected özelliği kendi sınıfı içinde kullanılabilir veya mirashiyerarşisinde kendisinin aşağısında bulunan sınıflar için kullanılabilir durumdadır. Alt sınıf aynı pakette veya farklıbir pakette de olsa bu durum geçerlidir.ActionScript 2.0a alışkın olanlar için bu işlevsellik, ActionScript 2.0daki private niteliğine benzer. ActionScript 3.0protected niteliği, Javadaki protected niteliğine çok benzer ancak aynı paketteki çağıranlara da erişim izni vererekJava sürümünden farklılık gösterir. protected niteliği, alt sınıfınız için gerekli olan ancak miras zincirinin dışındakikodlardan gizlemek istediğiniz bir değişken veya yönteminiz olduğunda kullanışlıdır.Katı mod Standart modnokta operatörü (.) derleme zamanı hatası çalışma zamanı hatasıayraç operatörü ([]) çalışma zamanı hatası çalışma zamanı hatasıKatı mod Standart modnokta operatörü (.) derleme zamanı hatası undefinedayraç operatörü ([]) undefined undefined
    • 95ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaActionScript 3.0da yeni olan internal niteliği, bir özelliğin kendi paketi içindeki çağıranlar tarafından görülebilirolmasını sağlar. Bu, bir paket içindeki kod için varsayılan nitelik olup aşağıdaki niteliklerden herhangi birine sahipolmayan tüm özellikler için geçerlidir:• public• private• protected• kullanıcı tanımlı bir ad alanıJavada bu erişim düzeyi için açıkça bir ad olmayıp yalnızca başka bir erişim değiştiricisinin çıkarılmasıyla bu erişimdüzeyi elde edilebilse de, internal niteliği, Javadaki varsayılan erişim denetimine benzer. internal niteliği, özelliğiyalnızca kendi paketi içindeki çağıranlar tarafından görülebilir duruma getirme amacınızı açıkça belirtme seçeneğinisize sunar.static niteliğivar, const veya function anahtar sözcükleriyle bildirilmiş özelliklerle kullanılabilen static niteliği, bir özelliğisınıfın örneklerine değil, sınıfa eklemenize olanak sağlar. Sınıf için harici olan kodun, örnek adı yerine sınıf adınıkullanarak statik özellikleri çağırması gerekir.Statik özellikler alt sınıflar tarafından miras alınmaz ancak özellikler, alt sınıfın kapsam zincirinin parçasıdır. Başka birdeyişle, alt sınıfın gövdesi içinde, statik bir değişken veya yöntem tanımlanmış olduğu sınıfa başvurulmadankullanılabilir. Daha fazla bilgi için, bkz. “Statik özellikler miras alınmaz” sayfa 112.Kullanıcı tanımlı ad alanı nitelikleriÖnceden tanımlanmış erişim denetimi niteliklerine alternatif olarak, bir nitelik olarak kullanılmak üzere özel bir adalanı oluşturabilirsiniz. Her tanım için yalnızca bir ad alanı niteliği kullanılabilir ve ad alanı niteliğini, erişim denetiminiteliklerinden herhangi biriyle (public, private, protected, internal) birlikte kullanamazsınız. Ad alanlarınıkullanma hakkında daha fazla bilgi için, bkz. “Ad alanları” sayfa 42.DeğişkenlerDeğişkenler, var veya const anahtar sözcükleriyle bildirilebilir. var anahtar sözcüğüyle bildirilmiş değişkenlerindeğerleri, komut dosyasının çalıştırılması sırasında birden çok defa değişebilir const anahtar sözcükleriyle bildirilendeğişkenler sabitler olarak adlandırılır ve kendilerine yalnızca bir defa atanmış değerlere sahip olabilir. Başlatılmış birsabite yeni bir değer atama girişimi hataya yol açar. Daha fazla bilgi için, bkz. “Sabitler” sayfa 67.Statik değişkenlerStatik değişkenler, static anahtar sözcüğü ile var veya const deyiminin birleşimi kullanılarak bildirilir. Bir sınıförneğine değil, sınıfa eklenen statik değişkenler, nesne sınıfının tamamı için geçerli olan bilgilerin saklanıppaylaşılmasında kullanışlıdır. Örneğin, bir sınıfın başlatılma sayısının hesabını tutmak istiyorsanız veya izin verilenmaksimum sınıf örneği sayısını saklamak istiyorsanız statik değişken uygundur.Aşağıdaki örnek, sınıf başlatma sayısının izlenmesi için totalCount değişkenini ve maksimum başlatma sayısınısaklamak için MAX_NUM sabitini oluşturur. totalCount ve MAX_NUM değişkenleri, belirli bir örneğe değil, bir bütünolarak sınıfa uygulanan değerleri içerdiğinden statiktir.class StaticVars{public static var totalCount:int = 0;public static const MAX_NUM:uint = 16;}
    • 96ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaStaticVars sınıfına ve bu sınıfın alt sınıflarına harici olan kod, yalnızca sınıfın kendisi üzerinden totalCount veMAX_NUM özelliklerine başvurabilir. Örneğin, aşağıdaki kod çalışır:trace(StaticVars.totalCount); // output: 0trace(StaticVars.MAX_NUM); // output: 16Sınıfın bir örneği üzerinden statik değişkenlere erişemezsiniz, bu nedenle de aşağıdaki kod hata döndürür:var myStaticVars:StaticVars = new StaticVars();trace(myStaticVars.totalCount); // errortrace(myStaticVars.MAX_NUM); // errorStaticVars sınıfının MAX_NUM için yaptığı gibi, hem static hem de const anahtar sözcükleriyle bildirilendeğişkenlerin, siz sabiti bildirdiğiniz anda başlatılması gerekir. Yapıcı veya bir örnek yöntemi içinde MAX_NUM öğesinebir değer atayamazsınız. Aşağıdaki kod, statik sabit başlatmanın geçerli bir yolu olmadığından bir hata oluşturur:// !! Error to initialize static constant this wayclass StaticVars2{public static const UNIQUESORT:uint;function initializeStatic():void{UNIQUESORT = 16;}}Örnek değişkenleriÖrnek değişkenleri arasında, var ve const anahtar sözcükleri ile ancak static anahtar sözcüğü olmadan bildirilenözellikler yer alır. Sınıfın tamamı yerine sınıf örneklerine eklenen örnek değişkenler, bir örneğe özgü değerlerinsaklanmasında kullanışlıdır. Örneğin, Array sınıfı, belirli bir Array sınıfının barındırdığı dizi öğelerinin sayısınısaklayan length adında bir örnek özelliğine sahiptir.var veya const olarak bildirilen örnek değişkenleri, bir alt sınıfta geçersiz kılınamaz. Ancak, alıcı ve ayarlayıcıyöntemlerini geçersiz kılarak değişkenlerin geçersiz kılınmasına benzer işlevselliği gerçekleştirebilirsiniz. Daha fazlabilgi için, bkz. “Erişimci yöntemlerini alma ve ayarlama” sayfa 99.YöntemlerYöntemler, bir sınıf tanımının parçası olan işlevlerdir. Sınıfın bir örneği oluşturulduktan sonra, bir yöntem bu örneğebağımlı olur. Sınıf dışında bildirilen bir işlevden farklı olarak yöntem, eklendiği örnekten ayrı şekilde kullanılamaz.Yöntemler, function anahtar sözcüğü kullanılarak tanımlanır. Tüm sınıf özelliklerinde olduğu gibi, özel, korumalı,genel, dahili, statik veya özel ad alanı gibi sınıf özelliği niteliklerinden herhangi birini yöntemlere uygulayabilirsiniz.Şunun gibi bir işlev deyimi kullanabilirsiniz:public function sampleFunction():String {}Veya aşağıdaki gibi bir işlev ifadesi atadığınız bir değişkeni kullanabilirsiniz:public var sampleFunction:Function = function () {}Çoğu durumda, aşağıdaki nedenlerden dolayı işlev ifadesi yerine işlev deyimi kullanmayı isterseniz:• İşlev deyimleri daha kısa ve okunması daha kolaydır.• İşlev deyimleri, override ve final anahtar sözcüklerini kullanmanıza olanak sağlar. Daha fazla bilgi için, bkz.“Yöntemleri geçersiz kılma” sayfa 110.
    • 97ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlama• İşlev deyimleri, tanımlayıcı (başka bir deyişle, işlevin adı) ile yöntem gövdesinin içindeki kod arasında daha güçlübir bağ oluşturur. Değişkenin değeri bir atama deyimiyle değiştirilebildiğinden, değişken ile işlev ifadesi arasındakibağlantı herhangi bir zamanda kesilebilir. Değişkeni var yerine const ile bildirerek bu sorunu geçici olarakçözebilseniz de, bu teknik, kodun okunmasını güçleştirip override ve final anahtar sözcüklerinin kullanılmasınıönlediğinden, en iyi uygulama olarak değerlendirilmez.Prototip nesnesine bir işlev eklemeyi seçtiğinizde işlev ifadesi kullanmanız gerekir. Daha fazla bilgi için, bkz. “Prototipnesnesi” sayfa 118.Yapıcı yöntemleriBazen yapıcılar olarak da adlandırılan yapıcı yöntemleri, tanımlandıkları sınıfla aynı adı paylaşan işlevlerdir. newanahtar sözcüğüyle sınıfın bir örneği her oluşturulduğunda, yapıcı yöntemine dahil ettiğiniz kodlar çalıştırılır.Örneğin, aşağıdaki kod, status adında tek bir özellik içeren Example adında basit bir sınıfı tanımlar. statusdeğişkeninin başlangıç değeri, yapıcı işlevinin içinde ayarlanır.class Example{public var status:String;public function Example(){status = "initialized";}}var myExample:Example = new Example();trace(myExample.status); // output: initializedYapıcı yöntemleri yalnızca genel olabilir ancak public niteliğinin kullanılması isteğe bağlıdır Bir yapıcıda private,protected veya internal gibi diğer erişim denetimi belirticilerinden herhangi birini kullanamazsınız. Ayrıca yapıcıyöntemiyle kullanıcı tanımlı bir ad alanı da kullanamazsınız.Yapıcı, super() deyimini kullanarak doğrudan üst sınıfının yapıcısına açıkça bir çağrı yapabilir. Üst sınıf yapıcısıaçıkça çağrılmazsa, derleyici otomatik olarak yapıcı gövdesindeki birinci deyimin önüne bir çağrı ekler. Üst sınıfınbaşvurusu olarak super önekini kullanarak da üst sınıf yöntemlerini çağırabilirsiniz. Aynı yapıcı gövdesinde hemsuper() hem de super öğesini kullanmaya karar verirseniz, ilk olarak super() öğesini çağırdığınızdan emin olun.Aksi takdirde, super başvurusu beklendiği gibi davranmaz. super() yapıcısının ayrıca throw veya returndeyiminden önce çağrılması gerekir.Aşağıdaki örnek, super() yapıcısını çağırmadan önce super başvurusunu kullanmaya çalışmanız durumunda neolacağını gösterir. Yeni bir sınıf olan ExampleEx, Example sınıfını genişletir. ExampleEx yapıcısı, üst sınıfındatanımlanmış durum değişkenine erişmeye çalışır ancak bunu super() öğesini çağırmadan önce yapar. super()yapıcısı çalıştırılıncaya kadar status değişkeni kullanılamadığından, ExampleEx yapıcısının içindeki trace()deyimi, null değerini üretir.class ExampleEx extends Example{public function ExampleEx(){trace(super.status);super();}}var mySample:ExampleEx = new ExampleEx(); // output: null
    • 98ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaYapıcı içinde return deyiminin kullanılması geçerli bir durum olsa da, bir değer döndürülmesine izin verilmez. Başkabir deyişle, return deyimlerinin ilişkilendirilmiş ifadeler veya değerler içermemesi gerekir. Aynı şekilde, yapıcıyöntemlerinin değer döndürmesine izin verilmez, başka bir deyişle, herhangi bir döndürme türü belirtilemez.Sınıfınızda bir yapıcı yöntemi tanımlamazsanız, derleyici otomatik olarak sizin için boş bir yapıcı oluşturur. Sınıfınızbaşka bir sınıfı genişletirse, derleyici oluşturduğu yapıcıya bir super() çağrısı dahil eder.Statik yöntemlerSınıf yöntemleri olarak da adlandırılan statik yöntemler, static anahtar sözcüğüyle bildirilen yöntemlerdir. Sınıfınörneğine değil, sınıfa eklenen statik yöntemler, tek bir örneğin durumu dışındaki şeyleri etkileyen işlevlerinkapsüllenmesinde kullanışlıdır. Statik yöntemler bir bütün olarak sınıfa eklendiğinden, statik yöntemlere sınıfınörneği üzerinden değil yalnızca sınıf üzerinden erişilebilir.Statik yöntemler, sınıf örneklerinin durumunu etkilemekle sınırlı olmayan işlevlerin kapsüllenmesinde kullanışlıdır.Başka bir deyişle, bir yöntem sınıf örneğinin değerini doğrudan etkilemeyen işlevler sağlıyorsa statik olmalıdır.Örneğin, Date sınıfı, bir dizeyi alıp sayıya dönüştüren parse() adındaki bir statik yönteme sahiptir. Bu yöntem sınıfıntek bir örneğini etkilemediğinden statiktir. parse() yöntemi bir tarih değerini temsil eden dizeyi alır, dizeyi ayrıştırırve Date nesnesinin dahili temsiliyle uyumlu bir formatta sayıyı döndürür. Date sınıfının bir örneğine yönteminuygulanması mantıklı olmadığından, bu yöntem bir örnek yöntemi değildir.Statik parse() yöntemini, getMonth() gibi Date sınıfının örnek yöntemlerinden biriyle karşılaştırın. getMonth()yöntemi, Date örneğinin belirli bir bileşenini (ay) alarak doğrudan örneğin değeri üzerinde çalıştığından, bir örnekyöntemidir.Statik yöntemler tek tek örneklere bağımlı olmadığından, statik yöntemin gövdesinde this veya super anahtarsözcüklerini kullanamazsınız. this başvurusu ve super başvurusu yalnızca bir örnek yönteminin bağlamında anlamiçerir.Bazı sınıf tabanlı programlama dillerinin aksine, ActionScript 3.0da statik yöntemler miras alınmaz. Daha fazla bilgiiçin, bkz. “Statik özellikler miras alınmaz” sayfa 112.Örnek yöntemleriÖrnek yöntemleri, static anahtar sözcüğü olmadan bildirilen yöntemlerdir. Bütün olarak sınıfa değil, sınıfınörneklerine eklenen örnek yöntemleri, sınıfın tek tek örneklerini etkileyen işlevlerin uygulanmasında kullanışlıdır.Örneğin, Array sınıfı, doğrudan Array örneklerinde çalışan sort() adında bir örnek yöntemi içerir.Örnek yönteminin gövdesinde statik değişkenler ve örnek değişkenleri kapsam içinde bulunur, başka bir deyişle, aynısınıfta tanımlanmış değişkenlere, basit bir tanımlayıcı kullanılarak başvurulabilir. Örneğin, şu sınıf (CustomArray)Array sınıfını genişletir. CustomArray sınıfı, sınıf örneklerinin toplam sayısını izlemek için arrayCountTotaladındaki bir statik değişkeni, örneklerin oluşturulma sırasını izleyen arrayNumber adındaki bir örnek değişkenini vebu değişkenlerin değerlerini döndüren getPosition() adındaki bir örnek yöntemini tanımlar.
    • 99ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamapublic class CustomArray extends Array{public static var arrayCountTotal:int = 0;public var arrayNumber:int;public function CustomArray(){arrayNumber = ++arrayCountTotal;}public function getArrayPosition():String{return ("Array " + arrayNumber + " of " + arrayCountTotal);}}Sınıfa harici olan kodun CustomArray.arrayCountTotal öğesini kullanarak sınıf nesnesi üzerindenarrayCountTotal statik değişkenini ifade etmesi gerekse de, getPosition() yönteminin gövdesinde bulunan kod,doğrudan arrayCountTotal değişkenini ifade edebilir. Üst sınıflardaki statik değişkenler için de bu geçerlidir. Statiközellikler ActionScript 3.0da miras alınmasa da, üst sınıflardaki statik özellikler kapsam içindedir. Örneğin, Arraysınıfı, bir tanesi DESCENDING olarak adlandırılan birkaç statik değişkene sahiptir. Array alt sınıfında bulunan kod, basitbir tanımlayıcı kullanarak DESCENDING statik sabitini ifade edebilir:public class CustomArray extends Array{public function testStatic():void{trace(DESCENDING); // output: 2}}Bir örnek yönteminin gövdesindeki this başvurusunun değeri, yöntemin eklendiği örneğin başvurusudur. Aşağıdakikod, this başvurusunun yöntemi içeren örneği işaret ettiğini gösterir:class ThisTest{function thisValue():ThisTest{return this;}}var myTest:ThisTest = new ThisTest();trace(myTest.thisValue() == myTest); // output: trueÖrnek yöntemlerinin mirası, override ve final anahtar sözcükleriyle denetlenebilir. Miras alınan bir yöntemiyeniden tanımlamak için override niteliğini ve alt sınıfların bir yöntemi geçersiz kılmasını önlemek için finalniteliğini kullanabilirsiniz. Daha fazla bilgi için, bkz. “Yöntemleri geçersiz kılma” sayfa 110.Erişimci yöntemlerini alma ve ayarlamaAlıcılar ve ayarlayıcılar olarak da adlandırılan alma ve ayarlama erişimci işlevleri, oluşturduğunuz sınıflar içinkullanımı kolay bir programlama arabirimi sağlarken, bilgi gizleme ve kapsüllemeye yönelik programlama ilkelerineda bağlı kalmanıza olanak sağlar. Alma ve ayarlama işlevleri, sınıf özelliklerinizin sınıf için özel olmasını sürdürmeniziancak sınıfınızın kullanıcılarının bir sınıf yöntemi çağırmak yerine bir sınıf değişkenine erişiyormuş gibi bu özelliklereerişmesine olanak sağlar.
    • 100ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaBu yaklaşımın avantajı, getPropertyName() ve setPropertyName() gibi kullanılması güç adlara sahip gelenekselerişimci işlevlerinden kaçınmanıza olanak sağlamasıdır. Alıcı ve ayarlayıcıların başka bir avantajı da, hem okuma hemde yazma erişimine izin veren her özellik için genele açık iki işlevden kaçınabilmenizi sağlamasıdır.GetSet adındaki şu örnek sınıf, privateProperty adındaki özel değişkene erişim sağlayan publicAccess() adındaalma ve ayarlama erişimci işlevlerini içerir:class GetSet{private var privateProperty:String;public function get publicAccess():String{return privateProperty;}public function set publicAccess(setValue:String):void{privateProperty = setValue;}}privateProperty özelliğine doğrudan erişmeyi denerseniz, aşağıdaki gibi bir hata oluşur:var myGetSet:GetSet = new GetSet();trace(myGetSet.privateProperty); // error occursBunun yerine, GetSet sınıfının kullanıcısı, publicAccess adında bir özellik olarak görüntülenen ancak gerçekteprivateProperty adındaki özel özellikte çalışan bir alma ve ayarlama erişimcisi işlevleri çifti olan bir öğeyi kullanır.Aşağıdaki örnek, GetSet sınıfını başlatır ve sonra publicAccess adındaki genel erişimciyi kullanarakprivateProperty değerini ayarlar:var myGetSet:GetSet = new GetSet();trace(myGetSet.publicAccess); // output: nullmyGetSet.publicAccess = "hello";trace(myGetSet.publicAccess); // output: helloAlıcı ve ayarlayıcı işlevleri, normal sınıf üyesi değişkenleri kullandığınız zaman mümkün olmayacak şekilde, bir üstsınıftan miras alınan özellikleri geçersiz kılmanıza olanak sağlar. var anahtar sözcüğü kullanılarak bildirilen sınıf üyesideğişkenleri, bir alt sınıfta geçersiz kılınamaz. Alıcı ve ayarlayıcı işlevleri kullanılarak oluşturulan özelliklerse bukısıtlamaya sahip değildir. Bir üst sınıftan miras alınan alıcı ve ayarlayıcı işlevlerinde override niteliğinikullanabilirsiniz.Bağımlı yöntemlerBazen yöntem kapanışı olarak da adlandırılan bir bağımlı yöntem, yalnızca örneğinden ayıklanmış bir yöntemdir.Bağımlı yöntem örnekleri arasında, bir işleve argüman olarak iletilen veya bir işlevden değer olarak döndürülenyöntemler yer alır. ActionScript 3.0da yeni bir özellik olan bağımlı yöntem, kendi örneğinden ayıklandığında da sözlüortamını koruduğundan bir işlev kapanışına benzer. Bağımlı yöntem ile işlev kapanışı arasındaki en önemli fark,bağımlı yöntemin this başvurusunun, yöntemi uygulayan örneğe bağlı veya bağımlı kalmaya devam etmesidir. Başkabir deyişle, bağımlı yöntemdeki this başvurusu her zaman yöntemi uygulayan orijinal nesneyi işaret eder. İşlevkapanışları için, this başvurusu geneldir, başka bir deyişle, çağrıldığı zaman işlevin ilişkilendirilmiş olduğu nesneyiişaret eder.
    • 101ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamathis anahtar sözcüğünü kullanıyorsanız, bağımlı yöntemleri anlamanız önemlidir. this anahtar sözcüğününyöntemin üst nesnesine bir başvuru sağladığını unutmayın. ActionScript programcılarının çoğu, this anahtarsözcüğünün her zaman yöntemin tanımını içeren nesneyi veya sınıfı ifade etmesini bekler. Ancak yöntem bağlamaolmadan bu her zaman geçerli olmayabilir. Örneğin, önceki ActionScript sürümlerinde this başvurusu her zamanyöntemi uygulayan örneği ifade etmiyordu. ActionScript 2.0da bir örnekten yöntemler ayıklandığında, thisbaşvurusu orijinal örneğe bağımlı olmamakla kalmaz aynı zamanda örneğin sınıfının üye değişkenleri ve yöntemleride kullanılamaz. Bir yöntemi parametre olarak ilettiğinizde bağımlı yöntemler otomatik olarak oluşturulduğundanActionScript 3.0da bu bir sorun yaratmaz. Bağımlı yöntemler, this anahtar sözcüğünün her zaman yöntemintanımlanmış olduğu nesne veya sınıfa başvurmasını sağlar.Aşağıdaki kod, bağımlı yöntemi tanımlayan foo() adındaki bir yöntemi ve bağımlı yöntemi döndüren bar()adındaki bir yöntemi içeren ThisTest adındaki bir sınıfı tanımlar. Sınıfa harici olan kod, ThisTest sınıfının bir örneğinioluşturur, bar() yöntemini çağırır ve döndürme değerini myFunc adındaki bir değişkende saklar.class ThisTest{private var num:Number = 3;function foo():void // bound method defined{trace("foos this: " + this);trace("num: " + num);}function bar():Function{return foo; // bound method returned}}var myTest:ThisTest = new ThisTest();var myFunc:Function = myTest.bar();trace(this); // output: [object global]myFunc();/* output:foos this: [object ThisTest]output: num: 3 */Kodun son iki satırı, kendisinden bir önceki satırsa bulunan this başvurusu genel nesneyi işaret etse de, foo()bağımlı yöntemindeki this başvurusunun halen ThisTest sınıfının bir örneğini işaret ettiğini gösterir. Üstelik, myFuncdeğişkeninde saklanan bağımlı yöntem, ThisTest sınıfının üye değişkenlerine erişmeye devam eder. Bu kodun aynısıActionScript 2.0da çalıştırılsa, this başvuruları eşleşir ve num değişkeni undefined olurdu.addEventListener() yöntemi, argüman olarak bir işlev veya yöntem iletmenizi gerektirdiğinden, bağımlıyöntemlerin eklenmesinin en belirgin olduğu alanlardan biri olay işleyicileridir. Daha fazla bilgi için, bkz. Sınıfyöntemi olarak tanımlanan dinleyici işlevi, “Olay dinleyicileri” sayfa 253.Sınıflarla numaralandırmaNumaralandırmalar, küçük bir değer kümesini kapsüllemek için oluşturduğunuz özel veri türleridir. ActionScript 3.0,enum anahtar sözcüğüne sahip C++ veya Numaralandırma arabirimine sahip Java uygulamalarından farklı olarakbelirli bir numaralandırma hizmetini desteklemez. Ancak sınıfları ve statik sabitleri kullanarak numaralandırmalaroluşturabilirsiniz. Örneğin, ActionScript 3.0daki PrintJob sınıfı, aşağıdaki kodda gösterildiği gibi, "landscape" ve"portrait" değerlerinin de yer aldığı bir değer kümesini saklamak için PrintJobOrientation adında birnumaralandırma kullanır:
    • 102ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamapublic final class PrintJobOrientation{public static const LANDSCAPE:String = "landscape";public static const PORTRAIT:String = "portrait";}Kural gereği, sınıfı genişletmeye gerek olmadığından, numaralandırma sınıfı final niteliğiyle bildirilir. Sınıf yalnızcastatik üyeleri içerir, başka bir deyişle, sınıfın örneklerini oluşturmazsınız. Bunun yerine, aşağıdaki kod alıntısındagösterildiği gibi, doğrudan sınıf nesnesi üzerinden numaralandırma değerlerine erişirsiniz:var pj:PrintJob = new PrintJob();if(pj.start()){if (pj.orientation == PrintJobOrientation.PORTRAIT){...}...}ActionScript 3.0daki numaralandırma sınıflarının tümü yalnızca String, int veya uint türündeki değişkenleri içerir.Değişmez dizeler veya sayı değerleri yerine numaralandırmaları kullanmanın avantajı, yazım hatalarınınnumaralandırmada daha kolay bulunabilmesidir. Bir numaralandırmanın adını yanlış yazarsanız, ActionScriptderleyicisi bir hata oluşturur. Değişmez değerleri kullanırsanız, bir sözcüğü yanlış yazdığınızda veya yanlış sayıyıkullandığınızda derleyici şikayette bulunmaz. Önceki örnekte, aşağıdaki alıntının gösterdiği gibi, numaralandırmasabitinin adı hatalıysa, derleyici bir hata oluşturur:if (pj.orientation == PrintJobOrientation.PORTRAI) // compiler errorAncak, aşağıdaki gibi, bir dize değişmez değerini yanlış yazarsanız, derleyici bir hata oluşturmaz:if (pj.orientation == "portrai") // no compiler errorNumaralandırma oluşturmaya yönelik ikinci bir teknik de, numaralandırma için statik özelliklere sahip ayrı bir sınıfoluşturulmasıdır. Ancak her statik özellik, bir dize veya tam sayı değerini değil, sınıfın bir örneğini içerdiğinden, buteknik farklılık gösterir. Örneğin, aşağıdaki kod, haftanın günleri için bir numaralandırma sınıfı oluşturur:public final class Day{public static const MONDAY:Day = new Day();public static const TUESDAY:Day = new Day();public static const WEDNESDAY:Day = new Day();public static const THURSDAY:Day = new Day();public static const FRIDAY:Day = new Day();public static const SATURDAY:Day = new Day();public static const SUNDAY:Day = new Day();}Bu teknik ActionScript 3.0 tarafından kullanılmasa da, tekniğin sağladığı gelişmiş tür denetlemesini tercih eden birçokgeliştirici tarafından kullanılır. Örneğin, numaralandırma değeri döndüren bir yöntem, döndürme değerininumaralandırma veri türüyle sınırlandırabilir. Aşağıdaki kod, yalnızca haftanın gününü döndüren bir işlevi değil, aynızamanda tür ek açıklaması olarak numaralandırma türünü kullanan bir işlev çağrısını da gösterir:
    • 103ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamafunction getDay():Day{var date:Date = new Date();var retDay:Day;switch (date.day){case 0:retDay = Day.MONDAY;break;case 1:retDay = Day.TUESDAY;break;case 2:retDay = Day.WEDNESDAY;break;case 3:retDay = Day.THURSDAY;break;case 4:retDay = Day.FRIDAY;break;case 5:retDay = Day.SATURDAY;break;case 6:retDay = Day.SUNDAY;break;}return retDay;}var dayOfWeek:Day = getDay();Haftanın günlerinin her biriyle bir tam sayıyı ilişkilendirip günün dize halinde temsilini döndüren bir toString()yöntemi sağlayacak şekilde Day sınıfını geliştirebilirsiniz. Uygulama olarak, bu şekilde Day sınıfını geliştirmekisteyebilirsiniz.Gömülü varlık sınıflarıActionScript 3.0, gömülü varlıkları temsil etmek için gömülü varlık sınıfları adı verilen özel sınıfları kullanır. Gömülüvarlık, derleme zamanında bir SWF dosyasına dahil edilen, ses, görüntü, font gibi bir varlıktır. Bir varlığın dinamikolarak yüklenmek yerine gömülmesi, o varlığın çalışma zamanında da kullanılabilir olmasını sağlarken SWFdosyasının boyutunun artmasına neden olur.Flashta gömülü varlık sınıflarını kullanmaBir varlığı gömmek için, ilk olarak varlığı bir FLA dosyasının kütüphanesine yerleştirin. Ardından varlığın gömülüvarlık sınıfı için bir ad sağlamak üzere varlığın bağlantı özelliğini kullanın. Sınıf yolunda bu ada sahip bir sınıfbulunmazsa, sizin için otomatik olarak bir sınıf oluşturulur. Daha sonra, gömülü varlık sınıfının bir örneğinioluşturabilir ve o sınıf tarafından tanımlanmış veya miras alınmış özellikleri ve yöntemleri kullanabilirsiniz. Örneğin,aşağıdaki kod, PianoMusic adındaki gömülü bir varlık sınıfına bağlı gömülü bir sesi çalmak için kullanılabilir:var piano:PianoMusic = new PianoMusic();var sndChannel:SoundChannel = piano.play();
    • 104ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaArabirimlerArabirim, ilgisiz nesnelerin birbiriyle iletişim kurmasına olanak sağlayan bir yöntem bildirimleri koleksiyonudur.Örneğin, ActionScript 3.0, bir sınıfın olay nesnelerini işlemek için kullanabileceği yöntem bildirimlerini içerenIEventDispatcher arabirimini tanımlar. IEventDispatcher arabirimi, nesnelerin birbirine olay nesnelerini iletmesi içinstandart bir yol oluşturur. Aşağıdaki kod, IEventDispatcher arabiriminin tanımını gösterir:public interface IEventDispatcher{function addEventListener(type:String, listener:Function,useCapture:Boolean=false, priority:int=0,useWeakReference:Boolean = false):void;function removeEventListener(type:String, listener:Function,useCapture:Boolean=false):void;function dispatchEvent(event:Event):Boolean;function hasEventListener(type:String):Boolean;function willTrigger(type:String):Boolean;}Arabirimler, bir yöntemin arabirimi ile uygulaması arasındaki ayrımı esas alır. Bir yöntemin arabirimi, yöntemin adı,tüm parametreleri ve döndürme türü gibi yöntemi çağırmak için gerekli olan tüm bilgileri içerir. Yönteminuygulaması, yalnızca arabirim bilgilerini değil, yöntemin davranışını yürüten çalıştırılabilir deyimleri de içerir.Arabirim tanımı yalnızca yöntem arabirimlerini içerir ve arabirimi uygulayan tüm sınıflar, yöntem uygulamalarınıtanımlamaktan sorumludur.ActionScript 3.0da, EventDispatcher sınıfı, tüm IEventDispatcher arabirim yöntemlerini tanımlayıp yöntemlerin herbirine yöntem gövdeleri ekleyerek IEventDispatcher arabirimini uygular. Aşağıdaki kod, EventDispatcher sınıfıtanımından bir alıntıdır:public class EventDispatcher implements IEventDispatcher{function dispatchEvent(event:Event):Boolean{/* implementation statements */}...}IEventDispatcher arabirimi, olay nesnelerini işlemek ve IEventDispatcher arabirimini uygulayan diğer nesnelere de buolay nesnelerini iletmek için EventDispatcher örneklerinin kullandığı bir protokol görevi görür.Arabirimin başka bir açıklaması da, veri türünü tıpkı sınıfın tanımladığı gibi tanımlamasıdır. Aynı şekilde, tıpkı sınıfgibi, arabirim de tür ek açıklaması olarak kullanılabilir. Bir veri türü olarak arabirim, veri türü gerektiren is ve asoperatörleri gibi operatörlerle de kullanılabilir. Ancak sınıfın aksine, bir arabirim başlatılamaz. Bu ayrım da birçokprogramcının arabirimleri soyut veri türleri olarak ve sınıfları da somut veri türleri olarak değerlendirmesine nedenolmuştur.
    • 105ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaArabirimi tanımlamaBir arabirim tanımının yapısı, sınıf tanımının yapısına benzer; tek fark, arabirimin yalnızca herhangi bir yöntemgövdesi içermeyen yöntemleri içerebilmesidir. Arabirimler, değişken veya sabitleri içeremez ancak alıcı veayarlayıcıları içerebilir. Bir arabirimi tanımlamak için, interface anahtar sözcüğünü kullanın. Örneğin, şuIExternalizable arabirimi, ActionScript 3.0da flash.utils paketinin parçasıdır. IExternalizable arabirimi, bir nesneninserileştirilmesi, başka bir deyişle nesnenin bir aygıtta depolanmaya veya ağda taşınmaya uygun bir formatadönüştürülmesine yönelik bir protokolü tanımlar.public interface IExternalizable{function writeExternal(output:IDataOutput):void;function readExternal(input:IDataInput):void;}IExternalizable arabiriminin public erişim denetimi değiştiricisi ile bildirildiğini unutmayın. Arabirim tanımlarıyalnızca public ve internal erişim denetimi belirticileri tarafından değiştirilebilir. Bir arabirim tanımının içindekiyöntem bildirimleri, herhangi bir erişim denetimi belirticisi içeremez.ActionScript 3.0, arabirim adlarının I büyük harfiyle başladığı bir kuralı izler ancak arabirim adı olarak herhangi birgeçerli tanımlayıcıyı kullanabilirsiniz. Arabirim tanımları genellikle paketin üst düzeyine yerleştirilir. Arabirimtanımları bir sınıf tanımının içine veya başka bir arabirim tanımının içine yerleştirilemez.Arabirimler başka bir veya birkaç arabirimi genişletebilir. Örneğin, aşağıdaki IExample arabirimi, IExternalizablearabirimini genişletir:public interface IExample extends IExternalizable{function extra():void;}IExample arabirimini uygulayan tüm sınıfların yalnızca extra() yöntemi için değil, aynı zamanda IExternalizablearabiriminden miras alınan writeExternal() ve readExternal() yöntemleri için de uygulamalar içermesi gerekir.Bir sınıfta arabirim uygulamaSınıf, bir arabirim uygulayabilen ActionScript 3.0 dil öğesidir. Bir veya daha fazla arabirim uygulamak için sınıfbildiriminde implements anahtar sözcüğünü kullanın. Aşağıdaki örnek, IAlpha ve IBeta adında iki arabirimive bunların her ikisini uygulayan Alpha adında bir sınıfı tanımlar:interface IAlpha{function foo(str:String):String;}interface IBeta{function bar():void;}class Alpha implements IAlpha, IBeta{public function foo(param:String):String {}public function bar():void {}}
    • 106ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaArabirim uygulayan bir sınıfta, uygulanan yöntemlerin şunları yapması gerekir:• public erişim denetimi tanımlayıcısını kullanma.• Arabirim yöntemiyle aynı adı kullanma.• Veri türlerinin her biri arabirim yöntemi parametresi veri türüyle eşleşen, aynı sayıda parametreye sahip olma.• Aynı döndürme türünü kullanma.public function foo(param:String):String {}Ancak uyguladığınız yöntemlerin parametrelerini adlandırma şeklinizde esnekliğe sahip olursunuz. Uygulananyöntemdeki parametre sayısının ve her parametrenin veri türünün, arabirim yöntemininkilerle eşleşmesi gerekse de,parametre adlarının eşleşmesi gerekmez. Örneğin, önceki örnekte, Alpha.foo() yönteminin parametresi paramolarak adlandırılır:Ancak parametre, IAlpha.foo() arabirim yönteminde str olarak adlandırılır:function foo(str:String):String;Ayrıca varsayılan parametre değerlerinde de esnekliğe sahip olursunuz. Bir arabirim tanımı, varsayılan parametredeğerlerine sahip işlev bildirimleri içerebilir. Böyle bir işlev bildirimini uygulayan yöntemin, arabirim tanımındabelirtilen değerle aynı veri türünün üyesi olan bir varsayılan parametre değerine sahip olması gerekir ancak gerçekdeğerin eşleşmesi gerekmez. Örneğin, aşağıdaki kod, 3 varsayılan parametre değerine sahip bir yöntemi içerenarabirimi tanımlar:interface IGamma{function doSomething(param:int = 3):void;}Aşağıdaki sınıf tanımı, Igamma arabirimini uygular ancak farklı bir varsayılan parametre değeri kullanır:class Gamma implements IGamma{public function doSomething(param:int = 4):void {}}Bu esnekliğin nedeni, arabirim uygulama kurallarının özellikle veri türü uyumluluğunu sağlamak üzere tasarlanmışolması ve aynı parametre adları ve varsayılan parametre değerlerinin zorunlu tutulmasının, bu hedefin eldeedilmesinde gerekli olmamasıdır.MirasMiras, programcıların varolan sınıfları esas alarak yeni sınıflar geliştirmesine olanak sağlayan bir kod yenidenkullanım şeklidir. Varolan sınıflar genellikle temel sınıflar veya üst sınıflar olarak ifade edilirken, yeni sınıflar genelliklealt sınıflar olarak adlandırılır. Mirasın en büyük avantajı, siz bir temel sınıftaki kodu yeniden kullanırken varolan kodudeğiştirmeden bırakmanıza olanak sağlamasıdır. Üstelik miras, diğer sınıfların temel sınıfla etkileşim kurma şekliüzerinde herhangi bir değişiklik gerektirmez. Tamamen test edilmiş veya hala kullanımda olabilecek varolan bir sınıfıdeğiştirmek yerine, mirası kullanarak sınıfı, ek özellik ve yöntemlerle genişletebileceğiniz tümleşik bir modül olarakdeğerlendirebilirsiniz. Aynı şekilde, bir sınıfın başka bir sınıftan miras aldığını belirtmek için extends anahtarsözcüğünü kullanırsınız.
    • 107ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaMiras aynı zamanda kodunuzda çok biçimlilikten yararlanmanıza olanak sağlar. Çok biçimlilik, farklı veri türlerineuygulandığında farklı şekilde davranan bir yöntem için tek bir yöntem adı kullanma yeteneğidir. Bunun basit birörneği, Circle ve Square adında iki alt sınıf içeren Shape adındaki bir temel sınıftır. Shape sınıfı, şeklin alanınıdöndüren, area() adında bir yöntemi tanımlar. Çok biçimlilik uygulanıyorsa, Circle ve Square türündeki nesnelerdearea() yöntemini çağırıp sizin için doğru hesaplamaların yapılmasını sağlayabilirsiniz. Miras, alt sınıfların temelsınıflardaki yöntemleri miras almasına, yeniden tanımlamasına veya geçersiz kılmasına olanak sağlayarak çokbiçimliliği etkinleştirir. Aşağıdaki örnekte, area() yöntemi Circle ve Square sınıfları tarafından yeniden tanımlanır:class Shape{public function area():Number{return NaN;}}class Circle extends Shape{private var radius:Number = 1;override public function area():Number{return (Math.PI * (radius * radius));}}class Square extends Shape{private var side:Number = 1;override public function area():Number{return (side * side);}}var cir:Circle = new Circle();trace(cir.area()); // output: 3.141592653589793var sq:Square = new Square();trace(sq.area()); // output: 1Her sınıf bir veri türünü tanımladığından, miras kullanılması, temel sınıf ile temel sınıfı genişleten sınıf arasında özelbir ilişki oluşturur. Bir alt sınıfın, temel sınıfın tüm özelliklerine sahip olması garantilenir, başka bir deyişle, alt sınıfınbir örneği her zaman temel sınıfın bir örneği yerine geçebilir. Örneğin, bir yöntem Shape türünde bir parametreyitanımlarsa, aşağıdaki gibi, Circle öğesi Shape öğesini genişlettiğinden Circle türünde bir argüman iletilmesi geçerli birdurumdur:function draw(shapeToDraw:Shape) {}var myCircle:Circle = new Circle();draw(myCircle);Örnek özellikleri ve mirasfunction, var veya const anahtar sözcükleriyle tanımlanmış bir örnek özelliği, özellik temel sınıfta privateniteliğiyle bildirilmediği sürece, tüm alt sınıflar tarafından miras alınır. Örneğin, ActionScript 3.0daki Event sınıfı,tüm olay nesneleri için ortak olan özellikleri miras alan çok sayıda alt sınıfa sahiptir.
    • 108ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaBazı olay türleri için, Event sınıfı, olayın tanımlanması için gerekli olan tüm özellikleri içerir. Bu olay türleri, Eventsınıfında tanımlı olanlar dışında bir örnek özelliği gerektirmez. Bu olaylara örnek olarak, veri başarıyla yüklendiğindegerçekleşen complete olayı ve bir ağ bağlantısı kurulduğunda gerçekleşen connect olayı verilebilir.Aşağıdaki örnek, alt sınıflar tarafından miras alınan özellik ve yöntemlerden bazılarını gösteren bir Event sınıfıalıntısıdır. Özellikler miras alındığından, tüm alt sınıflar bu özelliklere erişebilir.public class Event{public function get type():String;public function get bubbles():Boolean;...public function stopPropagation():void {}public function stopImmediatePropagation():void {}public function preventDefault():void {}public function isDefaultPrevented():Boolean {}...}Diğer olay türleri, Event sınıfında kullanılamayan benzersiz özellikleri gerektirir. Bu olaylar, Event sınıfının alt sınıflarıkullanılarak tanımlanır, böylece Event sınıfında tanımlanan özelliklere yeni özellikler eklenebilir. Böyle bir alt sınıfaörnek olarak, mouseMove ve click olayları gibi fare hareketiyle veya fare tıklatmalarıyla ilişkilendirilmiş olaylara özgüözellikler ekleyen MouseEvent sınıfı verilebilir. Aşağıdaki örnek, alt sınıfta bulunan ancak temel sınıfta bulunmayanözelliklerin tanımını gösteren bir MouseEvent alıntısıdır:public class MouseEvent extends Event{public static const CLICK:String= "click";public static const MOUSE_MOVE:String = "mouseMove";...public function get stageX():Number {}public function get stageY():Number {}...}Erişim denetimi belirticileri ve mirasBir özellik public anahtar sözcüğüyle bildirilirse, özellik her yerdeki kodlar tarafından görülebilir. Başka bir deyişle,private, protected ve internal anahtar sözcüklerinin aksine, public anahtar sözcüğü özellik mirasına herhangibir kısıtlama koymaz.Bir özellik private anahtar sözcüğüyle bildirilirse, yalnızca kendisini tanımlayan sınıfta görülebilir, başka bir deyişle,alt sınıflar tarafından miras alınmaz. Bu davranış, private anahtar sözcüğünün daha çok ActionScript 3.0 protectedanahtar sözcüğü gibi davrandığı önceki ActionScript sürümlerinden farklıdır.protected anahtar sözcüğü, bir özelliğin yalnızca kendisini tanımlayan sınıfta değil, tüm alt sınıflar için de görülebilirolduğunu belirtir. Java programlama dilindeki protected anahtar sözcüğünün aksine, ActionScript 3.0dakiprotected anahtar sözcüğü, bir özelliği aynı paketteki diğer tüm sınıflar tarafından görülebilir duruma getirmez.ActionScript 3.0da, yalnızca alt sınıflar protected anahtar sözcüğüyle bildirilen bir özelliğe erişebilir. Üstelik, alt sınıftemel sınıfla aynı pakette de olsa farklı pakette de olsa, korumalı özelliği o alt sınıf tarafından görülebilir.Bir özelliğin görünebilirliğini tanımlandığı paketle sınırlandırmak için, internal anahtar sözcüğünü kullanın veyaherhangi bir erişim denetimi belirticisi kullanmayın. internal erişim denetimi belirticisi, herhangi bir erişimdenetimi belirticisi belirtilmediğinde geçerli olan varsayılandır. internal olarak işaretlenmiş bir özellik yalnızca aynıpakette bulunan bir alt sınıf tarafından miras alınır.
    • 109ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaErişim denetimi belirticilerinin her birinin, paket sınırları boyunca mirası nasıl etkilediğini görmek için aşağıdakiörneği kullanabilirsiniz. Aşağıdaki örnek, AccessControl adında bir ana uygulama sınıfını ve Base ve Extender adındabaşka iki sınıfı tanımlar. Base sınıfı, foo adındaki bir pakette ve Base sınıfının alt sınıfı olan Extender sınıfı da baradındaki bir pakettedir. AccessControl sınıfı yalnızca Extender sınıfını içe aktarır ve Base sınıfında tanımlanmış stradındaki bir değişkene erişmeye çalışan Extender örneğini oluşturur. str değişkeni, public olarak bildirilir, böyleceaşağıdaki alıntıda gösterildiği gibi kod derleme yapar ve çalıştırılır:// Base.as in a folder named foopackage foo{public class Base{public var str:String = "hello"; // change public on this line}}// Extender.as in a folder named barpackage bar{import foo.Base;public class Extender extends Base{public function getString():String {return str;}}}// main application class in file named AccessControl.aspackage{import flash.display.MovieClip;import bar.Extender;public class AccessControl extends MovieClip{public function AccessControl(){var myExt:Extender = new Extender();trace(myExt.str);// error if str is not publictrace(myExt.getString()); // error if str is private or internal}}}Diğer erişim denetimi belirticilerinin, önceki örnekte derlemeyi ve çalıştırmayı nasıl etkilediğini görmek için,AccessControl sınıfından aşağıdaki satırı sildikten veya aşağıdaki satırın yorumunu kaldırdıktan sonra, strdeğişkeninin erişim denetimi belirticisini private, protected ya da internal olarak değiştirin:trace(myExt.str);// error if str is not public
    • 110ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaDeğişkenleri geçersiz kılmaya izin verilmezvar veya const anahtar sözcükleriyle bildirilen özellikler miras alınır ancak geçersiz kılınamaz. Bir özelliğin geçersizkılınması, bir alt sınıfta özelliğin yeniden tanımlanması anlamına gelir. Geçersiz kılınabilen tek özellik türüyöntemlerdir—başka bir deyişle, function anahtar sözcüğüyle bildirilmiş özelliklerdir. Bir örnek değişkenini geçersizkılamasanız da, örnek değişkeni için alıcı ve ayarlayıcı yöntemleri oluşturup yöntemleri geçersiz kılarak benzer birişlevi elde edebilirsiniz. Daha fazla bilgi için, bkz. “Yöntemleri geçersiz kılma” sayfa 110.Yöntemleri geçersiz kılmaBir yöntemin geçersiz kılınması, miras alınan bir yöntemin davranışının yeniden tanımlanması anlamına gelir. Statikyöntemler miras alınmaz ve geçersiz kılınamaz. Ancak, örnek yöntemleri, alt sınıflar tarafından miras alınır ve şu ikikriter karşılandığı sürece geçersiz kılınabilir:• Örnek yöntemi temel sınıfta final anahtar sözcüğüyle bildirilmez. final anahtar sözcüğü bir örnek yöntemiylekullanıldığında, programcının, alt sınıfların yöntemi geçersiz kılmasını önleme amacında olduğunu belirtir.• Örnek yöntemi temel sınıfta private erişim denetimi belirticisiyle bildirilmez. Bir yöntem temel sınıfta privateolarak işaretlenmişse, temel sınıf yöntemi alt sınıf tarafından görülemeyeceğinden, alt sınıfta aynı şekildeadlandırılmış yöntemi tanımlarken override anahtar sözcüğünün kullanılması gerekmez.Bu kriterleri karşılayan bir örnek yöntemini geçersiz kılmak için, aşağıdaki şekilde alt sınıftaki yöntem tanımınınoverride anahtar sözcüğünü kullanması ve yöntemin üst sınıf sürümüyle eşleşmesi gerekir:• Geçersiz kılma yönteminin, temel sınıf yöntemiyle aynı erişim denetimi düzeyine sahip olması gerekir. Dahiliolarak işaretlenmiş yöntemler, herhangi bir erişim denetimi belirticisi içermeyen yöntemlerle aynı erişim denetimidüzeyine sahiptir.• Geçersiz kılma yönteminin, temel sınıf yöntemiyle aynı sayıda parametreye sahip olması gerekir.• Geçersiz kılma yöntemi parametrelerinin, temel sınıf yöntemindeki parametrelerle aynı veri türü ek açıklamalarınasahip olması gerekir.• Geçersiz kılma yönteminin, temel sınıf yöntemiyle aynı döndürme türüne sahip olması gerekir.Her ikisinin de parametre sayısı ve parametrelerinin veri türü eşleştiği sürece, geçersiz kılma yöntemindekiparametrelerin adları ile temel sınıftaki parametrelerin adlarının eşleşmesi gerekmez.super deyimiProgramcılar bir yöntemi geçersiz kılarken genellikle davranışı tamamen değiştirmek yerine geçersiz kıldıkları üst sınıfyönteminin davranışına ekleme yapmak ister. Bunun için de, bir alt sınıftaki yöntemin kendi üst sınıf sürümünüçağırmasına olanak sağlayan bir mekanizma gerekir. super deyimi, anında üst sınıfa başvuru içererek bu mekanizmayısağlar. Aşağıdaki örnek, thanks() adındaki bir yöntemi içeren Base adında bir sınıfı ve thanks() yöntemini geçersizkılan Extender adındaki bir Base sınıfının alt sınıfını tanımlar. Extender.thanks() yöntemi, Base.thanks() öğesiniçağırmak için super deyimini kullanır.
    • 111ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamapackage {import flash.display.MovieClip;public class SuperExample extends MovieClip{public function SuperExample(){var myExt:Extender = new Extender()trace(myExt.thanks()); // output: Mahalo nui loa}}}class Base {public function thanks():String{return "Mahalo";}}class Extender extends Base{override public function thanks():String{return super.thanks() + " nui loa";}}Alıcıları ve ayarlayıcıları geçersiz kılmaBir üst sınıfta tanımlanmış değişkenleri geçersiz kılamasanız da, alıcıları ve ayarlayıcıları geçersiz kılabilirsiniz.Örneğin, aşağıdaki kod, ActionScript 3.0daki MovieClip sınıfında tanımlanmış currentLabel adındaki bir alıcıyıgeçersiz kılar:package{import flash.display.MovieClip;public class OverrideExample extends MovieClip{public function OverrideExample(){trace(currentLabel)}override public function get currentLabel():String{var str:String = "Override: ";str += super.currentLabel;return str;}}}OverrideExample sınıf yapıcısında trace() çıktısı Override: null olup bu, örneğin miras alınan currentLabelözelliğini geçersiz kılabildiğini gösterir.
    • 112ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaStatik özellikler miras alınmazStatik özellikler, alt sınıflar tarafından miras alınmaz. Başka bir deyişle, statik özelliklere bir alt sınıfın örneği üzerindenerişilemez. Statik özelliğe yalnızca tanımlanmış olduğu sınıf nesnesi üzerinden erişilebilir. Örneğin, aşağıdaki kod,Base adında bir temel sınıfı ve Base sınıfını genişleten Extender adında bir alt sınıfı tanımlar. test adındaki bir statikdeğişken Base sınıfında tanımlanır. Aşağıdaki alıntıda yazılı kod katı modda derleme yapmaz ve standart modda birçalışma zamanı hatası oluşturur.package {import flash.display.MovieClip;public class StaticExample extends MovieClip{public function StaticExample(){var myExt:Extender = new Extender();trace(myExt.test);// error}}}class Base {public static var test:String = "static";}class Extender extends Base { }Aşağıdaki kodda gösterildiği gibi, test statik değişkenine yalnızca sınıf nesnesi üzerinden erişilebilir:Base.test;Ancak aynı adı statik özellik olarak kullanıp bir örnek özelliğinin tanımlanmasına izin verilir. Böyle bir örnek özelliği,statik özellikle aynı sınıfta veya bir alt sınıfta tanımlanabilir. Örneğin, önceki örnekte yer alan Base sınıfı, test adındabir örnek özelliğine sahip olabilirdi. Örnek özelliği Extender sınıfı tarafından miras alındığından, aşağıdaki kodderleme yapar ve çalıştırılır. Test örneği değişkeninin tanımı Extender sınıfına kopyalanmayıp taşınırsa da kodderleme yapar ve çalıştırılır.package{import flash.display.MovieClip;public class StaticExample extends MovieClip{public function StaticExample(){var myExt:Extender = new Extender();trace(myExt.test);// output: instance}}}class Base{public static var test:String = "static";public var test:String = "instance";}class Extender extends Base {}
    • 113ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaStatik özellikler ve kapsam zinciriStatik özellikler miras alınmasa da, bunlar kendilerini tanımlayan sınıfın ve o sınıfın alt sınıflarının kapsam zincirindebulunur. Bu nedenle de, statik özelliklerin hem tanımlandıkları sınıfın hem de alt sınıfların kapsamında olduğusöylenebilir. Başka bir deyişle, bir statik özellik yalnızca statik özelliği tanımlayan sınıfın ve o sınıfın alt sınıflarınıngövdesinde doğrudan erişilebilir durumdadır.Aşağıdaki örnek, Base sınıfında tanımlanmış statik test değişkeninin, Extender sınıfının kapsamında olduğunugöstermek için, önceki örnekte tanımlanan sınıfları değiştirir. Başka bir deyişle, Extender sınıfı, test öğesinitanımlayan sınıfın adını değişkene önek olarak eklemeden statik test değişkenine erişebilir.package{import flash.display.MovieClip;public class StaticExample extends MovieClip{public function StaticExample(){var myExt:Extender = new Extender();}}}class Base {public static var test:String = "static";}class Extender extends Base{public function Extender(){trace(test); // output: static}}Bir örnek özelliği, aynı sınıfta veya bir üst sınıfta statik özellik olarak aynı adı kullanacak şekilde tanımlanırsa, örneközelliği kapsam zincirinde daha yüksek bir öncelik elde eder. Örnek özelliğinin statik özelliği gölgelediği, başka birdeyişle, statik özelliğin değeri yerine örnek özelliğinin değerinin kullanıldığı söylenebilir. Örneğin, aşağıdaki kod,Extender sınıfı test adında bir örnek değişkeni tanımlarsa, trace() deyiminin, statik değişkenin değerini değil,örnek değişkeninin değerini kullandığını gösterir:
    • 114ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamapackage{import flash.display.MovieClip;public class StaticExample extends MovieClip{public function StaticExample(){var myExt:Extender = new Extender();}}}class Base{public static var test:String = "static";}class Extender extends Base{public var test:String = "instance";public function Extender(){trace(test); // output: instance}}Gelişmiş başlıklarBu bölümde, ilk olarak ActionScript ve OOPnin kısaca geçmişine yer verilmiş ve sonra ActionScript 3.0 nesne modelive bu modelin eski ActionScript Virtual Machine (AVM1) içeren önceki Flash Player sürümlerinden çok daha yüksekperformans elde etmek için yeni ActionScript Virtual Machine (AVM2) uygulamasını nasıl etkinleştirdiğiaçıklanmıştır.ActionScript OOP desteğinin geçmişiActionScript 3.0, önceki ActionScript sürümleri esas alınarak oluşturulduğundan, ActionScript nesne modelinin nasılgeliştiğinin anlaşılması yardımcı olabilir. ActionScript, önceki Flash geliştirme aracı sürümleri için basit bir komutdosyası yazma mekanizması olarak kullanılmaya başlamıştır. Daha sonra programcılar ActionScript ile gittikçe dahakarmaşık uygulamalar oluşturmaya başladı. Bu programcıların gereksinimlerine yanıt vermek için, sonraki hersürüme, karmaşık uygulamaların oluşturulmasını kolaylaştıran dil özellikleri eklendi.ActionScript 1.0ActionScript 1.0, Flash Player 6 ve öncesinde kullanılan dil sürümünü ifade eder. Bu geliştirme aşamasında bileActionScript nesne modeli, temel veri türü olarak nesne kavramını esas almıştı. ActionScript nesnesi bir grup özellikiçeren birleşik bir veri türüdür. Nesne modeli ele alınırken özellik terimi, değişkenler, işlevler veya yöntemler gibi birnesneye eklenen her şeyi içerir.
    • 115ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaBu birinci nesil ActionScript, class anahtar sözcüğüyle sınıfların tanımlanmasını desteklemese de, prototip nesne adıverilen özel bir nesne türünü kullanarak bir sınıfı tanımlayabilirsiniz. Java ve C++ gibi sınıf tabanlı dillerde yaptığınızgibi, somut nesneler olarak başlatacağınız soyut bir sınıf tanımı oluşturmak için class anahtar sözcüğünü kullanmakyerine, ActionScript 1.0 gibi prototip tabanlı diller, başka nesneler için bir model (veya prototip) olarak varolan birnesneyi kullanır. Sınıf tabanlı bir dilde nesneler, o nesnenin şablonu görevini gören bir sınıfa işaret edebilse de,prototip tabanlı bir dildeki nesneler, bunun yerine nesnenin şablonu görevini gören başka bir nesneye (prototip) işareteder.ActionScript 1.0da bir sınıf oluşturmak üzere o sınıf için bir yapıcı işlevi tanımlarsınız. ActionScriptte işlevler yalnızcasoyut tanımlar değil, gerçek nesnelerdir. Oluşturduğunuz yapıcı işlevi, o sınıfın örnekleri için prototip nesne görevigörür. Aşağıdaki kod, Shape adında bir sınıf oluşturur ve varsayılan olarak true değerine ayarlanmış visible adındatek bir özelliği tanımlar:// base classfunction Shape() {}// Create a property named visible.Shape.prototype.visible = true;Bu yapıcı işlevi, aşağıdaki gibi new operatörüyle başlatabileceğiniz bir Shape sınıfını tanımlar:myShape = new Shape();Shape() yapıcı işlevi nesnesi, Shape sınıfının örnekleri için prototip görevi gördüğü gibi, Shape sınıfının alt sınıfları(başka bir deyişle, Shape sınıfını genişleten diğer sınıflar) için de prototip görevi görebilir.Shape sınıfının alt sınıfı olan bir sınıfın oluşturulması iki adımda gerçekleşir. İlk olarak, aşağıdaki gibi, sınıf için biryapıcı işlevi tanımlayarak sınıfı oluşturun:// child classfunction Circle(id, radius){this.id = id;this.radius = radius;}İkinci olarak, Shape sınıfının, Circle sınıfının prototipi olduğunu bildirmek için new operatörünü kullanın. Varsayılanolarak, oluşturduğunuz tüm sınıflar kendi prototipi olarak Object sınıfını kullanır, başka bir deyişle,Circle.prototype öğesi geçerli olarak bir genel nesne (Object sınıfının bir örneği) içerir. Circle öğesininprototipinin Object değil Shape olduğunu belirtmek için, aşağıdaki kodu kullanarak genel bir nesneyi değil, Shapenesnesini içerecek şekilde Circle.prototype öğesinin değerini değiştirin:// Make Circle a subclass of Shape.Circle.prototype = new Shape();Şimdi Shape sınıfı ve Circle sınıfı, prototip zinciri olarak bilinen bir miras ilişkisiyle birbirine bağlanır. Diyagramda,bir prototip zincirindeki ilişkiler gösterilmektedir:Object.prototypeShape.prototypeCircle.prototype
    • 116ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaHer prototip zincirinin sonundaki temel sınıf, Object sınıfıdır. Object sınıfı, ActionScript 1.0da oluşturulmuş tümnesneler için temel prototip nesnesine işaret eden Object.prototype adında bir statik özellik içerir. Örnek prototipzincirimizdeki bir sonraki nesne Shape nesnesidir. Bunun nedeni, Shape.prototype özelliğinin asla açıkçaayarlanmaması ve bu nedenle de genel nesne (Object sınıfının bir örneği) içermeye devam etmesidir. Bu zincirdeki sonhalka, prototipine (Shape sınıfına) bağlı Circle sınıfıdır (Circle.prototype özelliği bir Shape nesnesi içerir).Aşağıdaki örnekte olduğu gibi, Circle sınıfının bir örneğini oluşturursak, örnek Circle sınıfının prototip zincirini mirasalır:// Create an instance of the Circle class.myCircle = new Circle();Shape sınıfının bir üyesi olarak visible adında bir özellik oluşturduğumuzu hatırlayın. Örneğimizde, visibleözelliği, myCircle nesnesinin bir parçası olarak değil, yalnızca Shape nesnesinin bir üyesi olarak bulunur ancakaşağıdaki kod satırı true değerini verir:trace(myCircle.visible); // output: trueFlash Player, prototip zincirinde dolanarak myCircle nesnesinin visible özelliğini miras aldığını doğrulayabilir. Bukodu çalıştırırken, Flash Player ilk olarak myCircle nesnesinin özelliklerinde visible adındaki bir özelliği arar, ancakbu özelliği bulamaz. Flash Player daha sonra Circle.prototype nesnesine bakar ancak yine visible adındakiözelliği bulamaz. Flash Player, prototip zincirinde devam ederek en sonunda Shape.prototype nesnesindetanımlanmış visible özelliğini bulur ve o özelliğin değerini verir.Basitlik sağlamak için bu bölümde prototip zincirinin ayrıntılarına ve karmaşık noktalarına yer verilmemiş olupbunun yerine ActionScript 3.0 nesne modelini anlamanıza yardımcı olacak bilgilerin sağlanması amaçlanmıştır.ActionScript 2.0ActionScript 2.0, Java ve C++ gibi sınıf tabanlı dillerle çalışan kişilere tanıdık gelecek şekilde sınıflar tanımlamanızaolanak sağlayan class, extends, public ve private gibi yeni anahtar sözcükler sunmuştur. ActionScript 1.0 ileActionScript 2.0 arasında temel alınan miras mekanizmasının değişmediğinin anlaşılması önemlidir. ActionScript 2.0yalnızca sınıfların tanımlanması için yeni bir sözdizimi eklemiştir. Prototip zinciri, her iki dil sürümünde de aynışekilde çalışır.Aşağıdaki alıntıda gösterildiği gibi, ActionScript 2.0 tarafından ilk defa sunulan yeni sözdizimi, birçok programcınındaha sezgisel bulduğu bir şekilde sınıfları tanımlamanıza olanak sağlar:// base classclass Shape{var visible:Boolean = true;}ActionScript 2.0ın ayrıca derleme zamanı tür denetlemesiyle kullanılmak üzere tür ek açıklamaları da sunduğunuunutmayın. Bu, önceki örnekte bulunan visible özelliğinin yalnızca bir Boolean değeri içermesi gerektiğinibildirmenize olanak sağlar. Yeni extends anahtar sözcüğü, alt sınıf oluşturma işlemini de basitleştirir. Aşağıdakiörnekte, ActionScript 1.0da iki adımda gerçekleştirilen işlem, extends anahtar sözcüğüyle tek adımda gerçekleştirilir:
    • 117ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlama// child classclass Circle extends Shape{var id:Number;var radius:Number;function Circle(id, radius){this.id = id;this.radius = radius;}}Şimdi yapıcı, sınıf tanımının parçası olarak bildirilir ve id ve radius sınıf özelliklerinin de açıkça bildirilmesi gerekir.ActionScript 2.0 ayrıca arabirimlerin tanımı için de destek eklemiştir, bu sayede nesne tabanlı programlarınızınesneler arası iletişim için biçimsel olarak tanımlanmış protokollerle daha düzgün hale getirebilirsiniz.ActionScript 3.0 sınıf nesnesiDaha çok Java ve C++ ile ilişkilendirilmiş olan yaygın bir nesne tabanlı programlama paradigması, nesne türlerinitanımlamak için sınıfları kullanır. Bu paradigmayı kullanan programlama dilleri, sınıfın tanımladığı veri türüörneklerini oluşturmak için de sınıfları kullanabilir. ActionScript, sınıfları bu iki amaç için de kullanır ancakActionScriptin prototip tabanlı bir dil olması da ilginç bir özellik katar. ActionScript, her sınıf tanımı için, hemdavranışın hem de durumun paylaşılmasına olanak sağlayan özel bir sınıf nesnesi oluşturur. Ancak birçokActionScript programcısı için bu ayrım pratik bir kodlama anlamına gelmeyebilir. ActionScript 3.0, bu özel sınıfnesnelerini kullanmadan hatta anlamadan karmaşık nesne tabanlı ActionScript uygulamaları oluşturabileceğinizşekilde tasarlanmıştır. Sınıf nesnelerinden yararlanmak isteyen ileri düzey programcılar için bu bölümde bu konularayrıntılı şekilde ele alınmıştır.Aşağıdaki diyagram, A adındaki basit bir sınıfı temsil eden bir sınıf nesnesi yapısını göstermektedir. A sınıfı, class A{} deyimiyle tanımlanmıştır:Diyagramdaki her dikdörtgen bir nesneyi temsil eder. Diyagramdaki her nesne, A sınıfına ait olduğunu temsil edenbir A alt simge karakterine sahiptir. Sınıf nesnesi (CA), birçok başka önemli nesneye başvuruları içerir. Örneknitelikleri nesnesi (TA), bir sınıf tanımı içinde tanımlanan örnek özelliklerini saklar. Sınıf nitelikleri nesnesi (TCA),dahili sınıf türünü temsil eder ve sınıf tarafından tanımlanan statik özellikleri saklar (C alt simge karakteri "sınıfı" ifadeeder). Prototip nesnesi (PA) her zaman başlangıçta constructor özelliği yoluyla eklendiği sınıf nesnesini ifade eder.TCAPACATAClass.prototype Object.prototypetemsilciyapıcıtemsilciprototiptürözellikler
    • 118ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaNitelikler nesnesiActionScript 3.0da yeni bir özellik olan nitelikler nesnesi, performans göz önünde tutularak uygulanmıştır. ÖncekiActionScript sürümlerinde, Flash prototip zincirinde dolandığı için ad arama zaman alıcı bir işlem olabiliyordu.ActionScript 3.0da, miras alınan özellikler, üst sınıflardan alt sınıfların nitelikler nesnesine kopyalandığından, adarama çok daha etkili olup daha az zaman alır.Nitelikler nesnesine programcı kodu ile doğrudan erişilemez ancak performans artışı ve bellek kullanımındakiiyileşme ile bu nesnenin varlığı hissedilebilir. Nitelikler nesnesi, bir sınıfın mizanpajı ve içerikleri hakkında ayrıntılıbilgi içeren AVM2yi sağlar. Bu bilgiler sayesinde AVM2, zaman alıcı bir işlem olan ad aramasına gerek kalmadanözelliklere erişmeye veya yöntemler çağırmaya yönelik doğrudan makine talimatları oluşturabildiğinden, çalıştırmasüresini büyük ölçüde azaltabilir.Nitelikler nesnesi sayesinde nesnenin bellek izi, önceki ActionScript sürümlerindeki benzer bir nesnenin bellekizinden çok daha küçük olabilir. Örneğin, bir sınıf mühürlenmişse (başka bir deyişle, sınıfın dinamik olduğubildirilmemişse), o sınıfın örneği, dinamik olarak eklenmiş özelliklerin karma tablosunu gerektirmez ve niteliklernesnelerinin işaretçilerinden ve sınıfta tanımlanmış sabit özelliklere yönelik birkaç yuvadan biraz daha fazlasınıbarındırabilir. Sonuç olarak, ActionScript 2.0da 100 bayt bellek gerektiren bir nesne, ActionScript 3.0da 20 bayt kadardüşük bellek gerektirebilir.Not: Nitelikler nesnesi dahili bir uygulama olup, gelecek ActionScript sürümlerinde bu uygulamanın değişmeyeceğineveya tamamen kaldırılmayacağına dair bir garanti yoktur.Prototip nesnesiHer ActionScript sınıf nesnesi, sınıfın prototip nesnesine başvuru niteliğinde olan prototype adında bir özelliğesahiptir. Prototip nesnesi, ActionScript’in prototip tabanlı dil olması nedeniyle eski uygulamasının devamıniteliğindedir. Daha fazla bilgi için, bkz. “ActionScript OOP desteğinin geçmişi” sayfa 114.prototype özelliği salt okunur özelliktedir, başka bir deyişle, farklı nesnelere işaret edecek şekilde değiştirilemez. Buda, prototipin farklı bir sınıfa işaret edecek şekilde yeniden atanabildiği önceki ActionScript sürümlerindekiprototype sınıfından farklılık gösterir. prototype özelliği salt okunur olsa da, bu özelliğin başvurduğu prototipnesnesi salt okunur değildir. Başka bir deyişle, prototip nesnesine yeni özellikler eklenebilir. Prototip nesnesineeklenen özellikler, sınıfın tüm örnekleri arasında paylaşılır.Önceki ActionScript sürümlerinde tek miras mekanizması olan prototip zinciri, ActionScript 3.0da yalnızca ikincil roloynar. Birincil miras mekanizması olan sabit özellik mirası, nitelikler nesnesi tarafından dahili olarak işlenir. Sabitözellik, sınıf tanımının bir parçası olarak tanımlanan bir değişken veya yöntemdir. Sabit özellik mirası, class,extends ve override gibi anahtar sözcüklerle ilişkilendirilmiş miras mekanizması olduğundan, sınıf mirası olarak daadlandırılır.Prototip zinciri, sabit özellik mirasından daha dinamik olan alternatif bir miras mekanizması sağlar. Yalnızca sınıftanımının bir parçası olarak değil, aynı zamanda sınıf nesnesinin prototype özelliği üzerinden çalışma zamanında dasınıfın prototip nesnesine özellikler ekleyebilirsiniz. Ancak, derleyiciyi katı moda ayarlamanız durumunda, dynamicanahtar sözcüğüyle bir sınıf bildirmediğiniz sürece bir prototip nesnesine eklenmiş özelliklere erişemeyebileceğiniziunutmayın.Prototip nesnesine birçok özellik eklenmiş olan sınıfa güzel bir örnek Object sınıfıdır. Object sınıfının toString() vevalueOf() yöntemleri, gerçekten Object sınıfının prototip nesnesinin özelliklerine atanmış işlevlerdir. Aşağıda, buyöntemlerin bildirilmesinin teoride nasıl göründüğünü gösterir (uygulama ayrıntıları nedeniyle gerçek uygulamabiraz daha farklıdır):
    • 119ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamapublic dynamic class Object{prototype.toString = function(){// statements};prototype.valueOf = function(){// statements};}Daha önceden belirtildiği gibi, sınıf tanımının dışında bir sınıfın prototip nesnesine bir özellik ekleyebilirsiniz.Örneğin, toString() yöntemi aşağıdaki gibi Object sınıfının dışında da tanımlanabilir:Object.prototype.toString = function(){// statements};Ancak sabit özellik mirasının aksine, prototip mirası, bir alt sınıfta yöntemi yeniden tanımlamak istediğinizdeoverride anahtar sözcüğünü gerektirmez. Örneğin. Object sınıfının bir alt sınıfında valueOf() yöntemini yenidentanımlamak istiyorsanız, üç seçeneğiniz vardır. İlk olarak, sınıf tanımının içinde alt sınıfın prototip nesnesinde birvalueOf() yöntemini tanımlayabilirsiniz. Aşağıdaki kod, Object sınıfının Foo adında bir alt sınıfını oluşturur ve sınıftanımının bir parçası olarak Foo alt sınıfının prototip nesnesinde valueOf() yöntemini yeniden tanımlar. Her sınıfObject öğesinden miras aldığı için, extends anahtar sözcüğünün kullanılması gerekmez.dynamic class Foo{prototype.valueOf = function(){return "Instance of Foo";};}İkinci olarak, aşağıdaki kodda gösterildiği gibi, sınıf tanımının dışında Foo alt sınıfının prototip nesnesinde birvalueOf() yöntemini tanımlayabilirsiniz:Foo.prototype.valueOf = function(){return "Instance of Foo";};Üçüncü olarak, Foo sınıfının parçası olarak valueOf() adında bir sabit özellik tanımlayabilirsiniz. Bu teknik, sabitözellik mirası ile prototip mirasını karma olarak kullandığından diğer tekniklerden farklıdır. valueOf() öğesiniyeniden tanımlamak isteyen tüm Foo alt sınıflarının override anahtar sözcüğünü kullanması gerekir. Aşağıdaki kod,Fooda sabit özellik olarak tanımlanan valueOf() öğesini gösterir:class Foo{function valueOf():String{return "Instance of Foo";}}
    • 120ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaAS3 ad alanıİki ayrı miras mekanizması, sabit özellik mirası ve prototip mirasının olması, çekirdek sınıfların özellikleri veyöntemleriyle ilgili ilginç bir uyumluluk zorluğu oluşturur. ActionScriptin esas aldığı ECMAScript dil belirtimiyleuyumluluk için prototip mirasının kullanılması gerekir, başka bir deyişle, çekirdek sınıfın özellikleri ve yöntemleri osınıfın prototip nesnesinde tanımlanır. Diğer yandan, ActionScript 3.0 ile uyumluluk için sabit özellik mirasınınkullanılması gerekir, başka bir deyişle, çekirdek sınıfın özellikleri ve yöntemleri, const, var ve function anahtarsözcükleri kullanılarak sınıf tanımında tanımlanır. Üstelik, prototip sürümleri yerine sabit özelliklerin kullanılması,çalışma zamanı performansında önemli ölçüde artış sağlayabilir.ActionScript 3.0, çekirdek sınıfları için hem prototip mirasını hem de sabit özellik mirasını kullanarak bu sorunuçözer. Çekirdek sınıfların her biri iki özellik ve yöntem kümesi içerir. Kümelerden biri, ECMAScript belirtimiyleuyumluluk sağlamak için prototip nesnesinde tanımlanırken, diğeri de ActionScript 3.0 ile uyumluluk sağlamak üzeresabit özellikler ve AS3 ad alanıyla tanımlanır.AS3 ad alanı, iki özellik ve yöntem kümesi arasında seçim yapılmasına yönelik kullanışlı bir mekanizma sağlar. AS3 adalanını kullanmazsanız, çekirdek sınıfın bir örneği, çekirdek sınıfın prototip nesnesinde tanımlanan özellikleri veyöntemleri miras alır. Sabit özellikler her zaman prototip özelliklerden daha çok tercih edildiği için, AS3 ad alanınıkullanmaya karar verirseniz, çekirdek sınıfın bir örneği AS3 sürümlerini miras alır. Başka bir deyişle, kullanılabilir birsabit özellik olduğunda, aynı ada sahip olan prototip özelliği yerine her zaman bu sabit özellik kullanılır.Bir özelliğin veya yöntemin AS3 ad alanı sürümünü AS3 ad alanıyla niteleyerek kullanabilirsiniz. Örneğin, aşağıdakikod, Array.pop() yönteminin AS3 sürümünü kullanır:var nums:Array = new Array(1, 2, 3);nums.AS3::pop();trace(nums); // output: 1,2Alternatif olarak, bir kod bloğu içindeki tüm tanımlar için AS3 ad alanını açmak üzere use namespace direktifinikullanabilirsiniz. Örneğin, aşağıdaki kod, pop() ve push() yöntemleri için AS3 ad alanını açmak üzere usenamespace direktifini kullanır:use namespace AS3;var nums:Array = new Array(1, 2, 3);nums.pop();nums.push(5);trace(nums) // output: 1,2,5ActionScript 3.0 ayrıca programınızın tamamına AS3 ad alanı uygulayabilmenizi sağlamak üzere her özellik kümesiiçin derleyici seçenekleri sağlar. -as3 derleyici seçeneği, AS3 ad alanını temsil ederken, -es derleyici seçeneği deprototip mirası seçeneğini (es, ECMAScripti ifade eder) temsil eder. Programınızın tamamı için AS3 ad alanını açmaküzere, -as3 derleyici seçeneğini true değerine ve -es derleyici seçeneğini de false değerine ayarlayın. Prototipsürümlerini kullanmak için, derleyici seçeneklerini karşıt değerlere ayarlayın. Adobe Flex Builder 3 ve Adobe FlashCS4 Professional için varsayılan derleyici ayarları şunlardır: -as3 = true ve -es = false.Herhangi bir çekirdek sınıfı genişletmeyi ve herhangi bir yöntemi geçersiz kılmayı planlıyorsanız, geçersiz kılınmış biryöntemi nasıl bildirmeniz gerektiğini AS3 ad alanının nasıl etkileyebildiğini anlamanız gerekir. AS3 ad alanınıkullanıyorsanız, çekirdek sınıf yönteminin herhangi bir yöntem geçersiz kılması, override niteliğiyle birlikte AS3 adalanını da kullanmalıdır. AS3 ad alanını kullanmıyor ve bir alt sınıfta çekirdek sınıf yöntemini yeniden tanımlamakistiyorsanız, AS3 ad alanını veya override anahtar sözcüğünü kullanmamanız gerekir.
    • 121ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaÖrnek: GeometricShapesGeometricShapes örnek uygulaması, ActionScript 3.0 kullanılarak aşağıda örnekleri verilen çok sayıda nesne tabanlıkavram ve özelliklerin nasıl uygulanabildiğini gösterir:• Sınıfları tanımlama• Sınıfları genişletme• Çok biçimlilik ve override anahtar sözcüğü• Arabirimleri tanımlama, genişletme ve uygulamaBu aynı zamanda, sınıf örnekleri oluşturan ve böylece bir arabirimin örneği olarak döndürme değerinin nasılbildirildiğini ve bu döndürülen nesnenin genel olarak nasıl kullanıldığını gösteren bir "fabrika yöntemini" içerir.Bu örneğin uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr.GeometricShapes uygulama dosyalarını Samples/GeometricShapes klasöründe bulabilirsiniz. Uygulama aşağıdakidosyaları içerir:GeometricShapes sınıflarını tanımlamaGeometricShapes uygulaması, kullanıcının bir geometrik şekil türünü ve boyutunu belirtmesine olanak sağlar. Budaha sonra şeklin açıklamasını, alanını ve çevre uzunluğunu içeren bir yanıt verir.Uygulama kullanıcı arabirimi, şeklin türünün seçilmesi, boyutun ayarlanması ve açıklamanın görüntülenmesineyönelik birkaç denetim içerecek şekilde küçük ve basittir. Bu uygulamanın en ilginç bölümü, yüzeyin altında, sınıfyapısında ve arabirimin kendisinde yer alır.Dosya AçıklamaGeometricShapes.mxmlveyaGeometricShapes.flaFlash (FLA) veya Flex (MXML) içindeki anauygulama dosyası.com/example/programmingas3/geometricshapes/IGeometricShape.as Tüm GeometricShapes uygulama sınıflarıtarafından uygulanacak yöntemleri tanımlayantemel arabirim.com/example/programmingas3/geometricshapes/IPolygon.as Birden çok kenarı olan GeometricShapesuygulama sınıfları tarafından uygulanacakyöntemleri tanımlayan bir arabirim.com/example/programmingas3/geometricshapes/RegularPolygon.as Şeklin merkezi etrafında simetrik olarakkonumlandırılmış eşit uzunlukta kenarlara sahipbir geometrik şekil türü.com/example/programmingas3/geometricshapes/Circle.as Bir daireyi tanımlayan geometrik şekil türü.com/example/programmingas3/geometricshapes/EquilateralTriangle.as Eşit kenar bir üçgeni tanımlayan birRegularPolygon alt sınıfı.com/example/programmingas3/geometricshapes/Square.as Kareyi tanımlayan bir RegularPolygon alt sınıfı.com/example/programmingas3/geometricshapes/GeometricShapeFactory.as Belirli bir tür ve boyutta şekiller oluşturulması içinfabrika yöntemini içeren bir sınıf.
    • 122ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaBu uygulama geometrik şekillerle ilgilidir ancak bunları grafiksel olarak görüntülemez. İlerleyen bir bölümünörneğinde (bkz. “Örnek: SpriteArranger” sayfa 307) yeniden kullanılacak sınıfların ve arabirimlerin küçük birkütüphanesini sağlar. SpriteArranger örneği, şekilleri grafiksel olarak görüntüler ve burada GeometricShapesuygulamasında sağlanan sınıf çerçevesini esas alarak kullanıcının bu şekilleri işlemesine olanak sağlar.Bu örnekte geometrik şekilleri tanımlayan sınıflar ve arabirimler, aşağıdaki diyagramda Unified Modeling Language(UML) notasyonu kullanılarak gösterilmektedir:GeometricShapes Örnek SınıflarArabirimlerle ortak davranışı tanımlamaBu GeometricShapes uygulaması, üç tür şekli ele alır: daireler, kareler ve eşkenar üçgenler. GeometricShapes sınıfyapısı, üç şekil türü için de ortak olan yöntemleri listeleyen IGeometricShape adındaki çok basit bir arabirimle başlar:package com.example.programmingas3.geometricshapes{public interface IGeometricShape{function getArea():Number;function describe():String;}}Bu arabirim iki yöntemi tanımlar: şeklin alanını hesaplayıp döndüren getArea() yöntemi ve şeklin özelliklerininmetin açıklamasını bir araya getiren describe() yöntemi.Ayrıca her şeklin çevre uzunluğunu da bilmek isteriz. Ancak dairenin çevresi benzersiz bir şekilde hesaplanır ve bunedenle de davranış bir üçgenin veya kareninkinden farklıdır. Yine de üçgenler, kareler ve diğer çokgenler arasındayeterince benzerlik olduğundan, yalnızca bunlara yönelik yeni bir arabirim sınıfının tanımlanması mantıklıdır:IPolygon. Ayrıca burada gösterildiği gibi IPolygon arabirimi daha basittir:<< interface >>IGeometricShape+getArea (): Number+describe (): Strin<< interface >>IPolygon+getPerimeter (): Number+getSumOfAngles (): NumberCircle+diameter:Number+Circle () : Circle+getArea () : Number+describe () : String+getCircumference () : Number+numSides : int+sideLength : Number+RegularPolygon (): RegularPolygon+getSumOfAngles (): Number+getPerimeter (): Number+getArea (): Number+describe (): StringRegularPolygon+EquilateralTriangle (): EquilateralTriangle+getArea (): Number+describe (): StringEquilateralTriangle+Square (): Square+getArea (): Number+describe (): StringSquare
    • 123ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamapackage com.example.programmingas3.geometricshapes{public interface IPolygon extends IGeometricShape{function getPerimeter():Number;function getSumOfAngles():Number;}}Bu arabirim, tüm çokgenler için ortak olan iki yöntemi tanımlar: tüm kenarların birleşik uzunluğunu hesaplayangetPerimeter() yöntemi ve tüm iç açıları toplayan getSumOfAngles() yöntemi.IPolygon arabirimi, IGeometricShape arabirimini genişletir, başka bir deyişle, IPolygon arabirimini uygulayan tümsınıfların, IGeometricShape arabiriminden iki tane ve IPolygon arabiriminden iki tane olmak üzere dört yönteminhepsini bildirmesi gerekir.Şekil sınıflarını tanımlamaTüm şekil türleri için ortak olan yöntemler hakkında iyice fikir edindikten sonra, şekil sınıflarını tanımlayabilirsiniz.Uygulamanız gereken yöntem sayısı açısından en basit şekil, burada gösterildiği gibi Circle sınıfıdır:package com.example.programmingas3.geometricshapes{public class Circle implements IGeometricShape{public var diameter:Number;public function Circle(diam:Number = 100):void{this.diameter = diam;}public function getArea():Number{// The formula is Pi * radius * radius.var radius:Number = diameter / 2;return Math.PI * radius * radius;}public function getCircumference():Number{// The formula is Pi * diameter.return Math.PI * diameter;}public function describe():String{var desc:String = "This shape is a Circle.n";desc += "Its diameter is " + diameter + " pixels.n";desc += "Its area is " + getArea() + ".n";desc += "Its circumference is " + getCircumference() + ".n";return desc;}}}
    • 124ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaCircle sınıfı, IGeometricShape arabirimini uygular, bu nedenle hem getArea() yöntemi hem de describe() yöntemiiçin kod sağlamalıdır. Ayrıca, Circle sınıfı için benzersiz olan getCircumference() yöntemini tanımlar. Circle sınıfıda diğer çokgen sınıflarında bulunmayan bir özellik olarak diameter özelliğini bildirir.Diğer iki şekil türü olan kareler ve eşkenar üçgenler, ortak başka şeylere sahiptir: bunların her biri eşit uzunluktakenarlara sahiptir ve her ikisi için de çevre uzunluğunu ve iç açıları toplamını hesaplamakta kullanabileceğiniz ortakformüller vardır. Aslında bu ortak formüller, gelecekte de tanımlamanız gerekecek diğer normal çokgenler için degeçerli olacaktır.RegularPolygon sınıfı hem Square sınıfı hem de EquilateralTriangle sınıfı için üst sınıf olacaktır. Üst sınıf, ortakyöntemleri tek bir yerde tanımlamanıza olanak sağlar, böylece alt sınıfların her birinde bunları ayrı ayrı tanımlamanızgerekmez. RegularPolygon sınıfının kodu şöyledir:package com.example.programmingas3.geometricshapes{public class RegularPolygon implements IPolygon{public var numSides:int;public var sideLength:Number;public function RegularPolygon(len:Number = 100, sides:int = 3):void{this.sideLength = len;this.numSides = sides;}public function getArea():Number{// This method should be overridden in subclasses.return 0;}public function getPerimeter():Number{return sideLength * numSides;}public function getSumOfAngles():Number{if (numSides >= 3)
    • 125ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlama{return ((numSides - 2) * 180);}else{return 0;}}public function describe():String{var desc:String = "Each side is " + sideLength + " pixels long.n";desc += "Its area is " + getArea() + " pixels square.n";desc += "Its perimeter is " + getPerimeter() + " pixels long.n";desc += "The sum of all interior angles in this shape is " + getSumOfAngles() + "degrees.n";return desc;}}}İlk olarak, RegularPolygon sınıfı, tüm normal çokgenler için ortak olan iki özelliği bildirir: kenarların her birininuzunluğu (sideLength özelliği) ve kenar sayısı (numSides özelliği).RegularPolygon sınıfı IPolygon arabirimini uygular ve IPolygon arabirim yöntemleri için dört yöntemi de bildirir.Ortak formülleri kullanarak bunlardan ikisini (getPerimeter() ve getSumOfAngles() yöntemleri) uygular.getArea() yönteminin formülü şekilden şekle farklı olacağından, yöntemin temel sınıf sürümü, alt sınıf yöntemleritarafından miras alınabilen ortak mantığı içeremez. Bunun yerine, alanın hesaplanmadığını belirtmek için 0 varsayılandeğerini döndürür. Her şeklin alanını doğru şekilde hesaplamak için, RegularPolygon sınıfının alt sınıfları, getArea()yöntemini geçersiz kılmalıdır.Aşağıdaki EquilateralTriangle sınıfının kodu, getArea() yönteminin nasıl geçersiz kılındığını gösterir:
    • 126ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamapackage com.example.programmingas3.geometricshapes{public class EquilateralTriangle extends RegularPolygon{public function EquilateralTriangle(len:Number = 100):void{super(len, 3);}public override function getArea():Number{// The formula is ((sideLength squared) * (square root of 3)) / 4.return ( (this.sideLength * this.sideLength) * Math.sqrt(3) ) / 4;}public override function describe():String{/* starts with the name of the shape, then delegates the restof the description work to the RegularPolygon superclass */var desc:String = "This shape is an equilateral Triangle.n";desc += super.describe();return desc;}}}override anahtar sözcüğü, EquilateralTriangle.getArea() yönteminin RegularPolygon üst sınıfındangetArea() yöntemini kasıtlı olarak geçersiz kıldığını belirtir. EquilateralTriangle.getArea() yöntemiçağrıldığında, önceki kodda bulunan formülü kullanarak alanı hesaplar ve RegularPolygon.getArea()yöntemindeki kod asla çalıştırılmaz.Buna karşılık, EquilateralTriangle sınıfı, kendi getPerimeter() yöntemi sürümünü tanımlamaz.EquilateralTriangle.getPerimeter() yöntemi çağrıldığında, çağrı miras zincirinde yukarı gider veRegularPolygon üst sınıfının getPerimeter() yönteminde kodu çalıştırır.EquilateralTriangle() yapıcısı, üst sınıfının RegularPolygon() yapıcısını açıkça çağırmak için super()deyimini kullanır. Her iki yapıcı da aynı parametre kümesine sahip olsaydı, EquilateralTriangle() yapıcısıtamamen çıkarılabilir ve bunun yerine RegularPolygon() yapıcısı çalıştırılabilirdi. Ancak, RegularPolygon()yapıcısı numSides adında fazladan bir parametre gerektirir. Bu nedenle EquilateralTriangle() yapıcısı, üçgenin 3kenarının olduğunu belirtmek için len girdi parametresi ve 3 değeriyle birlikte iletilen super(len, 3) öğesini çağırır.describe() yöntemi de super() deyimini kullanır ancak bunu farklı bir şekilde, RegularPolygon üst sınıfınındescribe() yöntemi sürümünü çağırmak için kullanır. EquilateralTriangle.describe() yöntemi ilk olarakdesc dize değişkenini şeklin türüyle ilgili bir deyime ayarlar. Daha sonra super.describe() öğesini çağırarakRegularPolygon.describe() yönteminin sonuçlarını alır ve bu sonuçları desc dizesine ekler.Square sınıfı burada ayrıntılı şekilde ele alınmayacaktır ancak bu sınıf, EquilateralTriangle sınıfına çok benzeyip biryapıcı ve getArea() ve describe() yöntemlerinin kendi uygulamalarını sağlar.Çok biçimlilik ve fabrika yöntemiArabirim ve mirastan yararlanan bir sınıf kümesi birçok ilginç şekilde kullanılabilir. Örneğin, şu ana kadar açıklananşekil sınıflarının tümü IGeometricShape arabirimini uygular veya bir üst sınıfı genişletir. Bu nedenle de, bir değişkeniIGeometricShape örneği olacak şekilde tanımlarsanız, o değişkene yönelik describe() yöntemini çağırmak için sözkonusu değişkenin gerçekte Circle sınıfının mı yoksa Square sınıfının mı bir örneği olduğunu bilmenize gerek yoktur.
    • 127ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamaAşağıdaki kod, bunun nasıl olduğunu gösterir:var myShape:IGeometricShape = new Circle(100);trace(myShape.describe());Değişken IGeometricShape arabiriminin bir örneği olarak tanımlansa da temel alınan sınıf Circle olduğundan,myShape.describe() öğesi çağrıldığında Circle.describe() yöntemini çalıştırır.Bu örnek, çok biçimlilik ilkesinin uygulanmasını gösterir: tamamen aynı yöntem çağrısı, yöntemi çağrılan nesnesınıfına bağlı olarak, farklı bir kodun çalıştırılmasına neden olur.GeometricShapes uygulaması, fabrika yöntemi olarak bilinen basitleştirilmiş bir tasarım modeli sürümü kullanarak butürde bir arabirim tabanlı çok biçimliliği uygular. Fabrika yöntemi terimi, temel alınan veri türü veya içerikleribağlama göre değişebilen bir nesneyi döndüren işlevi ifade eder.Burada gösterilen GeometricShapeFactory sınıfı, createShape() adındaki bir fabrika yöntemini tanımlar:package com.example.programmingas3.geometricshapes{public class GeometricShapeFactory{public static var currentShape:IGeometricShape;public static function createShape(shapeName:String,len:Number):IGeometricShape{switch (shapeName){case "Triangle":return new EquilateralTriangle(len);case "Square":return new Square(len);case "Circle":return new Circle(len);}return null;}public static function describeShape(shapeType:String, shapeSize:Number):String{GeometricShapeFactory.currentShape =GeometricShapeFactory.createShape(shapeType, shapeSize);return GeometricShapeFactory.currentShape.describe();}}}createShape() fabrika yöntemi, yeni nesnelerin uygulama tarafından daha genel şekilde işlenebilmesi için yeninesneleri IGeometricShape örnekleri olarak döndürürken, şekil alt sınıf yapıcılarının, oluşturdukları örneklerinayrıntılarını tanımlamasına da olanak sağlar.Önceki örnekte bulunan describeShape() yöntemi, bir uygulamanın daha belirli bir nesnenin genel başvurusunualmak için nasıl fabrika yöntemini kullanabildiğini gösterir. Uygulama, şu şekilde, yeni oluşturulmuş bir Circlenesnesinin açıklamasını alabilir:GeometricShapeFactory.describeShape("Circle", 100);
    • 128ACTIONSCRIPT 3.0I PROGRAMLAMAActionScriptte nesne tabanlı programlamadescribeShape() yöntemi, aynı parametrelerle createShape() fabrika yöntemini çağırarak yeni Circle nesnesiniIGeometricShape nesnesi olarak yazılmış currentShape adındaki bir statik değişkende saklar. Daha sonra,currentShape nesnesinde describe() yöntemi çağrılır ve Circle.describe() yöntemini çalıştırıp daireninayrıntılı bir açıklamasını döndürmek için bu çağrı otomatik olarak çözümlenir.Örnek uygulamayı geliştirmeArabirimlerin ve mirasın gerçek gücü, uygulamanızı geliştirdiğinizde veya değiştirdiğinizde belirgin olur.Bu örnek uygulamaya yeni bir şekil olarak beşgen eklemek istediğinizi varsayın. Bu durumda, RegularPolygon sınıfınıgenişleten ve getArea() ve describe() yöntemlerinin kendi sürümlerini tanımlayan yeni bir Pentagon sınıfıoluşturursunuz. Daha sonra, uygulamanın kullanıcı arabiriminde açılır kutuya yeni bir Pentagon seçeneği eklersiniz.Ve işte hepsi budur. Pentagon sınıfı miras yoluyla RegularPolygon sınıfından getPerimeter() yönteminin vegetSumOfAngles() yönteminin işlevselliğini otomatik olarak alır. Pentagon örneği, IGeometricShape arabiriminiuygulayan bir sınıftan miras aldığından, IGeometricShape örneği olarak da değerlendirilebilir. Başka bir deyişle, yenibir şekil türü eklemek için, GeometricShapeFactory sınıfındaki yöntemlerden herhangi birinin yöntem imzasınıdeğiştirmeniz gerekmez (dolayısıyla, GeometricShapeFactory sınıfını kullanan kodlardan herhangi birini dedeğiştirmeniz gerekmez).Arabirimlerin ve mirasın bir uygulamaya yeni özellikler eklemeye yönelik iş yükünü nasıl azalttığını görmek için,uygulama amacıyla Geometric Shapes örneğine bir Pentagon sınıfı eklemek isteyebilirsiniz.
    • 129Bölüm 6: Tarih ve saatlerle çalışmaZamanlama her şey olmayabilir ancak yazılım uygulamalarında önemli bir faktördür. ActionScript 3.0, takvimgünlerinin, saatlerinin ve zaman aralıklarının yönetilmesi için güçlü yollar sağlar. Bu zamanlama işlevinin çoğunu ikiana sınıf sağlar: Date sınıfı ve flash.utils paketindeki yeni Timer sınıfı.Tarih ve saat temelleriTarih ve saatlerle çalışmaya girişTarih ve saatler, ActionScript programlarında kullanılan yaygın bir bilgi türüdür. Örneğin, diğer olasılıklar arasındahaftanın geçerli gününü bilmeniz veya bir kullanıcının belirli bir ekranda ne kadar zaman harcadığını ölçmenizgerekebilir. ActionScriptte, tarih ve saat bilgileri dahil olmak üzere, zaman içindeki tek bir anı temsil etmek için Datesınıfını kullanabilirsiniz. Date örneği içinde, her bir tarih ve saat birimi için değerler vardır. Bu değerler arasında, yıl,ay, gün, haftanın günü, saat, dakika, saniye, milisaniye ve saat dilimi yer alır. Daha ileri düzey kullanıcılar içinActionScript, belirli bir gecikmeden sonra veya art arda aralıklarla eylemleri gerçekleştirmek için kullanabildiğinizTimer sınıfını da içerir.Ortak tarih ve saat görevleriBu bölümde, tarih ve saat bilgileriyle çalışmaya yönelik şu ortak görevler açıklanmaktadır:• Date nesneleriyle çalışma• Geçerli tarih ve saati alma• Ayrı ayrı tarih ve saat birimlerine (gün, yıl, saat, dakika, vb.) erişme• Tarih ve saatlerle aritmetik uygulama• Saat dilimleri arasında dönüştürme yapma• Yinelenen eylemler gerçekleştirme• Ayarlanmış bir zaman aralığından sonra eylemler gerçekleştirmeÖnemli kavramlar ve terimlerAşağıdaki başvuru listesinde, bu bölümde karşınıza çıkacak önemli terimler bulunmaktadır:• UTC saati: Eşitlenmiş Evrensel Saat—“sıfır saat” başvurusu saat dilimi. Diğer tüm saat dilimleri, UTC zamanınagöre (ilerisinde veya gerisinde) saat sayısı olarak tanımlanır.Bölüm içi örneklerle çalışmaBu bölümde çalışırken örnek kod listelerinin bazılarını test etmek isteyebilirsiniz. Bu bölümdeki kod listeleri öncelikleDate nesneleriyle ilgili olduğundan, örneklerin test edilmesi işlemi, değerleri Sahne Alanındaki bir metin alanıörneğine yazarak veya Çıktı paneline değerleri yazdırmak için trace() işlevlerini kullanarak, örneklerde kullanılandeğişkenlerin değerlerinin görüntülenmesini içerir. Bu teknikler, “Bölüm içi örnek kod listelerini test etme” sayfa 34bölümünde ayrıntılı şekilde açıklanmıştır.
    • 130ACTIONSCRIPT 3.0I PROGRAMLAMATarih ve saatlerle çalışmaTakvim tarih ve saatlerini yönetmeActionScript 3.0daki tüm takvim tarihi ve saati yönetimi işlevleri, üst düzey Date sınıfında yoğunlaşmıştır. Date sınıfı,Eşitlenmiş Evrensel Saatte (UTC) veya bir saat dilimine özel yerel saatte tarih ve saatleri işlemenize olanak sağlayanyöntemleri ve özellikleri içerir. UTC, temelde Greenwich Saati (GMT) ile aynı olan standart bir saat tanımıdır.Date nesneleri oluşturmaDate sınıfı, tüm çekirdek sınıfların en çok yönlü yapıcı yöntemlerinden birini sağlar. Dört farklı şekilde bunuçağırabilirsiniz.İlk olarak, herhangi bir parametre verilmediyse, Date() yapıcısı, saat diliminizi esas alarak yerel saatte geçerli tarih vesaati içeren bir Date nesnesini döndürür. Aşağıda buna bir örnek verilmiştir:var now:Date = new Date();İkinci olarak, tek bir sayısal parametre verildiyse, Date() yapıcısı bunu 1 Ocak 1970ten bu yana geçen milisaniye sayısıolarak değerlendirir ve karşılık gelen bir Date nesnesini döndürür. İlettiğiniz milisaniye değerinin, UTCde 1 Ocak1970ten bu yana geçen milisaniye sayısı olarak değerlendirildiğini unutmayın. Ancak değerleri almak vegörüntülemek için UTCye özel yöntemleri kullanmadığınız sürece Date nesnesi, yerel saat diliminizdeki değerlerigösterir. Tek bir milisaniye parametresi kullanarak yeni bir Date nesnesi oluşturursanız, yerel saatiniz ile UTCarasındaki saat dilimi farkını dikkate aldığınızdan emin olun. Aşağıdaki deyimler, UTCde 1 Ocak 1970 gününün geceyarısına ayarlanmış bir Date nesnesi oluşturur:var millisecondsPerDay:int = 1000 * 60 * 60 * 24;// gets a Date one day after the start date of 1/1/1970var startTime:Date = new Date(millisecondsPerDay);Üçüncü olarak, Date() yapıcısına birden çok sayısal parametre iletebilirsiniz. Yapıcı bu parametreleri sırayla yıl, ay,gün, saat, dakika, saniye ve milisaniye olarak değerlendirir ve karşılık gelen Date nesnesini döndürür. Bu girdiparametrelerinin UTCde değil yerel saatte olduğu varsayılır. Aşağıdaki deyimler, yerel saatte 1 Ocak 2000başlangıcında gece yarısına ayarlanmış bir Date nesnesi alır:var millenium:Date = new Date(2000, 0, 1, 0, 0, 0, 0);Dördüncü olarak, Date() yapıcısına tek bir dize parametresi iletebilirsiniz. Yapıcı bu dizeyi tarih veya saatbileşenlerine ayrıştırmayı dener ve sonra karşılık gelen bir Date nesnesini döndürür. Bu yaklaşımı kullanırsanız,ayrıştırma hatalarını yakalamak için Date() yapıcısının bir try..catch bloğunun içine alınması iyi bir fikirdir.Date() yapıcısı, ActionScript 3.0 Dil ve Bileşenler Başvurusunda listelendiği gibi, çok sayıda değişik dize formatınıkabul eder. Aşağıdaki deyim, bir dize değeri kullanarak yeni bir Date nesnesini başlatır:var nextDay:Date = new Date("Mon May 1 2006 11:30:00 AM");Date() yapıcısı dize parametresini başarıyla ayrıştıramazsa, istisna atmaz. Ancak sonuçta elde edilen Date nesnesigeçersiz bir tarih değeri içerir.Zaman birimi değerlerini almaDate sınıfının özelliklerini veya yöntemlerini kullanarak bir Date nesnesi içindeki çeşitli zaman birimlerinindeğerlerini ayıklayabilirsiniz. Aşağıdaki özelliklerin her biri, size Date nesnesindeki bir zaman biriminin değerini verir:• fullYear özelliği• Ocak için 0 ile başlayıp Aralık için 11 olacak şekilde sayısal formatta olan month özelliği• 1 ile 31 aralığında, ayın gününü ifade eden takvim numarası olan date özelliği
    • 131ACTIONSCRIPT 3.0I PROGRAMLAMATarih ve saatlerle çalışma• Pazar için 0 olmak üzere sayısal formatta haftanın günü olan day özelliği• 0 ile 23 aralığı içinde hours özelliği• minutes özelliği• seconds özelliği• milliseconds özelliğiAslına bakılırsa, Date sınıfı bu değerlerin her birinin alınması için size birçok yol sağlar. Örneğin, Date nesnesininay değerini dört farklı şekilde alabilirsiniz:• month özelliği• getMonth() yöntemi• monthUTC özelliği• getMonthUTC() yöntemiBu dört yol da verimlilik açısından eşdeğerdir, böylece uygulamanıza en iyi şekilde uyan yaklaşımı kullanabilirsiniz.Listelenen özelliklerin tümü, toplam tarih değerinin bileşenlerini temsil eder. Örneğin, milisaniye değeri 1000eulaştığında saniye değeri 1 artıp milliseconds özelliği 0 değerine getirildiğinden, milisaniye değeri asla 999danbüyük olmaz.Date nesnesinin değerini, 1 Ocak 1970 (UTC) tarihinden bu yana geçen milisaniye sayısı olarak almak isterseniz,getTime() yöntemini kullanabilirsiniz. Bunun karşılığı olan setTime() yöntemi, 1 Ocak 1970ten (UTC) bu yanageçen milisaniye sayısını kullanarak varolan bir Date nesnesinin değerini değiştirmenize olanak sağlar.Tarih ve saat aritmetiği yapmaDate sınıfıyla tarih ve saatlerde toplama ve çıkarma işlemleri yapabilirsiniz. Tarih değerleri dahili olarak milisaniyecinsinde saklanır, böylece diğer değerleri Date nesnelerine eklemeden veya Date nesnelerinden çıkarmadan öncemilisaniyeye dönüştürmeniz gerekir.Uygulamanız çok sayıda tarih ve saat aritmetiği uygulayacaksa, aşağıdaki gibi, ortak zaman birimi değerlerinimilisaniye cinsinde tutan sabitler oluşturulması yararlı olabilir:public static const millisecondsPerMinute:int = 1000 * 60;public static const millisecondsPerHour:int = 1000 * 60 * 60;public static const millisecondsPerDay:int = 1000 * 60 * 60 * 24;Artık standart zaman birimlerini kullanarak tarih aritmetiği yapmak çok kolay. Aşağıdaki kod, getTime() vesetTime() yöntemlerini kullanarak geçerli saatten bir saate bir tarih değeri ayarlar:var oneHourFromNow:Date = new Date();oneHourFromNow.setTime(oneHourFromNow.getTime() + millisecondsPerHour);Tarih değeri ayarlamanın başka bir yolu, tek bir milisaniye parametresi kullanarak yeni bir Date nesnesioluşturulmasıdır. Örneğin, aşağıdaki kod, başka bir tarihi hesaplamak için bir tarihe 30 gün ekler:// sets the invoice date to todays datevar invoiceDate:Date = new Date();// adds 30 days to get the due datevar dueDate:Date = new Date(invoiceDate.getTime() + (30 * millisecondsPerDay));Ardından, 30 günlük zamanı temsil etmesi için millisecondsPerDay sabiti 30 ile çarpılır ve sonuç invoiceDatedeğerine eklenip dueDate değerini ayarlamak için kullanılır.
    • 132ACTIONSCRIPT 3.0I PROGRAMLAMATarih ve saatlerle çalışmaSaat dilimleri arasında dönüştürme yapmaTarih ve saat aritmetiği, tarihleri bir saat diliminden diğerine dönüştürmek istediğinizde kullanışlıdır. Date nesnesininsaat diliminin UTCden farklı olduğu dakika cinsinden değeri döndüren getTimezoneOffset() yöntemi de aynıişleve sahiptir. Tüm saat dilimleri çift saatlik artışa ayarlanmadığından (bazıları yakın saat dilimlerinden yarım saatfarklıdır), dakika cinsinden bir değer döndürür.Aşağıdaki örnek, bir tarihi yerel saatten UTCye dönüştürmek için saat dilimi farkını kullanır. İlk olarak saat dilimideğerini milisaniye cinsinden hesaplayıp sonra Date değerini o miktara göre ayarlayarak dönüştürmeyi gerçekleştirir:// creates a Date in local timevar nextDay:Date = new Date("Mon May 1 2006 11:30:00 AM");// converts the Date to UTC by adding or subtracting the time zone offsetvar offsetMilliseconds:Number = nextDay.getTimezoneOffset() * 60 * 1000;nextDay.setTime(nextDay.getTime() + offsetMilliseconds);Zaman aralıklarını denetlemeAdobe Flash CS4 Professionalı kullanarak uygulamalar geliştirdiğinizde, uygulamanızda sabit, kare kare ilerlemesağlayan zaman çizelgesine erişiminiz olur. Yalnızca ActionScript projelerindeyse, diğer zamanlama mekanizmalarınıkullanmanız gerekir.Döngüler ve zamanlayıcılarBazı programlama dillerinde, for veya do..while gibi döngü deyimlerini kullanarak kendi zamanlama şemalarınızıtasarlamanız gerekir.Döngü deyimleri genellikle yerel makinenin izin verdiği ölçüde hızlı şekilde çalıştırılır, başka bir deyişle, uygulama bazımakinelerde hızlı çalışırken, başka makinelerde yavaş çalışabilir. Uygulamanız için tutarlı bir zamanlama aralığıgerekirse, uygulamanızı gerçek bir takvim veya saat zamanına bağlamanız gerekir. Oyun, animasyon ve gerçek zamanlıdenetleyiciler gibi birçok uygulama için makineden makineye tutarlı olan normal, zaman odaklı şekilde ilerleyenmekanizmalar gerekir.ActionScript 3.0 Timer sınıfı güçlü bir çözüm sunar. Timer sınıfı, belirtilen zaman aralığına her ulaşıldığındaActionScript 3.0 olay modelini kullanarak zamanlayıcı olaylarını gönderir.Timer sınıfıActionScript 3.0da zamanlama işlevlerini işlemenin tercih edilen yolu, bir aralığa her ulaşıldığında olayları göndermekiçin kullanılabilen Timer sınıfının (flash.utils.Timer) kullanılmasıdır.Bir zamanlayıcıyı başlatmak için, ilk olarak bir Timer sınıfı örneğini oluşturarak bu sınıfa ne sıklıkla bir zamanlayıcıolayı oluşturacağını ve durmadan önce kaç defa bunu yapacağını bildirirdiniz.Örneğin, aşağıdaki kod, her saniye bir olay gönderen ve 60 saniye boyunca bu işleme devam eden bir Timer örneğinioluşturur:var oneMinuteTimer:Timer = new Timer(1000, 60);Timer nesnesi, belirli bir aralığa her ulaşıldığında bir TimerEvent nesnesi gönderir. TimerEvent nesnesinin olay türütimer (TimerEvent.TIMER sabitiyle tanımlı) olur. TimerEvent nesnesi, standart bir Event nesnesiyle aynı özellikleriiçerir.
    • 133ACTIONSCRIPT 3.0I PROGRAMLAMATarih ve saatlerle çalışmaTimer örneği sabit sayıda bir aralığa ayarlanırsa, son aralığa ulaştığında bir timerComplete olayı da(TimerEvent.TIMER_COMPLETE sabitiyle tanımlı) gönderir.Aşağıda, Timer sınıfını eylem halinde gösteren küçük bir örnek uygulama yer almaktadır:package{import flash.display.Sprite;import flash.events.TimerEvent;import flash.utils.Timer;public class ShortTimer extends Sprite{public function ShortTimer(){// creates a new five-second Timervar minuteTimer:Timer = new Timer(1000, 5);// designates listeners for the interval and completion eventsminuteTimer.addEventListener(TimerEvent.TIMER, onTick);minuteTimer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);// starts the timer tickingminuteTimer.start();}public function onTick(event:TimerEvent):void{// displays the tick count so far// The target of this event is the Timer instance itself.trace("tick " + event.target.currentCount);}public function onTimerComplete(event:TimerEvent):void{trace("Times Up!");}}}ShortTimer sınıfı oluşturulduğunda, bu sınıf beş saniye boyunca saniyede bir defa ilerleyecek bir Timer örneğioluşturur. Daha sonra zamanlayıcıya iki dinleyici ekler: biri ilerlemelerin her birini dinler, diğeri de timerCompleteolayını dinler.Ardından zamanlayıcı ilerlemesini başlatır ve bu noktadan itibaren bir saniyelik aralıklarla onTick() yöntemiçalıştırılır.onTick() yöntemi geçerli ilerleme sayısını gösterir. Beş saniye geçtikten sonra, onTimerComplete() yöntemiçalıştırılarak zamanın dolduğunu bildirir.Bu örneği çalıştırdığınızda, konsolunuzda veya izleme pencerenizde, saniyede birer satır hızında şu satırlarıngörüntülenmesi gerekir:
    • 134ACTIONSCRIPT 3.0I PROGRAMLAMATarih ve saatlerle çalışmatick 1tick 2tick 3tick 4tick 5Times Up!flash.utils paketinde zamanlama işlevleriActionScript 3.0, ActionScript 2.0dakine benzer çok sayıda zamanlama işlevi içerir. Bu işlevler, flash.utils paketindepaket düzeyinde işlevler olarak sağlanır ve ActionScript 2.0daki gibi çalışır.Bu işlevler, geriye doğru uyumluluk için ActionScript 3.0da kalmıştır. Adobe, bunları yeni ActionScript 3.0uygulamalarında kullanmanızı önermez. Genellikle uygulamalarınızda Timer sınıfının kullanılması hem daha kolayhem de daha verimlidir.Örnek: Basit analog saatBasit bir analog saat örneği, bu bölümde ele alınan tarih ve saat kavramlarından ikisini gösterir:• Geçerli tarih ve saati alma ve saat, dakika ve saniye değerlerini ayıklama• Uygulamanın hızını ayarlamak için bir Timer öğesini kullanmaBu örneğin uygulama dosyalarını edinmek için bkz.www.adobe.com/go/learn_programmingAS3samples_flash_tr. SimpleClock uygulama dosyalarınıSamples/SimpleClock klasörü içinde bulabilirsiniz. Uygulama aşağıdaki dosyaları içerir:İşlev AçıklamaclearInterval(id:uint):void Belirtilen bir setInterval() çağrısını iptal eder.clearTimeout(id:uint):void Belirtilen bir setTimeout() çağrısını iptal eder.getTimer():int Adobe® Flash® Player veya Adobe® AIR™ başlatıldıktan sonra geçen milisaniyesayısını döndürür.setInterval(closure:Function,delay:Number, ... arguments):uintBir işlevi belirtilen bir aralıkta (milisaniye olarak) çalıştırır.setTimeout(closure:Function,delay:Number, ... arguments):uintBelirtilen bir işlevi belirtilen bir gecikmeden sonra (milisaniye olarak) çalıştırır.Dosya AçıklamaSimpleClockApp.mxmlveyaSimpleClockApp.flaFlash (FLA) veya Flex (MXML) içindeki ana uygulama dosyası.com/example/programmingas3/simpleclock/SimpleClock.as Ana uygulama dosyası.com/example/programmingas3/simpleclock/AnalogClockFace.as Yuvarlak bir saat yüzü çizer ve saati esas alarak akrep,yelkovan ve saniye göstergesini çizer.
    • 135ACTIONSCRIPT 3.0I PROGRAMLAMATarih ve saatlerle çalışmaSimpleClock sınıfını tanımlamaSaat örneği basit olsa da, ileride kolayca genişletebilmeniz için basit uygulamaların da organize edilmesi iyi bir fikirdir.Bu nedenle SimpleClock uygulaması, açılış ve zaman saptama görevlerini işlemek için SimpleClock sınıfını kullanır vesonra da gerçekten zamanı göstermek için de AnalogClockFace adında başka bir sınıfı kullanır.Aşağıda, SimpleClock sınıfını tanımlayıp başlatan kod yer almaktadır (Flash sürümünde, bunun yerine SimpleClocköğesinin Sprite sınıfını genişlettiğini unutmayın):public class SimpleClock extends UIComponent{/*** The time display component.*/private var face:AnalogClockFace;/*** The Timer that acts like a heartbeat for the application.*/private var ticker:Timer;Bu sınıf iki önemli özelliğe sahiptir:• AnalogClockFace sınıfının bir örneği olan face özelliği• Timer sınıfının bir örneği olan ticker özelliğiSimpleClock sınıfı varsayılan bir yapıcıyı kullanır. initClock() yöntemi gerçek kurulum çalışmasıyla ilgilenereksaat yüzünden başlar ve Timer örneği ilerlemesini başlatır.Saat yüzünü oluşturmaSimpleClock kodundaki sonraki satırlar, saati görüntülemek için kullanılan saat yüzünü oluşturur:/*** Sets up a SimpleClock instance.*/public function initClock(faceSize:Number = 200){// creates the clock face and adds it to the display listface = new AnalogClockFace(Math.max(20, faceSize));face.init();addChild(face);// draws the initial clock displayface.draw();Yüzün boyutu, initClock() yöntemine iletilebilir. Herhangi bir faceSize değeri iletilmezse, varsayılan 200 pikselboyut kullanılır.Daha sonra uygulama, yüzü başlatır ve DisplayObject sınıfından miras alınan addChild() yöntemini kullanarak buyüzü görüntüleme listesine ekler. Ve saat yüzünü bir defa görüntülemek için AnalogClockFace.draw() yönteminiçağırarak geçerli saati gösterir.Zamanlayıcıyı başlatmaSaat yüzü oluşturulduktan sonra, initClock() yöntemi bir zamanlayıcı ayarlar:
    • 136ACTIONSCRIPT 3.0I PROGRAMLAMATarih ve saatlerle çalışma// creates a Timer that fires an event once per secondticker = new Timer(1000);// designates the onTick() method to handle Timer eventsticker.addEventListener(TimerEvent.TIMER, onTick);// starts the clock tickingticker.start();İlk olarak bu yöntem, saniyede bir defa (her 1000 milisaniyede) olay gönderecek bir Timer örneği başlatır. Timer()yapıcısına herhangi bir repeatCount parametresi iletilmediğinden, Timer sınırsız sayıda yinelemeyi sürdürür.timer olayı alındığında, SimpleClock.onTick() yöntemi saniyede bir defa çalıştırılır:public function onTick(event:TimerEvent):void{// updates the clock displayface.draw();}AnalogClockFace.draw() yöntemi yalnızca saat yüzünü ve akrep, yelkovan ve saniye göstergesini çizer.Geçerli saati görüntülemeAnalogClockFace sınıfındaki kodun büyük bir kısmı, saat yüzünün görüntüleme öğelerinin ayarlanmasını kapsar.AnalogClockFace başlatıldığında, dairesel bir anahat çizer, her saat işaretine sayısal bir metin etiketi yerleştirir ve sonrasaatteki akrep, yelkovan ve saniye göstergesinin her biri için birer tane olmak üzere üç Shapenesnesi oluşturur.SimpleClock uygulaması çalışmaya başladıktan sonra, aşağıdaki gibi her saniye AnalogClockFace.draw() yönteminiçağırır:/*** Called by the parent container when the display is being drawn.*/public override function draw():void{// stores the current date and time in an instance variablecurrentTime = new Date();showTime(currentTime);}Bu yöntem geçerli saati bir değişkene kaydeder, böylece akrep, yelkovan ve saniye göstergesi çizilirken işleminortasında saat değişemez. Ardından aşağıda gösterildiği gibi, akrep, yelkovan ve saniye göstergesini görüntülemek içinshowTime() yöntemini çağırır:
    • 137ACTIONSCRIPT 3.0I PROGRAMLAMATarih ve saatlerle çalışma/*** Displays the given Date/Time in that good old analog clock style.*/public function showTime(time:Date):void{// gets the time valuesvar seconds:uint = time.getSeconds();var minutes:uint = time.getMinutes();var hours:uint = time.getHours();// multiplies by 6 to get degreesthis.secondHand.rotation = 180 + (seconds * 6);this.minuteHand.rotation = 180 + (minutes * 6);// Multiply by 30 to get basic degrees, then// add up to 29.5 degrees (59 * 0.5)// to account for the minutes.this.hourHand.rotation = 180 + (hours * 30) + (minutes * 0.5);}İlk olarak bu yöntem, geçerli zamanın saat, dakika ve saniye değerlerini ayıklar. Daha sonra akrep, yelkovan ve saniyegöstergesinin her birinin açısını hesaplamak için bu değerleri kullanır. Saniye göstergesi tam bir dönüşü 60 saniyedegerçekleştirdiğinden, bu gösterge her saniyede 6 derece (360/60) dönüş yapar. Yelkovan da her dakika aynı derecedönüş yapar.Akrep de her dakika güncellenir, böylece dakikalar ilerledikçe o da aynı ilerlemeyi gösterebilir. Her saatte 30 derece(360/12) dönüş yapmanın yanı sıra her dakika da yarım derece döner (60 dakika/30 derece).
    • 138Bölüm 7: Dizelerle çalışmaString sınıfı, metin dizeleriyle çalışmanıza olanak sağlayan yöntemleri içerir. Dizeler birçok nesneyle çalışılmasındaönemlidir. Bu bölümde açıklanan yöntemler, TextField, StaticText, XML, ContextMenu ve FileReference nesnelerigibi nesnelerde kullanılan dizelerle çalışılmasında kullanışlıdır.Dizeler, karakterler sırasıdır. ActionScript 3.0, ASCII ve Unicode karakterlerini destekler.Dizelerin temelleriDizelerle çalışmaya girişProgramlama dilinde dize, bir metin değeridir, başka bir deyişle, harf, sayı ve diğer karakterlerin tek bir değer olarakbirleştirilmiş sırasıdır. Örneğin, bu kod satırı, String veri türünde bir değişken oluşturur ve bu değişkene değişmez birdize değeri atar:var albumName:String = "Three for the money";Bu örnekte gösterildiği gibi, ActionScriptte, metni tırnak veya kesme işareti içine alarak bir dize değerinibelirtebilirsiniz. Aşağıda başka dize örneklerine de yer verilmiştir:"Hello""555-7649""http://www.adobe.com/"ActionScriptte bir metin parçasını işlediğinizde bir dize değeriyle çalışıyorsunuz demektir. ActionScript String sınıfı,metin değerleriyle çalışmak için kullanabildiğiniz veri türüdür. String örnekleri genellikle özellikler, yöntemparametreleri ve diğer birçok ActionScript sınıfındaki öğeler için kullanılır.Dizelerle çalışmaya yönelik ortak görevlerAşağıda, bu bölümde ele alınan dizelerle ilgili ortak görevlere yer verilmiştir:• String nesneleri oluşturma• Satır başı, sekme ve klavye dışı karakterler gibi özel karakterlerle çalışma• Dize uzunluğunu ölçme• Dizede tek karakterleri ayırma• Dizeleri birleştirme• Dizeleri karşılaştırma• Dize bölümlerini bulma, ayıklama ve değiştirme• Dizeleri büyük harfli veya küçük harfli duruma getirmeÖnemli kavramlar ve terimlerAşağıdaki başvuru listesinde, bu bölümde karşınıza çıkacak önemli terimler bulunmaktadır:• ASCII: Bilgisayar programlarında metin karakterlerinin ve sembollerin temsil edilmesine yönelik bir sistem. ASCIIsistemi, 26 harfli İngilizce alfabesini ve sınırlı bir ek karakter kümesini destekler.
    • 139ACTIONSCRIPT 3.0I PROGRAMLAMADizelerle çalışma• Karakter: Metin verisinin en küçük birimi (tek bir harf veya sembol).• Bitiştirme: Birden çok dize değerini birbirine ekleyip bitiştirerek yeni bir dize değeri oluşturma.• Boş dize: "" şeklinde yazılan, herhangi bir metin, boşluk veya karakter içermeyen bir dize. Boş dize değeri, nulldeğerine sahip bir String değişkeninden farklıdır—boş dize herhangi bir karakter içermeyen bir String örneğinesahipken, null String değeri, kendisine bir String örneği atanmamış değişkendir.• Dize: Bir metin değeri (karakterler sırası).• Dize değişmezi (veya “değişmez dize”): Kodda açıkça yazılan, tırnak veya kesme işareti içine alınmış bir dize değeri.• Alt dize: Başka bir dizenin parçası olan bir dize.• Unicode: Bilgisayar programlarında metin karakterlerinin ve sembollerin temsil edilmesine yönelik standart birsistem. Unicode sistemi, herhangi bir yazma sisteminde tüm karakterlerin kullanılmasına olanak sağlar.Bölüm içi örneklerle çalışmaBu bölümde çalışırken örnek kod listelerinin bazılarını test etmek isteyebilirsiniz. Bu bölümdeki kod listeleri önceliklemetnin işlenmesiyle ilgili olduğundan, örneklerin test edilmesi işlemi, değerleri Sahne Alanındaki bir metin alanıörneğine yazarak veya Çıktı paneline değerleri yazdırmak için trace() işlevini kullanarak, örneklerde kullanılandeğişkenlerin değerlerinin görüntülenmesini içerir. Bu teknikler, “Bölüm içi örnek kod listelerini test etme” sayfa 34bölümünde ayrıntılı şekilde açıklanmıştır.Dizeler oluşturmaActionScript 3.0da dize (metin) verilerini temsil etmek için String sınıfı kullanılır. ActionScript dizeleri hem ASCIIhem de Unicode karakterlerini destekler. Dize oluşturmanın en basit yolu, bir dize değişmezinin kullanılmasıdır. Birdize değişmezi bildirmek için tırnak işareti (") veya kesme işareti () karakterlerini kullanın. Örneğin, şu iki dizeeşdeğerdir:var str1:String = "hello";var str2:String = hello;Ayrıca aşağıdaki gibi, new operatörünü kullanarak da bir dize bildirebilirsiniz:var str1:String = new String("hello");var str2:String = new String(str1);var str3:String = new String(); // str3 == ""Aşağıdaki iki dize eşdeğerdir:var str1:String = "hello";var str2:String = new String("hello");Kesme işareti () sınırlayıcıları ile tanımlanmış bir dize değişmesi içinde kesme işareti () kullanmak için, ters eğikçizgi karakterini () kullanın. Aynı şekilde, tırnak işareti (") sınırlayıcıları ile tanımlanmış bir dize değişmesi içindetırnak işareti (") kullanmak için de ters eğik çizgi karakterini () kullanın. Aşağıdaki iki dize eşdeğerdir:var str1:String = "Thats "A-OK"";var str2:String = Thats "A-OK";Aşağıdaki gibi, bir dize değişmezinde bulunan kesme işaretini veya tırnak işaretini esas alarak kesme işareti ya datırnak işareti kullanmayı seçebilirsiniz:var str1:String = "ActionScript <span class=heavy>3.0</span>";var str2:String = <item id="155">banana</item>;
    • 140ACTIONSCRIPT 3.0I PROGRAMLAMADizelerle çalışmaActionScriptin düz kesme işareti () ile sola veya sağa eğik kesme işaretini ( ya da ) ayırt ettiğini unutmayın. Tırnakişaretinde de aynı durum geçerlidir. Dize değişmezlerini tanımlamak için düz tırnak işaretlerini kullanın. Başka birkaynaktan ActionScripte metin yapıştırırken, doğru karakterleri kullandığınızdan emin olun.Aşağıdaki tabloda gösterildiği gibi, dize değişmezlerinde diğer karakterleri tanımlamak için ters eğik çizgi karakterini() kullanabilirsiniz:length özelliğiHer dize, dizede bulunan karakter sayısına eşit olan bir length özelliğine sahiptir:var str:String = "Adobe";trace(str.length); // output: 5Aşağıdaki örnekte gösterildiği gibi, boş dize de null değerine sahip dize de 0 uzunluğuna sahiptir:var str1:String = new String();trace(str1.length); // output: 0str2:String = ;trace(str2.length); // output: 0Dizelerdeki karakterlerle çalışmaDizedeki her karakter, dizede bir dizin konumuna sahiptir (tam sayı). Birinci karakterin dizin konumu 0dır. Örneğin,aşağıdaki dizede, y karakteri 0 konumunda ve w karakteri de 5 konumundadır:"yellow"Bu örnekte olduğu gibi, charAt() yöntemini ve charCodeAt() yöntemini kullanarak çeşitli konumlardakikarakterleri teker teker inceleyebilirsiniz:Kaçış sırası Karakterb Backspacef Sonraki sayfaya geçmen Yeni satırr Satır başıt Sekmeunnnn nnnn onaltılık sayısıyla karakter kodu belirtilmiş Unicode karakteri; örneğin, u263a gülen yüzkarakteridir.xnn nn onaltılık sayısıyla karakter kodu belirtilmiş ASCII karakteri Kesme işareti" Tırnak işareti Tek ters eğik çizgi karakteri
    • 141ACTIONSCRIPT 3.0I PROGRAMLAMADizelerle çalışmavar str:String = "hello world!";for (var i:int = 0; i < str.length; i++){trace(str.charAt(i), "-", str.charCodeAt(i));}Bu kodu çalıştırdığınızda şu çıktı üretilir:h - 104e - 101l - 108l - 108o - 111- 32w - 119o - 111r - 114l - 108d - 100! - 33Ayrıca aşağıdaki örnekte gösterildiği gibi, fromCharCode() yöntemini kullanarak bir dizeyi tanımlamak için dekarakter kodlarını kullanabilirsiniz:var myStr:String = String.fromCharCode(104,101,108,108,111,32,119,111,114,108,100,33);// Sets myStr to "hello world!"Dizeleri karşılaştırmaDizeleri karşılaştırmak için şu operatörleri kullanabilirsiniz: <, <=, !=, ==, => ve >. Bu operatörler, aşağıdaki örnektegösterildiği şekilde, if ve while gibi koşul deyimleriyle kullanılabilir:var str1:String = "Apple";var str2:String = "apple";if (str1 < str2){trace("A < a, B < b, C < c, ...");}Bu operatörler dizelerle kullanıldığında, ActionScript uygulaması aşağıda olduğu gibi, dizedeki her karakterin karakterkodu değerini dikkate alarak karakterleri soldan sağa karşılaştırır:trace("A" < "B"); // truetrace("A" < "a"); // truetrace("Ab" < "az"); // truetrace("abc" < "abza"); // trueAşağıdaki örnekte gösterildiği gibi, dizeleri birbiriyle ve diğer nesne türleriyle karşılaştırmak için == ve !=operatörlerini kullanın:var str1:String = "1";var str1b:String = "1";var str2:String = "2";trace(str1 == str1b); // truetrace(str1 == str2); // falsevar total:uint = 1;trace(str1 == total); // true
    • 142ACTIONSCRIPT 3.0I PROGRAMLAMADizelerle çalışmaDiğer nesnelerin dize halinde temsilini almaHerhangi türdeki bir nesnenin String temsilini alabilirsiniz. Tüm nesneler bu amaçla bir toString() yönteminesahiptir:var n:Number = 99.47;var str:String = n.toString();// str == "99.47"String nesneleri ile dize olmayan nesnelerin birleşimiyle + bitiştirme operatörünü kullandığınızda, toString()yöntemini kullanmanız gerekir. Bitiştirmeyle ilgili ayrıntılar için bir sonraki bölüme bakın.String() genel işlevi, belirli nesne için toString() yöntemini çağıran nesne tarafından döndürülen değerle aynıdeğeri döndürür.Dizeleri bitiştirmeDizelerin bitiştirilmesi, iki dizenin alınıp sırayla birbirine eklenmesi anlamına gelir. Örneğin, iki dizeyi bitiştirmek için+ operatörünü kullanabilirsiniz:var str1:String = "green";var str2:String = "ish";var str3:String = str1 + str2; // str3 == "greenish"Aşağıdaki örnekte gösterildiği gibi, aynı sonucu üretmek için += operatörünü de kullanabilirsiniz:var str:String = "green";str += "ish"; // str == "greenish"Ayrıca, String sınıfı şu şekilde kullanılabilen bir concat() yöntemini içerir:var str1:String = "Bonjour";var str2:String = "from";var str3:String = "Paris";var str4:String = str1.concat(" ", str2, " ", str3);// str4 == "Bonjour from Paris"+ operatörünü (veya += operatörünü) bir String nesnesiyle ve dize olmayan bir nesneyle kullanırsanız, bu örnektegösterildiği gibi, ActionScript ifadeyi değerlendirmek için dize olmayan nesneyi bir String nesnesine dönüştürür:var str:String = "Area = ";var area:Number = Math.PI * Math.pow(3, 2);str = str + area; // str == "Area = 28.274333882308138"Ancak aşağıdaki örnekte gösterildiği gibi, + operatörü için bağlam sağlamak üzere gruplandırma için parantezlerikullanabilirsiniz:trace("Total: $" + 4.55 + 1.45); // output: Total: $4.551.45trace("Total: $" + (4.55 + 1.45)); // output: Total: $6Dizelerdeki alt dizeleri ve desenleri bulmaAlt dizeler, bir dize içindeki sıralı karakterlerdir. Örneğin, "abc" dizesi şu alt dizelere sahiptir: "", "a", "ab", "abc","b", "bc", "c". Bir dizenin alt dizelerini bulmak için ActionScript yöntemlerini kullanabilirsiniz.
    • 143ACTIONSCRIPT 3.0I PROGRAMLAMADizelerle çalışmaDesenler, ActionScriptte dizelerle veya normal ifadelerle tanımlanır. Örneğin, şu normal ifade belirli bir desenitanımlar—ardından bir rakam karakterinin geldiği A, B ve C harfleri (normal ifade sınırlayıcıları, eğik çizgilerdir):/ABCd/ActionScript, dizelerdeki desenlerin bulunmasına ve bulunan eşleşmelerin yerini alan alt dizelerlerle değiştirilmesineyönelik yöntemler içerir. Bunlar ilerleyen bölümlerde açıklanmaktadır.Normal ifadeler karmaşık desenleri tanımlayabilir. Daha fazla bilgi için, bkz. “Normal ifadeler kullanma” sayfa 202.Karakter konumuna göre bir alt dizeyi bulmasubstr() ve substring() yöntemleri birbirine benzer. Her ikisi de bir dizenin alt dizesini döndürür. Her ikisi de ikiparametre alır. Her iki yöntemde de birinci parametre, belirli bir dizedeki başlangıç karakterinin konumudur. Ancak,substr() yönteminde ikinci parametre, döndürülecek alt dizenin uzunluğuyken, substring() yönteminde ikinciparametre, alt dizenin sonundaki karakterin (döndürülen dizeye dahil edilmeyen) konumudur. Bu örnek, bu ikiyöntem arasındaki farkı gösterir:var str:String = "Hello from Paris, Texas!!!";trace(str.substr(11,15)); // output: Paris, Texas!!!trace(str.substring(11,15)); // output: Parislice() yöntemi, substring() yöntemine benzer şekilde çalışır. Parametre olarak iki tane negatif olmayan tam sayıverildiğinde tamamen aynı çalışır. Ancak, slice() yöntemi negatif tam sayıları parametre olarak alabilir ve budurumda aşağıdaki örnekte gösterildiği gibi, karakter konumu dizenin sonundan alınır:var str:String = "Hello from Paris, Texas!!!";trace(str.slice(11,15)); // output: Paritrace(str.slice(-3,-1)); // output: !!trace(str.slice(-3,26)); // output: !!!trace(str.slice(-3,str.length)); // output: !!!trace(str.slice(-8,-3)); // output: Texasslice() yönteminin parametreleri olarak negatif olmayan tam sayılarla negatif tam sayıları birleştirebilirsiniz.Eşleşen bir alt dizenin karakter konumunu bulmaAşağıdaki örnekte gösterildiği gibi, bir dizedeki eşleşen alt dizeleri bulmak için indexOf() ve lastIndexOf()yöntemlerini kullanabilirsiniz:var str:String = "The moon, the stars, the sea, the land";trace(str.indexOf("the")); // output: 10indexOf() yönteminin büyük/küçük harf duyarlı olduğuna dikkat edin.Aşağıdaki gibi, aramanın başlatılacağı dizedeki dizin konumunu belirtmek için ikinci bir parametre belirtebilirsiniz:var str:String = "The moon, the stars, the sea, the land"trace(str.indexOf("the", 11)); // output: 21lastIndexOf() yöntemi, dizedeki alt dizenin en son geçtiği yeri bulur:var str:String = "The moon, the stars, the sea, the land"trace(str.lastIndexOf("the")); // output: 30lastIndexOf() yöntemine ikinci bir parametre dahil ederseniz, arama geriye doğru çalışacak şekilde (sağdan sola)dizedeki dizin konumundan yürütülür:var str:String = "The moon, the stars, the sea, the land"trace(str.lastIndexOf("the", 29)); // output: 21
    • 144ACTIONSCRIPT 3.0I PROGRAMLAMADizelerle çalışmaAlt dizelerin sınırlayıcıyla bölünmüş bir dizisini oluşturmaAlt dizelerin sınırlayıcı esas alınarak bölünmüş bir dizisini oluşturmak için split() yöntemini kullanabilirsiniz.Örneğin, virgül sınırlı veya sekme sınırlı dizeyi birden çok dizeye bölebilirsiniz.Aşağıdaki örnekte, sınırlayıcı olarak ve (&) karakterinin kullanılmasıyla bir dizinin nasıl alt dizelere bölündüğügösterilmektedir:var queryStr:String = "first=joe&last=cheng&title=manager&StartDate=3/6/65";var params:Array = queryStr.split("&", 2); // params == ["first=joe","last=cheng"]split() yönteminin isteğe bağlı olan ikinci parametresi, döndürülen dizinin maksimum boyutunu tanımlar.Normal bir ifadeyi de sınırlayıcı olarak kullanabilirsiniz:var str:String = "Give met5."var a:Array = str.split(/s+/); // a == ["Give","me","5."]Daha fazla bilgi için, bkz. “Normal ifadeler kullanma” sayfa 202 ve ActionScript 3.0 Dil ve Bileşenler BaşvurusuDizelerdeki desenleri bulma ve alt dizeleri değiştirmeString sınıfı, dizelerdeki desenlerle çalışılmasına yönelik şu yöntemleri içerir:• Bir desenle eşleşen alt dizeleri bulmak için match() ve search() yöntemlerini kullanın.• Bir desenle eşleşen alt dizeleri bulup bunları belirtilen bir alt dizeyle değiştirmek için replace() yönteminikullanın.Bunlar ilerleyen bölümlerde açıklanmaktadır.Bu yöntemlerde kullanılan desenleri tanımlamak için dizeleri veya normal ifadeleri kullanabilirsiniz. Normal ifadelerhakkında daha fazla bilgi için, bkz. “Normal ifadeler kullanma” sayfa 202.Eşleşen alt dizeleri bulmasearch() yöntemi, bu örnekte gösterildiği gibi, belirli bir desenle eşleşen birinci alt dizenin dizin konumunudöndürür:var str:String = "The more the merrier.";// (This search is case-sensitive.)trace(str.search("the")); // output: 9Bu örnekte gösterildiği gibi, eşleşen deseni tanımlamak için normal ifadeleri kullanabilirsiniz:var pattern:RegExp = /the/i;var str:String = "The more the merrier.";trace(str.search(pattern)); // 0Dizedeki birinci karakter 0 dizin konumunda olduğundan, trace() yönteminin çıktısı 0dır. i bayrağı normal ifadedeayarlanır, bu nedenle arama büyük/küçük harf duyarlı değildir.Normal ifadede g (genel) bayrağı ayarlanmış olsa da, search() yöntemi yalnızca bir eşleşme bulur ve bunun başlangıçdizin konumunu döndürür.Aşağıdaki örnek, tırnak işareti içindeki bir dizeyle eşleşen, daha karmaşık bir normal ifadeyi gösterir:
    • 145ACTIONSCRIPT 3.0I PROGRAMLAMADizelerle çalışmavar pattern:RegExp = /"[^"]*"/;var str:String = "The "more" the merrier.";trace(str.search(pattern)); // output: 4str = "The "more the merrier.";trace(str.search(pattern)); // output: -1// (Indicates no match, since there is no closing double quotation mark.)match() yöntemi benzer şekilde çalışır. Eşleşen bir alt dizeyi arar. Ancak, aşağıdaki örnekte olduğu gibi, normal ifadedeseninde genel bayrağını kullandığınızda, match() yöntemi, eşleşen alt dizelerin bir dizisini döndürür:var str:String = "bob@example.com, omar@example.org";var pattern:RegExp = /w*@w*.[org|com]+/g;var results:Array = str.match(pattern);results dizisi şu şekilde ayarlanır:["bob@example.com","omar@example.org"]Normal ifadeler hakkında daha fazla bilgi için, bkz. “Normal ifadeler kullanma” sayfa 202“Normal ifadeler kullanma”sayfa 202.Eşleşen alt dizeleri değiştirmeBir dizedeki belirtilen bir deseni aramak ve eşleşmeleri, belirtilen yerini alan dizeyle değiştirmek için, aşağıdaki örnektegösterildiği gibi, replace() yöntemini kullanabilirsiniz:var str:String = "She sells seashells by the seashore.";var pattern:RegExp = /sh/gi;trace(str.replace(pattern, "sch"));//sche sells seaschells by the seaschore.Normal ifadede i (ignoreCase) bayrağı ayarlanmış olduğundan, eşleşen dizelerin büyük/küçük harf duyarlıolmadığını ve g (global) bayrağı ayarlanmış olduğundan, birden çok eşleşmenin değiştirildiğini unutmayın. Dahafazla bilgi için, bkz. “Normal ifadeler kullanma” sayfa 202.Yerini alan dizeye şu $ yerini alma kodlarınıdahil edebilirsiniz. Aşağıdaki tabloda gösterilen yerini alan metin, $ yerinialma kodunun yerine eklenir:Örneğin, aşağıda, eşleşen birinci ve ikinci yakalama grubunu temsil eden$2 ve $1 yerini alma kodlarının kullanımınıgöstermektedir:var str:String = "flip-flop";var pattern:RegExp = /(w+)-(w+)/g;trace(str.replace(pattern, "$2-$1")); // flop-flip$ Kodu Yerini Alan Metin$$ $$& Eşlenen alt dize.$` Eşleşen alt dizeden önce gelen dize bölümü. Bu kod, düz kesme işaretini () veya sola eğik kesme işaretini ( ) değil,düz sola eğik kesme işareti karakterini (`) kullanır.$ Eşleşen alt dizeden sonra gelen dize bölümü. Bu kod, düz kesme işaretini ( ) kullanır.$n n. yakalanan parantez grubu eşleşmesi, burada n 1-9 arasında tek basamaklı bir sayıdır ve $n öğesinden sonraondalık bir sayı gelmez.$nn nn. yakalanan parantez grubu eşleşmesi, burada nn 01–99 arasında iki basamaklı ondalık bir sayıdır. nn. yakalamatanımsızsa, yerini alan metin boş bir dizedir.
    • 146ACTIONSCRIPT 3.0I PROGRAMLAMADizelerle çalışmaBir işlevi replace() yönteminin ikinci parametresi olarak da kullanabilirsiniz. Eşleşen metin, işlevin döndürülendeğeriyle değiştirilir.var str:String = "Now only $9.95!";var price:RegExp = /$([d,]+.d+)+/i;trace(str.replace(price, usdToEuro));function usdToEuro(matchedSubstring:String, capturedMatch1:String, index:int,str:String):String{var usd:String = capturedMatch1;usd = usd.replace(",", "");var exchangeRate:Number = 0.853690;var euro:Number = parseFloat(usd) * exchangeRate;const euroSymbol:String = String.fromCharCode(8364);return euro.toFixed(2) + " " + euroSymbol;}Bir işlevi, replace() yönteminin ikinci parametresi olarak kullandığınızda, şu argümanlar işleve iletilir:• Dizenin eşleşen bölümü.• Herhangi bir yakalama parantez grubu eşleşmesi. Bu şekilde iletilen argüman sayısı, parantez eşleşmelerininsayısına bağlı olarak değişiklik gösterir. İşlev kodu içinde arguments.length - 3 öğesini kontrol ederek, parantezeşleşmelerinin sayısını belirleyebilirsiniz.• Eşleşmenin başladığı dize içindeki dizin konumu.• Tam dize.Dizeleri büyük harfe veya küçük harfe dönüştürmeAşağıdaki örneklerde de gösterildiği gibi, toLowerCase() yöntemi ve toUpperCase() yöntemi, sırayla bir dizedekialfabetik karakterleri küçük harfe ve büyük harfe dönüştürür:var str:String = "Dr. Bob Roberts, #9."trace(str.toLowerCase()); // dr. bob roberts, #9.trace(str.toUpperCase()); // DR. BOB ROBERTS, #9.Bu yöntemler çalıştırıldıktan sonra, kaynak dize değişmeden kalır. Kaynak dizeyi dönüştürmek için, şu kodu kullanın:str = str.toUpperCase();Bu yöntemler yalnızca a–z ve A–Z karakterleriyle değil, genişletilmiş karakterlerle çalışır:var str:String = "José Barça";trace(str.toUpperCase(), str.toLowerCase()); // JOSÉ BARÇA josé barçaÖrnek: ASCII artBu ASCII Art örneği, ActionScript 3.0da String sınıfıyla çalışılmasının aşağıda örnekleri verilen birçok özelliğinigösterir:• String sınıfının split() yöntemi, karakter sınırlı bir dizeden (sekme sınırlı bir metin dosyasındaki görüntübilgileri) değerleri ayıklamak için kullanılır.
    • 147ACTIONSCRIPT 3.0I PROGRAMLAMADizelerle çalışma• split(), bitiştirme ve substring() ile substr() yöntemlerini kullanarak dizenin bir bölümünü ayıklama gibibirçok dize işleme tekniği, görüntü başlıklarındaki her sözcüğün ilk harfini büyük harfli yapmak için kullanılır.• getCharAt() yöntemi, bir dizeden tek bir karakter almak için kullanılır (gri tonlamalı bitmap verisine karşılıkgelen ASCII karakterini belirlemek için).• Dize bitiştirme, bir görüntünün bir defada tek bir karakterle ASCII art temsilini oluşturmak için kullanılır.ASCII art terimi, bir görüntünün metin temsilini ifade eder, burada, Courier New karakterleri gibi tek boşluklu fontkarakterlerinin bir ızgarası resmi çizer. Aşağıdaki görüntü, uygulama tarafından oluşturulmuş bir ASCII art örneğinigösterir:Grafiğin ASCII art sürümü sağda gösterilir.Bu örneğin uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr.ASCIIArt uygulama dosyalarını Samples/AsciiArt klasöründe bulabilirsiniz. Uygulama aşağıdaki dosyaları içerir:Dosya AçıklamaAsciiArtApp.mxmlveyaAsciiArtApp.flaFlash (FLA) veya Flex (MXML) içindeki ana uygulama dosyasıcom/example/programmingas3/asciiArt/AsciiArtBuilder.as Metin dosyasından görüntü meta verisini ayıklama,görüntüleri yükleme ve görüntü-metin dönüştürme işleminiyönetme gibi, uygulamanın ana işlevlerini sağlayan sınıf.com/example/programmingas3/asciiArt/BitmapToAsciiConverter.as Görüntü verisinin bir String sürümüne dönüştürülmesi içinparseBitmapData() yöntemini sağlayan bir sınıf.com/example/programmingas3/asciiArt/Image.as Yüklenen bir bitmap görüntüsünü temsil eden sınıf.com/example/programmingas3/asciiArt/ImageInfo.as ASCII art görüntüsünün meta verilerini (örn. başlık, görüntüdosyası URLsi, vb.) temsil eden sınıf.image/ Uygulama tarafından kullanılan görüntüleri içeren klasör.txt/ImageData.txt Uygulama tarafından yüklenecek görüntülerle ilgili bilgileriiçeren, sekme sınırlı metin dosyası.
    • 148ACTIONSCRIPT 3.0I PROGRAMLAMADizelerle çalışmaSekme sınırlı değerleri ayıklamaBu örnek, yaygın bir uygulama olan, uygulama verilerinin uygulamadan ayrı saklanmasını kullanır; bu şekilde, verideğişirse (örneğin, başka bir görüntü eklenirse veya bir görüntünün başlığı değişirse), SWF dosyasının yenidenoluşturulması gerekmez. Bu durumda, görüntü başlığı, gerçek görüntü dosyasının URLsi ve görüntüyü işlemek içinkullanılan bazı değerler gibi görüntü meta verileri, bir metin dosyasında (projedeki txt/ImageData.txt dosyasında)saklanır. Metin dosyasının içerikleri şunlardır:FILENAMETITLEWHITE_THRESHHOLDBLACK_THRESHHOLDFruitBasket.jpgPear, apple, orange, and bananad810Banana.jpgA picture of a bananaC820Orange.jpgorangeFF20Apple.jpgpicture of an apple6E10Dosya belirli bir sekme sınırlı formatı kullanır. Birinci satır, başlık satırıdır. Kalan satırlar, yüklenecek her bitmap içinşu verileri içerir:• Bitmapin dosya adı.• Bitmapin görüntü adı.• Bitmapler için beyaz eşiği ve siyah eşiği değerleri. Bunlar bir pikselin tamamen beyaz veya tamamen siyah olarakdeğerlendirilmesi için ölçüt olan onaltılık değerlerdir.Uygulama başlatıldığı anda AsciiArtBuilder sınıfı, AsciiArtBuilder sınıfının parseImageInfo() yönteminden şukodu kullanarak, görüntülenecek görüntülerin "yığınını" oluşturmak için metin dosyasının içeriklerini yükler veayrıştırır:var lines:Array = _imageInfoLoader.data.split("n");var numLines:uint = lines.length;for (var i:uint = 1; i < numLines; i++){var imageInfoRaw:String = lines[i];...if (imageInfoRaw.length > 0){// Create a new image info record and add it to the array of image info.var imageInfo:ImageInfo = new ImageInfo();// Split the current line into values (separated by tab (t)// characters) and extract the individual properties:var imageProperties:Array = imageInfoRaw.split("t");imageInfo.fileName = imageProperties[0];imageInfo.title = normalizeTitle(imageProperties[1]);imageInfo.whiteThreshold = parseInt(imageProperties[2], 16);imageInfo.blackThreshold = parseInt(imageProperties[3], 16);result.push(imageInfo);}}Metin dosyasının tüm içerikleri, tek bir String örneği olan _imageInfoLoader.data özelliğinde barındırılır.Parametre olarak yeni satır karakteriyle ("n") split() yöntemi kullanılarak, String örneği, öğelerinin her biri metindosyası satırı olan bir Array (lines) öğesine bölünür. Daha sonra kod, satırların her biriyle çalışmak için bir döngükullanır (gerçek içerik yerine yalnızca başlık içerdiğinden, birinci satır hariç). Döngünün içinde, tek bir satırıniçeriklerini, değerler kümesine (imageProperties adındaki Array nesnesi) bölmek için bir kez daha split()yöntemi kullanılır. Bu durumda, her satırdaki karakterler sekme karakterleriyle ayrıldığından, split() yöntemiylekullanılan parametre, sekme ("t") karakteridir.
    • 149ACTIONSCRIPT 3.0I PROGRAMLAMADizelerle çalışmaGörüntü başlıklarını normalleştirmek için String yöntemlerini kullanmaBu uygulamanın tasarım kararlarından biri, görüntü başlıklarının, sözcüklerin her birinin baş harfi büyük olacakşekilde (yaygın olarak baş harfi küçük harfle yazılan birkaç sözcük dışında) standart format kullanılarakgörüntülenmesidir. Uygulama, metin dosyasının uygun şekilde formatlanmış başlıklar içerdiğini varsaymak yerine,metin dosyasından ayıklanırken başlıkları formatlar.Önceki kod listesinde, tek bir görüntünün meta veri değerlerinin ayıklanmasının bir parçası olarak şu kod satırıkullanılır:imageInfo.title = normalizeTitle(imageProperties[1]);Bu kodda, görüntünün başlığı ImageInfo nesnesinde saklanmadan önce normalizeTitle() yöntemiyle metindosyasından iletilir:private function normalizeTitle(title:String):String{var words:Array = title.split(" ");var len:uint = words.length;for (var i:uint; i < len; i++){words[i] = capitalizeFirstLetter(words[i]);}return words.join(" ");}Bu yöntem, başlığı tek tek sözcüklere bölmek için (boşluk karakteriyle ayrılmış şekilde) split() yöntemini kullanır,capitalizeFirstLetter() yöntemi yoluyla sözcüklerin her birini iletir ve sonra sözcükleri tekrar tek bir dizehalinde birleştirmek için Array sınıfının join() yöntemini kullanır.capitalizeFirstLetter() yöntemi, her sözcüğün birinci harfini büyük harf yapma çalışmasını gerçekleştirir.
    • 150ACTIONSCRIPT 3.0I PROGRAMLAMADizelerle çalışma/*** Capitalizes the first letter of a single word, unless its one of* a set of words that are normally not capitalized in English.*/private function capitalizeFirstLetter(word:String):String{switch (word){case "and":case "the":case "in":case "an":case "or":case "at":case "of":case "a":// Dont do anything to these words.break;default:// For any other word, capitalize the first character.var firstLetter:String = word.substr(0, 1);firstLetter = firstLetter.toUpperCase();var otherLetters:String = word.substring(1);word = firstLetter + otherLetters;}return word;}Türkçede, başlıkta şu sözcüklerden biri bulunuyorsa, bu sözcüklerin baş harfi büyük harfli yapılmaz: “ve”, “için”,“ancak”, “fakat”, “veya”, “de” “da” veya “ki” (Bu, kuralların basitleştirilmiş bir sürümüdür.) Bu mantığı çalıştırmak içinkod ilk olarak bir switch deyimini kullanarak sözcüğün büyük harfli yapılmaması gereken sözcüklerden biri olupolmadığını kontrol eder. Büyük harfli yapılmaması gereken sözcüklerden biriyse, kod switch deyimini atlar. Diğeryandan, sözcüğün büyük harfli yapılması gerekiyorsa, bu da birkaç adım uygulanarak şu şekilde yapılır:1 substr(0, 1) yöntemi kullanılarak sözcüğün birinci harfi ayıklanır, böylece 0 dizinindeki karakterle (0 birinciparametresi tarafından belirtildiği gibi, dizedeki birinci harf) başlayan bir alt dize ayıklanır. Alt dize bir karakteruzunluğundadır (1 ikinci parametresi tarafından belirtildiği gibi).2 toUpperCase() yöntemi kullanılarak bu karakter büyük harfli yapılır.3 Orijinal sözcüğün kalan karakterleri, substring(1) yöntemi kullanılarak ayıklanır, böylece dizin 1de başlayan biralt dize (ikinci harf), dizenin sonuna doğru ayıklanır (substring() yönteminin ikinci parametresininbırakılmasıyla belirtildiği gibi).4 Dize bitiştirmesi kullanılarak, yeni büyük harfli yapılan birinci harf, kalan harflerle birleştirilerek son sözcükoluşturulur: firstLetter + otherLetters.ASCII art metni oluşturmaBitmapToAsciiConverter sınıfı, bitmap görüntüsünün ASCII metin temsiline dönüştürülmesi işlevselliğini sağlar. Buişlem, kısmen burada gösterilen parseBitmapData() yöntemi tarafından gerçekleştirilir:
    • 151ACTIONSCRIPT 3.0I PROGRAMLAMADizelerle çalışmavar result:String = "";// Loop through the rows of pixels top to bottom:for (var y:uint = 0; y < _data.height; y += verticalResolution){// Within each row, loop through pixels left to right:for (var x:uint = 0; x < _data.width; x += horizontalResolution){...// Convert the gray value in the 0-255 range to a value// in the 0-64 range (since thats the number of "shades of// gray" in the set of available characters):index = Math.floor(grayVal / 4);result += palette.charAt(index);}result += "n";}return result;Bu kod ilk olarak, bitmap görüntüsünün ASCII art sürümünü oluşturmak için kullanılacak result adındaki bir Stringörneğini tanımlar. Daha sonra, kaynak bitmap görüntüsünün tek tek pikselleri üzerinde döngü gerçekleştirir. Birçokrenk işleme tekniğini kullanarak (kısa tutmak amacıyla burada yer verilmemiştir), tek bir pikselin kırmızı, yeşil ve mavirenk değerlerini tek bir gri tonlamalı değere (0 ile 255 arasında bir değer) dönüştürür. Daha sonra kod bu değeri 0-63ölçeğinde bir değere dönüştürmek için 4e böler (gösterildiği gibi) ve sonrada bu değer index dizininde saklanır. (Buuygulama tarafından kullanılan mevcut ASCII karakterlerinin "paleti" 64 değer içerdiğinden, 0-63 ölçeği kullanılır.)Karakterlerin paleti, BitmapToAsciiConverter sınıfında bir String örneği olarak tanımlanır:// The characters are in order from darkest to lightest, so that their// position (index) in the string corresponds to a relative color value// (0 = black).private static const palette:String ="@#$%&8BMW*mwqpdbkhaoQ0OZXYUJCLtfjzxnuvcr[]{}1()|/?Il!i><+_~-;,. ";index değişkeni, paletteki hangi ASCII karakterinin bitmap görüntüsündeki geçerli piksele karşılık geldiğinitanımladığından, charAt() yöntemi kullanılarak palette String öğesinden o karakter alınır. Daha sonra bitiştirmeataması (+=) operatörü kullanılarak bu karakter result String örneğine eklenir. Ayrıca, her piksel satırının sonunda,result String öğesinin sonuna yeni satır karakteri eklenerek, satır yeni bir "piksel" karakteri satırı oluşturmayazorlanır.
    • 152Bölüm 8: Dizilerle çalışmaDiziler tek bir veri yapısında birden fazla değer saklamanıza olanak sağlar. Değerleri sabit sıralı tam sayı dizinlerikullanarak saklayan basit dizinlenmiş dizileri veya değerleri rastgele anahtarlar kullanarak saklayan karmaşık ilişkilidizileri kullanabilirsiniz. Diziler ayrıca başka diziler içerebilir ve çok boyutlu olabilirler. Son olarak, öğeleri aynı veritürünün örneği olan bir dizi için bir Vector öğesi kullanabilirsiniz. Bu bölümde çeşitli dizi türlerini oluşturma vedeğiştirme yöntemleri anlatılmaktadır.Dizilerin temelleriDizilerle çalışmaya girişGenellikle programlamada, tek bir nesne yerine bir öğeler kümesiyle çalışmanız gerekir. Örneğin, bir müzik çalaruygulamasında, oynatılmayı bekleyen bir şarkı listesinin olmasını isteyebilirsiniz. Bu listedeki her şarkı için ayrı birdeğişken oluşturmak zorunda kalmak istemezsiniz. Tüm Song nesnelerinin bir paket içinde bir arada olması vebunlarla bir grup olarak çalışılabilmesi tercih edilir.Dizi, şarkı listesi gibi bir öğeler kümesi konteyneri olarak hareket eden bir programlama öğesidir. Genellikle dizidekiöğelerin tümü aynı sınıfın örnekleridir ancak bu ActionScriptte bir zorunluluk değildir. Dizideki öğelerin her biri,dizinin öğeleri olarak bilinir. Diziyi, değişkenlere yönelik bir dosya çekmecesi olarak düşünebilirsiniz. Değişkenler,öğeler olarak diziye eklenebilir, bu tıpkı bir dosya çekmecesine klasör yerleştirilmesine benzer. Diziyle tek bir değişkenolarak çalışabilirsiniz (çekmecenin tamamını farklı bir konuma taşımak gibi). Değişkenlerle bir grup olarakçalışabilirsiniz (bir bilgi ararken klasörlerde teker teker gezinmek gibi). Bunlara ayrı ayrı da erişebilirsiniz (çekmeceyiaçıp tek bir klasörü seçmek gibi).Örneğin, kullanıcının birden çok şarkıyı seçip oynatma listesine ekleyebildiği bir müzik çalar uygulamasıoluşturduğunuzu varsayın. ActionScript kodunuzda, tek bir diziyi parametre olarak kabul eden,addSongsToPlaylist() adında bir yönteminiz vardır. Listeye kaç şarkı eklemek isterseniz isteyin (az, çok veyayalnızca bir adet), addSongsToPlaylist() yöntemini yalnızca bir defa çağırarak, Song nesnelerini içeren diziyeiletirsiniz. addSongsToPlaylist() yönteminin içinde, dizi öğeleri (şarkılar) arasında birer birer ilerleyip bu öğelerigerçekten oynatma listesine eklemek için bir döngü kullanabilirsiniz.En yaygın ActionScript dizisi türü, dizinlenmiş dizidir. Dizinlenmiş dizide her öğe numaralandırılmış bir yuvada (dizinolarak bilinir) saklanır. Bu öğelere, adres gibi numara kullanılarak erişilir. Dizinlenmiş diziler çoğu programlamaihtiyacı için işe yarar. Array sınıfı, dizinlenmiş diziyi temsil etmek için kullanılan yaygın bir sınıftır.Dizinlenmiş dizi genellikle aynı türde birden çok öğeyi (aynı sınıfın örnekleri olan nesneler) saklamak için dekullanılır. Array sınıfı, içerdiği öğelerin türünü kısıtlamaya yönelik bir araç içermez. Vector sınıfı, tek bir dizideki tümöğelerin aynı türde olduğu bir dizinlenmiş dizi türüdür. Array örneği yerine Vector örneğinin kullanılması,performans artışı ve başka avantajlar da sağlar. Vector sınıfı, Flash Player 10dan itibaren tüm sürümlerde mevcuttur.Dizinlenmiş dizinin özel bir kullanımı, çok boyutlu dizidir. Çok boyutlu dizi, öğeleri de dizinlenmiş dizi olan (böylecebaşka öğeler içeren) bir dizinlenmiş dizidir.Başka bir dizi türü de, tek tek öğeleri tanımlamak için sayısal bir dizin yerine bir anahtar dizesi kullananilişkilendirilebilir dizidir. Son olarak, ActionScript 3.0 aynı zamanda bir sözlüğü temsil eden Dictionary sınıfını daiçerir. Sözlük, öğeleri ayırt etmek için herhangi türde bir nesneyi anahtar olarak kullanmanıza olanak sağlayan birdizidir.
    • 153ACTIONSCRIPT 3.0I PROGRAMLAMADizilerle çalışmaOrtak dizi görevleriBu bölümde, dizilerle çalışmaya yönelik şu ortak etkinlikler açıklanmaktadır:• Array sınıfını ve Vector sınıfını kullanarak dizinlenmiş diziler oluşturma• Dizi öğeleri ekleme ve kaldırma• Dizi öğelerini sıralama• Dizinin bölümlerini ayıklama• İlişkilendirilebilir dizilerle ve sözlüklerle çalışma• Çok boyutlu dizilerle çalışma• Dizi öğelerini kopyalama• Dizi alt sınıfı oluşturmaÖnemli kavramlar ve terimlerAşağıdaki başvuru listesinde, bu bölümde karşınıza çıkacak önemli terimler bulunmaktadır:• Dizi: Birden çok nesneyi gruplamak için konteyner görevi gören bir nesne• Dizi erişimi ([]) operatörü: Benzersiz şekilde dizi öğesini tanımlayan bir dizi veya anahtarı çevreleyen köşeli ayraççifti. Bu sözdizimi, dizinin tamamını değil, dizinin tek bir öğesini belirtmek için bir dizi değişkeni adından sonrakullanılır.• İlişkilendirilebilir dizi: Tek tek öğeleri tanımlamak için dize anahtarlarını kullanan bir dizi• Taban türü: Vector örneğinde depolanmasına izin verilen nesnelerin veri türü• Sözlük: Öğeleri arasında anahtar ve değer olarak bilinen nesne çiftleri yer alan bir dizi. Tek bir öğeyi tanımlamakiçin sayısal dizin yerine anahtar kullanılır.• Öğe: Dizideki tek bir öğe• Dizin: Dizinlenmiş dizideki tek bir öğeyi tanımlamak için kullanılan sayısal "adres"• Dizinlenmiş dizi: Öğelerin her birini numaralandırılmış konumda saklayan standart bir dizi türüdür ve tek teköğeleri tanımlamak için numaraları (dizin) kullanır• Anahtar: İlişkilendirilebilir dizi veya sözlükteki tek bir öğeyi tanımlamak için kullanılan dize ya da nesne• Çok boyutlu dizi: Tek değerler yerine diziler niteliğindeki öğeleri içeren bir dizi• T:Taban türü ne olursa olsun, Vector örneğinin taban türünü temsil etmek için bu belgede kullanılan standartkural. T kuralı, Type parametresi açıklamasında gösterildiği gibi, bir sınıf adını temsil etmek için kullanılır. (“T”,“veri türü” içinde olduğu gibi “tür” sözcüğünü ifade eder)• Type parametresi: Vector öğesinin taban türünü (depoladığı nesnelerin veri türünü) belirtmek için, Vector sınıfıadıyla kullanılan sözdizimi. Bu sözdizimi bir nokta (.) ve ardından açılı ayraç (<>) içine alınmış veri türü adınıiçerir. Tamamı şöyle görünür: Vector.<T>. Bu belgede, type parametresinde belirtilen sınıf genel olarak T ilebelirtilir.• Vector: Öğelerinin tümü aynı veri türünde öğeler olan bir dizi türü
    • 154ACTIONSCRIPT 3.0I PROGRAMLAMADizilerle çalışmaBölüm içi örneklerle çalışmaBu bölümde çalışırken örnek kod listelerinin bazılarını test etmek isteyebilirsiniz. Temelde, bu bölümdeki tüm kodlisteleri uygun trace() işlev çağrısını içerir. Bu bölümdeki kod listelerini test etmek için:1 Flash geliştirme aracında boş bir belge oluşturun2 Zaman çizelgesinde bir anahtar kare seçin.3 Eylemler panelini açın ve kod listesini Komut Dosyası bölmesine kopyalayın.4 Kontrol Et > Filmi Test Et komutu ile programı çalıştırın.Çıktı panelinde, trace() işlevinin sonuçlarını göreceksiniz.Örnek kod listelerinin test edilmesine yönelik bu ve diğer teknikler, “Bölüm içi örnek kod listelerini test etme” sayfa 34bölümünde ayrıntılı şekilde açıklanmıştır.Dizinlenmiş dizilerDizinlenmiş diziler, verilerin her birine işaretsiz bir tam sayı değeri ile erişilebilecek şekilde bir veya birden fazla değerdizisi saklar. İlk dizin her zaman 0 numaradır ve dizin, diziye eklenen her alt öğe için 1 artar. ActionScript 3.0da ikisınıf dizinlenmiş dizi olarak kullanılır: Array sınıfı ve Vector sınıfı.Dizinlenmiş diziler, dizin sayısı için işaretsiz bir 32-bit tam sayı kullanır. Dizinlenmiş bir dizinin maksimum boyutu232 - 1 veya 4.294.967.295tir. Maksimum boyuttan daha büyük bir dizi oluşturma girişimi sonunda çalışma zamanıhatası oluşur.Dizinlenmiş dizinin tek bir öğesine erişmek için, dizi erişimi ([]) operatörünü kullanarak, erişmek istediğiniz öğenindizin konumunu belirtirsiniz. Örneğin, şu kod songTitles adındaki dizinlenmiş dizide bulunan birinci öğeyi (dizin0daki öğe) temsil eder:songTitles[0]Dizi değişkeni adı ile ardından gelen köşeli ayraç içindeki dizin birleşimi, tek bir tanımlayıcı olarak hareket eder.(Başka bir deyişle, bu bir değişken adı gibi kullanılabilir). Atama deyiminin sol tarafındaki adı ve dizini kullanarakdizinlenmiş dizi öğesine bir değer atayabilirsiniz:songTitles[1] = "Symphony No. 5 in D minor";Aynı şekilde, atama deyiminin sağ tarafındaki adı ve dizini kullanarak dizinlenmiş dizi öğesinin değerini alabilirsiniz:var nextSong:String = songTitles[2];Ayrıca açıkça bir değer sağlamak yerine, köşeli ayraç içinde bir değişken de kullanabilirsiniz. (Değişken, uint, pozitifint veya pozitif tam sayı olan bir Number örneği gibi negatif olmayan bir tam sayı içermelidir). Bu teknik genellikledizinlenmiş dizideki öğeler üzerinde "döngü gerçekleştirmek" ve öğelerin bazılarında veya tümünde bir işlemgerçekleştirmek için yaygın olarak kullanılır. Aşağıdaki kod listesi bu tekniği göstermektedir. Bu kod, oddNumbersadındaki bir Array nesnesinde bulunan değerlerin her birine erişmek için bir döngü kullanır. Değerlerin her birini“oddNumber[index] = value” biçiminde yazdırmak için trace() deyimini kullanır:var oddNumbers:Array = [1, 3, 5, 7, 9, 11];var len:uint = oddNumbers.length;for (var i:uint = 0; i < len; i++){trace("oddNumbers[" + i.toString() + "] = " + oddNumbers[i].toString());}
    • 155ACTIONSCRIPT 3.0I PROGRAMLAMADizilerle çalışmaArray sınıfıBirinci dizinlenmiş dizi türü, Array sınıfıdır. Bir Array örneği herhangi bir veri türünün değerini bulundurabilir. AynıArray nesnesi, farklı veri türlerindeki nesneleri bulundurabilir. Örneğin, tek bir Array örneği, dizin 0da bir Stringdeğerine, dizin 1de bir Number örneğine ve dizin 2de bir XML nesnesine sahip olabilir.Vector sınıfıActionScript 3.0da kullanılabilir olan başka bir dizinlenmiş dizi türü de Vector sınıfıdır. Vector örneği türlenmişdizidir, başka bir deyişle, Vector örneğindeki tüm öğeler her zaman aynı veri türüne sahiptir.Not: Vector sınıfı, Flash Player 10dan itibaren tüm sürümlerde mevcuttur.Bir Vector değişkeni bildirdiğinizde veya bir Vector nesnesini başlattığınızda, Vector öğesinin içerebildiği nesnelerinveri türünü açıkça belirtirsiniz. Belirtilen veri türü, Vector öğesinin taban türü olarak bilinir. Çalışma zamanında vederleme zamanında (katı modda), Vector öğesinin değerini ayarlayan veya Vector öğesinden bir değer alan herhangibir kod kontrol edilir. Eklenen veya alınan nesnenin veri türü, Vector öğesinin taban türüyle eşleşmezse bir hataoluşur.Veri türü kısıtlamasına ek olarak, Vector sınıfının Array sınıfından ayırt edilmesini sağlayan başka kısıtlamaları vardır:• Vector yoğun bir dizidir. Array nesnesi, 1-6 arasındaki konumlarda değer içermese de, 0 ve 7 dizinlerinde değerleriçerebilir. Ancak bir Vector öğesinin her dizinde bir değer (veya null değeri) içermesi gerekir.• Vector isteğe bağlı olarak sabit uzunlukta olabilir. Başka bir deyişle, Vector öğesinin içerdiği öğelerin sayısıdeğişemez.• Vector öğelerine erişim sınırlarla denetlenir. Son öğeden büyük bir dizinden (length - 1) asla bir değerokuyamazsınız. Asla geçerli son dizinin ötesinde birden çok dizin içeren bir değer ayarlayamazsınız. (Başka birdeyişle, varolan bir dizinde veya [length] dizininde yalnızca bir değer ayarlayabilirsiniz.)Kısıtlamaları nedeniyle Vector öğesinin, tüm öğeleri tek bir sınıfın örnekleri olan Array örneğine göre iki adet birincilavantajı vardır:• Performans: Array örneği yerine Vector örneği kullanıldığında, dizi öğesinin erişimi ve yinelemesi daha hızlıdır.• Tür güvenliği: katı modda derleyici veri türü hatalarını tanımlayabilir. Bu tür hata örnekleri arasında, Vectoröğesine yanlış veri türünde bir değer atanması veya Vector öğesinden değer okunurken yanlış veri türü beklenmesiyer alır. Çalışma zamanında, Vector nesnesine veri eklenirken veya Vector öğesinden veri okunurken de veri türlerikontrol edilir. Ancak bir Vector öğesine değer eklemek için push() yöntemini veya unshift() yönteminikullandığınızda, argümanların veri türlerinin derleme zamanında kontrol edilmediğini unutmayın. Bu yöntemlerkullanılırken, değerler çalışma zamanında kontrol edilir.Ek kısıtlama ve avantajların yanı sıra, Vector sınıfı Array sınıfına çok benzer. Bir Vector nesnesinin özellikleri veyöntemleri birçok durumda Array öğesinin özelliklerine ve yöntemlerine benzer. Tüm öğelerin aynı veri türüne sahipolduğu bir Array kullanmanız durumunda, Vector örneği tercih edilebilir.Dizi oluşturmaArray örneği veya Vector örneği oluşturmak için birçok teknik kullanabilirsiniz. Ancak, her dizi oluşturma tekniğibirbirinden farklılık gösterir.Array örneği oluşturmaArray() yapıcısını çağırarak veya Array değişmez sözdizimini kullanarak bir Array nesnesi oluşturursunuz.Array() yapıcısı işlevi, üç farklı şekilde kullanılabilir. İlk olarak, yapıcıyı argüman olmadan çağırırsanız, boş bir dizialırsınız. Dizide herhangi bir öğe olmadığını doğrulamak için Array sınıfının length özelliğini kullanabilirsiniz.Örneğin, şu kod Array() yapıcısını argüman olmadan çağırır:
    • 156ACTIONSCRIPT 3.0I PROGRAMLAMADizilerle çalışmavar names:Array = new Array();trace(names.length); // output: 0İkinci olarak, Array() yapıcısına tek parametre olarak bir sayıyı kullanırsanız, o sayı değerinin belirttiği uzunlukta birdizi oluşturulur ve öğelerin her birinin değeri undefined olarak ayarlanır. Argümanın, 0 ile 4.294.967.295 arasındaişaretsiz bir tam sayı olması gerekir. Örneğin, şu kod Array() yapıcısını tek bir sayısal argüman ile çağırır:var names:Array = new Array(3);trace(names.length); // output: 3trace(names[0]); // output: undefinedtrace(names[1]); // output: undefinedtrace(names[2]); // output: undefinedÜçüncü olarak, yapıcıyı çağırır ve parametre olarak bir öğe listesi iletirseniz, parametrelerin her birine karşılık gelenöğelerle bir dizi oluşturulur. Şu kod, Array() yapıcısına üç argüman iletir:var names:Array = new Array("John", "Jane", "David");trace(names.length); // output: 3trace(names[0]); // output: Johntrace(names[1]); // output: Janetrace(names[2]); // output: DavidArray değişmezleriyle de diziler oluşturabilirsiniz. Aşağıdaki örnekte gösterildiği gibi, bir Array değişmezi doğrudanbir dizi değişkenine atanabilir:var names:Array = ["John", "Jane", "David"];Vector örneği oluşturmaVector.<T>() yapıcısını çağırarak bir Vector örneği oluşturursunuz. Vector.<T>() global işlevini çağırarak da birVector oluşturabilirsiniz. Bu işlev, belirtilen bir nesneyi Vector örneğine dönüştürür. ActionScript, Array değişmezsözdizimine eşdeğer olan bir Vector öğesi içermez.Her Vector değişkeni (veya aynı şekilde bir Vector yöntemi parametresi ya da yöntem döndürme türü) bildirdiğinizde,Vector değişkeninin taban türünü belirtirsiniz. Vector.<T>() yapıcısını çağırarak bir Vector örneğioluşturduğunuzda, taban türünü de belirtirsiniz. Başka bir deyişle, ActionScriptte Vector terimini herkullandığınızda, bir taban türü bu terime eşlik eder.type parametresi sözdizimini kullanarak Vector öğesinin taban türünü belirtirsiniz. type parametresi, kodda Vectorsözcüğünden hemen sonra gelir. Bu örnekte gösterildiği gibi, bir nokta (.) ve ardından açılı ayraç (<>) içine alınmıştaban sınıfı adını içerir:var v:Vector.<String>;v = new Vector.<String>();Örneğin birinci satırında, v değişkeni Vector.<String> örneği olarak bildirilir. Başka bir deyişle, bu yalnızca Stringörneklerini barındırabilen bir dizinlenmiş diziyi temsil eder. İkinci satır, aynı Vector türünde bir örnek (başka birdeyişle, öğelerinin tümü String örneği olan bir Vector) oluşturmak için Vector() yapıcısını çağırır. Bu nesneyi vöğesine atar.Vector.<T>() yapıcısını kullanmaVector.<T>() yapıcısını argüman olmadan kullanırsanız, bu boş bir Vector örneği oluşturur. length özelliğinikontrol ederek bir Vector öğesinin boş olup olmadığını test edebilirsiniz. Örneğin, şu kod, Vector.<T>() yapıcısınıargüman olmadan çağırır:var names:Vector.<String> = new Vector.<String>();trace(names.length); // output: 0
    • 157ACTIONSCRIPT 3.0I PROGRAMLAMADizilerle çalışmaVector öğesinin başlangıçta kaç tane öğeye ihtiyacı olduğunu önceden bilirseniz, Vector öğesinde öğe sayısını öncedentanımlayabilirsiniz. Belirli sayıda öğe içeren bir Vector öğesi oluşturmak için, öğe sayısını birinci parametre (lengthparametresi) olarak iletin. Vector öğeleri boş olamayacağından, öğeler taban türünde örneklerle doldurulur. Tabantürü, null değerlerine izin veren bir başvuru türüyse, öğelerin tümü null değerini içerir. Aksi takdirde, öğelerin tümüsınıfın varsayılan değerini içerir. Örneğin, bir uint değişkeni null olamaz. Sonuç olarak, aşağıdaki kod listesinde, herbiri 0 değerini içeren yedi öğeyle ages adındaki Vector öğesi oluşturulur:var ages:Vector.<uint> = new Vector.<uint>(7);trace(ages); // output: 0,0,0,0,0,0,0Son olarak, Vector.<T>() yapıcısını kullanarak, ikinci parametre (fixed parametresi) için true değerini iletip sabituzunlukta bir Vector öğesi de oluşturabilirsiniz. Bu durumda, belirtilen öğe sayısına sahip bir Vector öğesi oluşturulurve öğelerin sayısı değiştirilemez. Ancak, yine de sabit uzunluktaki Vector öğelerinin değerlerini değiştirebildiğiniziunutmayın.Array sınıfının aksine, Vector öğesinin başlangıç değerlerini belirtmek için Vector.<T>() yapıcısına değerler listesiiletemezsiniz.Vector.<T>() global işlevini kullanmaVector nesnesi oluşturmak için, Vector.<T>() yapıcısının yanı sıra, Vector.<T>() global işlevini dekullanabilirsiniz. Vector.<T>() global işlevi bir dönüştürme işlevidir. Vector.<T>() global işlevini çağırdığınızda,yöntemin döndürdüğü Vector öğesinin taban türünü belirtirsiniz. Argüman olarak tek bir dizinlenmiş dizi (Arrayveya Vector örneği) iletirsiniz. Bu yöntem daha sonra belirtilen taban türüne sahip, kaynak dizi argümanındakideğerleri içeren bir Vector öğesi döndürür. Aşağıdaki kod listesi, Vector.<T>() global işlevini çağırmaya yöneliksözdizimini gösterir:var friends:Vector.<String> = Vector.<String>(["Bob", "Larry", "Sarah"]);Vector.<T>() global işlevi, iki düzeyde veri türü dönüştürmesi gerçekleştirir. İlk olarak, bir Array örneği işleveiletildiğinde, Vector örneği döndürülür. İkinci olarak, kaynak dizi bir Array veya Vector örneği de olsa, işlev kaynakdizinin öğelerini taban türünün değerlerine dönüştürmeye çalışır. Dönüştürme, standart ActionScript veri türüdönüştürme kurallarını kullanır. Örneğin, aşağıdaki kod listesi, kaynak Array öğesindeki String değerlerini sonuçVector öğesindeki tam sayılara dönüştürür. Birinci değerin ondalık kısmı ("1.5") kırpılır ve sayısal olmayan üçüncüdeğer ("Waffles") sonuçta 0a dönüştürülür:var numbers:Vector.<int> = Vector.<int>("1.5", "17", "Waffles"]);trace(numbers); // output: 1,17,0Kaynak öğelerden herhangi biri dönüştürülemezse, bir hata oluşur.Kod, Vector.<T>() global işlevini çağırdığında, kaynak dizideki bir öğe, belirtilen taban türünün alt sınıfının birörneğiyse, öğe sonuçta elde edilen Vector öğesine eklenir (herhangi bir hata oluşmaz). Vector.<T>() global işlevininçağrılması, T taban türüne sahip bir Vector öğesinin, T öğesinin üst sınıfı olan bir taban türüne sahip Vector öğesinedönüştürülmesinin tek yoludur.Dizi öğeleri eklemeDizinlenmiş diziye bir öğe eklemenin en temel yolu, dizi erişimi ([]) operatörünün kullanılmasıdır. Dizinlenmiş diziöğesinin değerini ayarlamak için, Array veya Vector nesne adını ve atama deyiminin sol tarafındaki dizin sayısınıkullanın:songTitles[5] = "Happy Birthday";Array veya Vector öğesi, o dizinde bir öğe içermiyorsa, dizin oluşturulur ve değer orada saklanır. O dizinde değervarsa, yeni değer varolan değerin yerini alır.
    • 158ACTIONSCRIPT 3.0I PROGRAMLAMADizilerle çalışmaArray nesnesi, herhangi bir dizinde öğe oluşturmanıza olanak sağlar. Ancak bir Vector nesnesiyle yalnızca varolan birdizine veya sonraki mevcut dizine değer atayabilirsiniz. Sonraki mevcut dizin, Vector nesnesinin length özelliğinekarşılık gelir. Vector nesnesine yeni bir öğe eklemenin en güvenli yolu, bu listeye benzer bir kod kullanılmasıdır:myVector[myVector.length] = valueToAdd;Array ve Vector sınıfı yöntemlerinin üçü (push(), unshift() ve splice()) bir dizinlenmiş diziye öğeler eklemenizeolanak sağlar. push() yöntemi bir dizinin sonuna bir veya daha fazla öğe ekler. Başka bir deyişle, push() yöntemikullanılarak bir diziye eklenen son öğe, en yüksek dizin numarasına sahip olacaktır. unshift() yöntemi bir dizininbaşına, her zaman 0 dizin numaralı olan bir veya birden fazla öğe ekler. splice() yöntemi dizideki belirli bir dizineistenen sayıda öğe ekler.Aşağıdaki örnek, bu yöntemlerin üçünü de göstermektedir. Gezegenlerin güneşe yakınlık sıralarına göre gezegenlerinadlarını saklamak için planets adlı bir dizi oluşturulur. İlk olarak, Mars öğesini eklemek için push() yöntemi çağrılır.Ardından dizinin önünde bulunan Mercury öğesini eklemek için unshift() yöntemi çağrılır. Son olarak Venus veEarth öğelerini, Mercury öğesinin arkasına Mars öğesinin önüne eklemek için splice() yöntemi çağrılır. splice()öğesine gönderilen ilk argüman olan 1 tam sayısı, eklemenin dizin 1den başlaması komutunu verir. splice() öğesinegönderilen ikinci argüman olan 0 tam sayısı, herhangi bir öğenin silinmeyeceğini belirtir. Son olarak, splice()öğesine gönderilen üçüncü ve dördüncü argümanlar olan Venus ve Earth eklenir.var planets:Array = new Array();planets.push("Mars"); // array contents: Marsplanets.unshift("Mercury"); // array contents: Mercury,Marsplanets.splice(1, 0, "Venus", "Earth");trace(planets); // array contents: Mercury,Venus,Earth,Marspush() ve unshift() yöntemleri, değiştirilen dizinin uzunluğunu temsil eden işaretsiz bir tam sayı döndürür.splice() yöntemi, öğe eklemek için kullanıldığında boş bir dizi döndürür; bu her ne kadar garip gelse de splice()yönteminin çok yönlülüğü göz önüne alındığında daha kolay anlaşılabilir. splice() yöntemini yalnızca bir diziye öğeeklemek için değil ayrıca bir diziden öğe kaldırmak için de kullanabilirsiniz. splice() yöntemi, öğeleri kaldırmak içinkullanıldığında, kaldırılan öğeleri içeren bir dizi döndürür.Not: Vector nesnesinin fixed özelliği true olursa, Vector öğesindeki toplam öğe sayısı değiştirilemez. Burada açıklananteknikleri kullanarak sabit uzunluktaki Vector öğesine yeni bir öğe eklemeyi denerseniz, bir hata oluşur.Değerleri alma ve dizi öğelerini kaldırmaDizinlenmiş diziden bir öğenin değerini almanın en basit yolu, dizi erişimi ([]) operatörünün kullanılmasıdır.Dizinlenmiş dizi öğesinin değerini almak için, Array veya Vector nesne adını ve atama deyiminin sağ tarafındaki dizinsayısını kullanın:var myFavoriteSong:String = songTitles[3];Herhangi bir öğenin bulunmadığı bir dizin kullanılarak Array veya Vector öğesinden değer almaya çalışılmasımümkündür. Bu durumda, Array nesnesi undefined değerini döndürür ve Vector öğesi bir RangeError istisnası atar.Array ve Vector sınıfının üç yöntemi (pop(), shift() ve splice()) öğeleri kaldırmanıza olanak sağlar. pop()yöntemi, dizinin sonundaki öğeyi kaldırır. Başka bir deyişle, en yüksek dizin numarasına sahip öğeyi kaldırır. shift()yöntemi, dizinin başındaki öğeyi, başka bir deyişle, her zaman 0 dizin numarasına sahip olan öğeyi kaldırır. Öğeeklemek için de kullanılabilen splice() yöntemi, yönteme gönderilen ilk argüman tarafından belirtilen dizinnumarasından başlayarak rastgele sayıda öğeyi kaldırır.Aşağıdaki örnek, bir Array örneğinden öğe kaldırmaya yönelik üç yöntemi de kullanır. Geniş su kütlelerinin adlarınısaklamak için, oceans adında bir Array öğesi oluşturulur. Array öğesindeki adların bazıları okyanus olmayıp gölolduğundan, bu adların kaldırılması gerekir.
    • 159ACTIONSCRIPT 3.0I PROGRAMLAMADizilerle çalışmaİlk olarak Aral ve Superior öğelerini kaldırmak ve Atlantic ve Indian öğelerini eklemek için splice() yöntemikullanılır. splice() öğesine gönderilen ilk argüman olan 2 tam sayısı, işlemin dizin 2deki listede bulunan üçüncüöğeden başlaması gerektiğini belirtir. İkinci argüman olan 2, iki öğenin kaldırılması gerektiğini belirtir. Kalanargümanlar olan Atlantic ve Indian, dizin 2 konumuna eklenecek değerlerdir.İkinci olarak, dizideki son öğe olan Huron öğesini kaldırmak için pop() yöntemi kullanılır. Üçüncü olarak da, dizidekiilk öğe olan Victoria öğesini kaldırmak için shift() yöntemi kullanılır.var oceans:Array = ["Victoria", "Pacific", "Aral", "Superior", "Indian", "Huron"];oceans.splice(2, 2, "Arctic", "Atlantic"); // replaces Aral and Superioroceans.pop(); // removes Huronoceans.shift(); // removes Victoriatrace(oceans);// output: Pacific,Arctic,Atlantic,Indianpop() ve shift() yöntemleri, kaldırılan öğeyi döndürür. Bir Array örneği için, diziler herhangi bir veri türünündeğerlerini bulundurabildiğinden, döndürülen değerin veri türü Object olur. Vector örneği için, döndürülen değerinveri türü, Vector öğesinin taban türüdür. splice() yöntemi, kaldırılan değerleri içeren bir Array veya Vector öğesinidöndürür. Aşağıdaki örnekte gösterildiği gibi, splice() öğesine yapılan bir çağrı, döndürülen Array öğesini yeni birArray değişkenine atayacak şekilde oceans Array örneğini değiştirebilirsiniz:var lakes:Array = oceans.splice(2, 2, "Arctic", "Atlantic");trace(lakes); // output: Aral,SuperiorBir Array nesnesi öğesinde delete operatörünü kullanan bir kodla karşılaşabilirsiniz. delete operatörü, bir Arrayöğesinin değerini undefined olarak ayarlar ancak öğeyi Array öğesinden kaldırmaz. Örneğin, şu kod, oceans Arrayiçindeki üçüncü öğede delete operatörünü kullanır, ancak Array öğesinin uzunluğu 5 olarak kalır:var oceans:Array = ["Arctic", "Pacific", "Victoria", "Indian", "Atlantic"];delete oceans[2];trace(oceans);// output: Arctic,Pacific,,Indian,Atlantictrace(oceans[2]); // output: undefinedtrace(oceans.length); // output: 5Bir dizinin length özelliğini kullanarak Array veya Vector öğesini kırpabilirsiniz. Dizinlenmiş dizinin lengthözelliğini geçerli dizi uzunluğundan düşük bir uzunluğa ayarlarsanız, yeni length eksi 1 değerinden yüksek dizinsayılarında saklanan öğeler kaldırılarak dizi kırpılır. Örneğin, oceans dizisi, tüm geçerli girişler dizinin başında olacakşekilde sıralansaydı, şu kodda gösterildiği gibi, dizinin sonundaki girişleri kaldırmak için length özelliğinikullanabilirdiniz:var oceans:Array = ["Arctic", "Pacific", "Victoria", "Aral", "Superior"];oceans.length = 2;trace(oceans); // output: Arctic,PacificNot: Vector nesnesinin fixed özelliği true olursa, Vector öğesindeki toplam öğe sayısı değiştirilemez. Burada açıklananteknikleri kullanarak sabit uzunluktaki Vector öğesinden bir öğeyi kaldırmayı veya söz konusu Vector öğesini kırpmayıdenerseniz, bir hata oluşur.Diziyi sıralamaSıralamayı düzenleyerek veya ters çevirerek dizinlenmiş dizinin sıralamasını değiştirmenize olanak sağlayan üçyöntem vardır: reverse(), sort() ve sortOn() Bu yöntemlerin tümü, varolan diziyi değiştirir. Aşağıdaki tabloda,bu yöntemler ve bu yöntemlerin Array ve Vector nesnelerine yönelik davranışı özetlenmektedir:
    • 160ACTIONSCRIPT 3.0I PROGRAMLAMADizilerle çalışmareverse() yöntemireverse() yöntemi herhangi bir parametre almaz ve bir değer döndürmez, ancak dizinizin sırasını geçerlidurumundan tersi sıralamaya geçirmenizi sağlar. Şu örnek, oceans dizisinde listelenen okyanusların sırasını tersineçevirir:var oceans:Array = ["Arctic", "Atlantic", "Indian", "Pacific"];oceans.reverse();trace(oceans); // output: Pacific,Indian,Atlantic,Arcticsort() yöntemi ile temel sıralama (yalnızca Array sınıfı)Array örneği için, sort() yöntemi, varsayılan sıralama düzenini kullanarak dizideki öğeleri yeniden düzenler.Varsayılan sıralama düzeni şu özelliklere sahiptir:• Sıralama büyük/küçük harf duyarlıdır, başka bir deyişle, büyük harfli karakterler küçük harfli karakterlerden öncegelir. Örneğin, D harfi b harfinden önce gelir.• Sıralama artan sıradadır, başka bir deyişle, düşük karakter kodları (örn. A), daha yüksek karakter kodlarından (örn.B) önce gelir.• Sıralama, aynı değerleri belirli bir sıralama olmaksızın birbiriyle bitiştirir.• Sıralama dize tabanlıdır, başka bir deyişle, öğeler karşılaştırılmadan önce dizelere dönüştürülür (örneğin, "1"dizesi, "3" dizesinden daha düşük karakter koduna sahip olduğundan, 10, 3ten önce gelir).Büyük/küçük harf duyarlılığı olmadan veya azalan sırada dizinizi sıralamanız gerekebilir ya da dizinizde alfabetik değilde sayısal olarak sıralamak istediğiniz sayılar bulunabilir. Array sınıfının sort() yöntemi, varsayılan sıralamadüzeninin her bir özelliğini değiştirmenize olanak sağlayan bir options parametresine sahiptir. Bu seçenekler,aşağıdaki listede gösterildiği gibi, Array sınıfındaki statik sabitler kümesiyle tanımlanır:• Array.CASEINSENSITIVE: Bu seçenek, sıralamanın büyük/küçük harf duyarlı olmasını önler. Örneğin, küçük bharfi, büyük D harfinden önce gelir.• Array.DESCENDING: Bu seçenek, varsayılan artan sıralamayı ters çevirir. Örneğin, B harfi A harfinden önce gelir.• Array.UNIQUESORT: Bu seçenek, iki aynı değer bulunduğunda sıralamanın durdurulmasına neden olur.• Array.NUMERIC: Bu seçenek sayısal sıralama sağlar, böylece 3, 10 sayısından önce gelir.Aşağıdaki örnek, bu seçeneklerden bazılarını vurgular. Birçok farklı seçenek kullanılarak sıralanan poets adında birArray öğesi oluşturulur.Yöntem Array davranışı Vector davranışıreverse() Son öğe ilk öğe olacak ve sondan bir önceki öğe ikinci öğe olacak, vb.şekilde dizinin sırasını değiştirirArray davranışıyla aynıdırsort() Array içindeki öğeleri, alfabetik veya sayısal sıralama gibi öncedentanımlı çeşitli şekillerde sıralamanıza olanak sağlar. Özel bir sıralamaalgoritması da belirtebilirsiniz.Öğeleri, belirttiğiniz özel sıralamaalgoritmasına göre sıralarsortOn() Sıralama anahtarı olarak kullanmak üzere özellik veya özellikleribelirterek bir veya birkaç ortak özelliğe sahip nesneleri sıralamanızaolanak sağlarVector sınıfında kullanılamaz
    • 161ACTIONSCRIPT 3.0I PROGRAMLAMADizilerle çalışmavar poets:Array = ["Blake", "cummings", "Angelou", "Dante"];poets.sort(); // default sorttrace(poets); // output: Angelou,Blake,Dante,cummingspoets.sort(Array.CASEINSENSITIVE);trace(poets); // output: Angelou,Blake,cummings,Dantepoets.sort(Array.DESCENDING);trace(poets); // output: cummings,Dante,Blake,Angeloupoets.sort(Array.DESCENDING | Array.CASEINSENSITIVE); // use two optionstrace(poets); // output: Dante,cummings,Blake,Angelousort() yöntemiyle özel sıralama (Array ve Vector sınıfları)Array nesnesi için kullanılabilir olan temel sıralamaya ek olarak, özel bir sıralama kuralı da tanımlayabilirsiniz. Buteknik, Vector sınıfı için kullanılabilir olan tek sort() yöntemi biçimidir. Özel bir sıralama tanımlamak için, özel birsıralama işlevi yazıp bunu argüman olarak sort() yöntemine iletirsiniz.Örneğin, her liste öğesinde kişinin tam adının bulunduğu bir ad listeniz varsa ve listeyi soyadına göre sıralamakistiyorsanız, her bir öğeyi ayrıştırmak için özel bir sıralama işlevi kullanmanız ve sıralama işlevinde soyadınıkullanmanız gerekir. Aşağıdaki kod, Array.sort() yöntemine yönelik bir parametre olarak kullanılan özel bir işlevlebunun nasıl yapılabileceğini gösterir:var names:Array = new Array("John Q. Smith", "Jane Doe", "Mike Jones");function orderLastName(a, b):int{var lastName:RegExp = /bS+$/;var name1 = a.match(lastName);var name2 = b.match(lastName);if (name1 < name2){return -1;}else if (name1 > name2){return 1;}else{return 0;}}trace(names); // output: John Q. Smith,Jane Doe,Mike Jonesnames.sort(orderLastName);trace(names); // output: Jane Doe,Mike Jones,John Q. SmithorderLastName() özel sıralama işlevi, karşılaştırma işlemi için kullanılmak üzere her bir öğeden soyadını ayıklamakiçin normal bir ifade kullanır. orderLastName işlev tanımlayıcısı, names dizisinde sort() yöntemi çağrılırken tekparametre olarak kullanılır. Sıralama işlevi aynı ada iki dizi öğesinde çalıştığından, a ve b olmak üzere iki parametreyikabul eder. Sıralama işlevinin döndürme değeri, öğelerin nasıl sıralanması gerektiğini belirtir:• -1 döndürme değeri, birinci parametrenin (a) ikinci parametreden (b) önce geldiğini belirtir.• 1 döndürme değeri, ikinci parametrenin (b) birinci parametreden (a) önce geldiğini belirtir.• 0 döndürme değeri, öğelerin eşit sıralama önceliğine sahip olduğunu belirtir.
    • 162ACTIONSCRIPT 3.0I PROGRAMLAMADizilerle çalışmasortOn() yöntemi (yalnızca Array sınıfı)sortOn() yöntemi, nesneleri içeren öğelerin bulunduğu Array nesneleri için tasarlanmıştır. Bu nesnelerde, sıralamaanahtarı olarak kullanılabilecek en az bir ortak özelliğin bulunması beklenir. Başka herhangi bir türdeki dizi içinsortOn() yönteminin kullanılması beklenmeyen sonuçlara yol açar.Not: Vector sınıfı, sortOn() yöntemini içermez. Bu yöntem yalnızca Array nesneleri için kullanılabilir.Aşağıdaki örnek, her bir öğe dize değil de nesne olacak şekilde poets Array öğesini değiştirir. Her nesne, şairinsoyadını ve doğum yılını içerir.var poets:Array = new Array();poets.push({name:"Angelou", born:"1928"});poets.push({name:"Blake", born:"1757"});poets.push({name:"cummings", born:"1894"});poets.push({name:"Dante", born:"1265"});poets.push({name:"Wang", born:"701"});Array öğesini born özelliğine göre sıralamak için sortOn() yöntemini kullanabilirsiniz. sortOn() yöntemi şu ikiparametreyi tanımlar: fieldName ve options. fieldName argümanının dize olarak belirtilmesi gerekir. Aşağıdakiörnekte, sortOn() öğesi "born" ve Array.NUMERIC olmak üzere iki argümanla çağrılır. Sıralamanın alfabetik değilsayısal olarak yapılmasını sağlamak için Array.NUMERIC argümanı kullanılır. Diziye daha az veya daha çok basamaklıbir sayı da eklense sıralamanın beklendiği gibi davranacağı kesin olduğundan, tüm sayılar aynı sayıda basamak içersede bu iyi bir uygulamadır.poets.sortOn("born", Array.NUMERIC);for (var i:int = 0; i < poets.length; ++i){trace(poets[i].name, poets[i].born);}/* output:Wang 701Dante 1265Blake 1757cummings 1894Angelou 1928*/Orijinal diziyi değiştirmeden sıralama (yalnızca Array sınıfı)Genellikle, sort() ve sortOn() yöntemleri bir Array öğesini değiştirir. Varolan diziyi değiştirmeden Array öğesinisıralamak isterseniz, options parametresinin parçası olarak Array.RETURNINDEXEDARRAY sabitini iletin. Bu seçenek,sıralamayı yansıtan yeni bir Array öğesi döndürmesini ve orijinal Array öğesini olduğu gibi bırakmasını yöntemlerebildirir. Yöntemler tarafından döndürülen Array öğesi, yeni sıralama düzenini yansıtan basit bir dizin sayıları Arrayöğesi olup orijinal Array içindeki öğeleri içermez. Örneğin, Array öğesini değiştirmeden poets Array öğesini doğumyılına göre sıralamak için, options parametresi için iletilen argümanın parçası olarak Array.RETURNINDEXEDARRAYsabitini dahil edin.Aşağıdaki örnek, döndürülen dizin bilgilerini indices adında bir Array öğesinde saklar ve şairleri doğum yılına göresıralanmış şekilde vermek için, indices dizisini değiştirilmemiş poets dizisiyle birlikte kullanır:
    • 163ACTIONSCRIPT 3.0I PROGRAMLAMADizilerle çalışmavar indices:Array;indices = poets.sortOn("born", Array.NUMERIC | Array.RETURNINDEXEDARRAY);for (var i:int = 0; i < indices.length; ++i){var index:int = indices[i];trace(poets[index].name, poets[index].born);}/* output:Wang 701Dante 1265Blake 1757cummings 1894Angelou 1928*/Diziyi sorgulamaArray ve Vector sınıfının dört yönteminin tümü (concat(), join(), slice() ve toString()) bilgi için diziyisorgular ancak diziyi değiştirmez. concat() ve slice() yöntemleri yeni diziler döndürürken, join() ve toString()yöntemleri de dize döndürür. concat() yöntemi, argüman olarak yeni bir diziyi veya öğeler listesini alır ve yeni birdizi oluşturmak için bunları varolan diziyle birleştirir. slice() yöntemi, startIndex ve endIndex adında ikiparametre içerir ve varolan diziden "dilimli" öğelerin bir kopyasını içeren yeni bir dizi döndürür. Dilim, startIndexparametresindeki öğeyle başlar ve endIndex parametresinden hemen önceki öğeyle sona erer. Şunu yinelemekte faydavar: endIndex parametresindeki öğe, döndürme değerine dahil edilmez.Aşağıdaki örnek, diğer dizilerin öğelerini kullanarak yeni diziler oluşturmak için concat() ve slice() öğelerinikullanır:var array1:Array = ["alpha", "beta"];var array2:Array = array1.concat("gamma", "delta");trace(array2); // output: alpha,beta,gamma,deltavar array3:Array = array1.concat(array2);trace(array3); // output: alpha,beta,alpha,beta,gamma,deltavar array4:Array = array3.slice(2,5);trace(array4); // output: alpha,beta,gammaDiziyi sorgulayıp dizinin içeriklerini dize olarak döndürmek için join() ve toString() yöntemlerinikullanabilirsiniz. join() yöntemi için herhangi bir parametre kullanılmıyorsa, iki yöntem de aynı şekilde hareketederek dizideki tüm öğelerin virgül sınırlı listesini içeren bir dize döndürür. join() yöntemi, toString()yönteminden farklı olarak, döndürülen dizedeki her öğe arasında ayırıcı olarak kullanılacak sembolü seçmenizisağlayan delimiter adında bir parametreyi kabul eder.Aşağıdaki örnek, rivers adında bir Array öğesi oluşturur ve Array öğesindeki değerleri dize olarak döndürmek içinhem join() hem de toString() öğelerini çağırır. toString() yöntemi virgül sınırlı değerler (riverCSV)döndürmek için kullanılırken, join() yöntemi + karakteriyle ayrılmış değerler döndürmek için kullanılır.var rivers:Array = ["Nile", "Amazon", "Yangtze", "Mississippi"];var riverCSV:String = rivers.toString();trace(riverCSV); // output: Nile,Amazon,Yangtze,Mississippivar riverPSV:String = rivers.join("+");trace(riverPSV); // output: Nile+Amazon+Yangtze+Mississippi
    • 164ACTIONSCRIPT 3.0I PROGRAMLAMADizilerle çalışmajoin() yöntemiyle ilgili bilinmesi gereken bir nokta, aşağıdaki örnekte gösterildiği gibi, ana dizi öğeleri için hangiayırıcıyı belirttiğinize bakılmaksızın, yuvalanmış Array veya Vector örneklerinin her zaman virgülle ayrılmışdeğerlerle döndürülmesidir:var nested:Array = ["b","c","d"];var letters:Array = ["a",nested,"e"];var joined:String = letters.join("+");trace(joined); // output: a+b,c,d+eİlişkilendirilebilir dizilerBazen karma veya eşleme olarak da adlandırılan ilişkilendirilebilir bir dizi, saklanan değerleri organize etmek içinsayısal bir dizin yerine anahtarları kullanır. İlişkilendirilebilir bir dizideki her anahtar, saklanan değere erişmek içinkullanılan benzersiz bir dizedir. İlişkilendirilebilir bir dizi, Object sınıfının bir örneği olup bu, her anahtarın bir özellikadına karşılık geldiği anlamına gelir. İlişkilendirilebilir diziler, anahtar ve değer çiftlerinin sıralanmamışkoleksiyonlarıdır. Kodunuzun belirli bir sırada olması için ilişkilendirilebilir dizinin anahtarlarını beklememesigerekir.ActionScript 3.0, sözlük adında gelişmiş bir ilişkilendirilebilir dizi türünü de içerir. flash.utils paketinde Dictionarysınıfının örnekleri olan sözlükler, herhangi bir veri türündeki anahtarları kullanır. Başka bir deyişle, sözlük anahtarları,String türünün değerleriyle sınırlı değildir.Dize anahtarları ile ilişkilendirilebilir dizilerActionScript 3.0da ilişkilendirilebilir dizi oluşturmanın iki yolu vardır. Birinci yol, Object örneği kullanılmasıdır.Object örneği kullanarak, bir nesne değişmeziyle dizinizi başlatabilirsiniz. Object sınıfının genel nesne olarak daadlandırılan bir örneği, ilişkilendirilebilir bir diziyle aynı işleve sahiptir. Genel nesnenin özellik adlarının her biri,saklanan değere erişilmesini sağlayan bir anahtar görevi görür.Aşağıdaki örnek, iki anahtar ve değer çiftiyle diziyi başlatmak için bir nesne değişmezi kullanan, monitorInfo adındailişkilendirilebilir bir dizi oluşturur:var monitorInfo:Object = {type:"Flat Panel", resolution:"1600 x 1200"};trace(monitorInfo["type"], monitorInfo["resolution"]);// output: Flat Panel 1600 x 1200Bildirim zamanında diziyi başlatmanız gerekmiyorsa, diziyi oluşturmak için Object yapıcısını şu şekildekullanabilirsiniz:var monitorInfo:Object = new Object();Bir nesne değişmezi veya Object sınıfı yapıcısı kullanılarak dizi oluşturulduktan sonra, dizi erişimi ([]) operatörünüveya nokta operatörünü (.) kullanarak diziye yeni değerler ekleyebilirsiniz. Aşağıdaki örnek, monitorArray öğesineiki yeni değer ekler:monitorInfo["aspect ratio"] = "16:10"; // bad form, do not use spacesmonitorInfo.colors = "16.7 million";trace(monitorInfo["aspect ratio"], monitorInfo.colors);// output: 16:10 16.7 millionaspect ratio adındaki anahtarın bir boşluk karakteri içerdiğini unutmayın. Bu, dizi erişimi ([]) operatörüylemümkün olsa da, nokta operatörüyle denendiğinde hataya yol açar. Anahtar adlarınızda boşluk kullanılmasıönerilmez.
    • 165ACTIONSCRIPT 3.0I PROGRAMLAMADizilerle çalışmaİlişkilendirilebilir bir dizi oluşturmanın ikinci yolu, Array yapıcısı (veya herhangi bir dinamik sınıf yapıcısı)kullanıldıktan sonra diziye anahtar ve değer çiftleri eklemek için dizi erişimi ([]) operatörünün veya noktaoperatörünün (.) kullanılmasıdır. İlişkilendirilebilir dizinizin Array türünde olmasını bildirirseniz, diziyi başlatmakiçin bir nesne değişmezi kullanamazsınız. Aşağıdaki örnek, Array yapıcısını kullanarak monitorInfo adındailişkilendirilebilir bir dizi oluşturur ve type adında bir anahtar ile resolution adında bir anahtarı değerleriyle birlikteekler:var monitorInfo:Array = new Array();monitorInfo["type"] = "Flat Panel";monitorInfo["resolution"] = "1600 x 1200";trace(monitorInfo["type"], monitorInfo["resolution"]);// output: Flat Panel 1600 x 1200İlişkilendirilebilir bir dizi oluşturmak için Array yapıcısının kullanılması herhangi bir avantaj sağlamaz. Arrayyapıcısını veya Array veri türünü kullanıyor olsanız da, ilişkilendirilebilir dizilerle Array.length özelliğini veya Arraysınıfı yöntemlerinden herhangi birini kullanamazsınız. Dizinlenmiş diziler oluşturmanın en iyi yolu Array yapıcısınınkullanılmasıdır.Nesne anahtarları ile ilişkilendirilebilir diziler (Sözlükler)Anahtarlar için dize yerine nesne kullanan ilişkilendirilebilir bir dizi oluşturmak üzere Dictionary sınıfınıkullanabilirsiniz. Bu diziler bazen sözlük, karma veya eşleme olarak adlandırılır. Örneğin, belirli bir konteynerleilişkisini esas alarak bir Sprite nesnesinin konumunu belirleyen bir uygulamayı göz önünde bulundurun. Spritenesnelerinin her birini bir konteynere eşlemek için Dictionary nesnesini kullanabilirsiniz.Aşağıdaki kod, Dictionary nesnesi için anahtar görevi gören üç Sprite sınıfı örneği oluşturur. Her anahtara GroupAveya GroupB değeri atanır. Değerler herhangi bir veri türünde olabilir ancak bu örnekte hem GroupA hem de GroupB,Object sınıfının örnekleridir. Daha sonra, aşağıdaki kodda gösterildiği gibi, dizi erişimi ([]) operatörü ile anahtarlarınher biriyle ilişkilendirilmiş değere erişebilirsiniz:
    • 166ACTIONSCRIPT 3.0I PROGRAMLAMADizilerle çalışmaimport flash.display.Sprite;import flash.utils.Dictionary;var groupMap:Dictionary = new Dictionary();// objects to use as keysvar spr1:Sprite = new Sprite();var spr2:Sprite = new Sprite();var spr3:Sprite = new Sprite();// objects to use as valuesvar groupA:Object = new Object();var groupB:Object = new Object();// Create new key-value pairs in dictionary.groupMap[spr1] = groupA;groupMap[spr2] = groupB;groupMap[spr3] = groupB;if (groupMap[spr1] == groupA){trace("spr1 is in groupA");}if (groupMap[spr2] == groupB){trace("spr2 is in groupB");}if (groupMap[spr3] == groupB){trace("spr3 is in groupB");}Nesne anahtarlarıyla yinelemefor..in döngüsü veya for each..in döngüsü ile Dictionary nesnesinin içeriklerini yineleyebilirsiniz. for..indöngüsü, anahtarları esas alarak yineleme yapmanızı sağlarken, for each..in döngüsü, her bir anahtarlailişkilendirilmiş değerleri esas alarak yineleme yapmanıza olanak sağlar.Dictionary nesnesinin nesne anahtarlarına doğrudan erişmek için for..in döngüsünü kullanın. Dizi erişimi ([])operatörüyle Dictionary nesnesinin değerlerine de erişebilirsiniz. Aşağıdaki kod, önceki groupMap sözlüğü örneğinikullanarak, for..in döngüsü ile Dictionary nesnesinin nasıl yinelendiğini gösterir:for (var key:Object in groupMap){trace(key, groupMap[key]);}/* output:[object Sprite] [object Object][object Sprite] [object Object][object Sprite] [object Object]*/Dictionary nesnesinin değerlerine doğrudan erişmek için for each..in döngüsünü kullanın. Aşağıdaki kod, ayrıcagroupMap sözlüğünü kullanarak, for each..in döngüsü ile Dictionary nesnesinin nasıl yinelendiğini gösterir:
    • 167ACTIONSCRIPT 3.0I PROGRAMLAMADizilerle çalışmafor each (var item:Object in groupMap){trace(item);}/* output:[object Object][object Object][object Object]*/Nesne anahtarları ve bellek yönetimiAdobe® Flash® Player ve Adobe® AIR™, artık kullanılmayan belleği kurtarmak için bir çöp toplama sistemi kullanır. Birnesne kendisini işaret eden bir başvuru içermiyorsa, nesne çöp toplama için uygun hale gelmiş demektir ve çöptoplama sistemi tekrar çalıştırıldığında bellek kurtarılır. Örneğin, aşağıdaki kod yeni bir nesne oluşturur ve o nesneninbaşvurusunu myObject değişkenine atar:var myObject:Object = new Object();Nesneyi işaret eden bir başvuru olduğu sürece, çöp toplama sistemi nesnenin kapladığı belleği kurtarmaz. myObjectdeğeri, farklı bir nesneyi işaret edecek şekilde değiştirilirse veya null değerine ayarlanırsa, yalnızca orijinal nesneyiişaret eden başka bir başvuru olmaması durumunda orijinal nesnenin kapladığı bellek çöp toplama işlemi için uygunhale gelir.myObject öğesini Dictionary nesnesinde bir anahtar olarak kullanırsanız, orijinal nesneyi işaret eden başka birbaşvuru oluşturuyor olursunuz. Örneğin, şu kod, myObject değişkeni ve myMap nesnesindeki anahtar olmak üzere, birnesneye iki başvuru oluşturur:import flash.utils.Dictionary;var myObject:Object = new Object();var myMap:Dictionary = new Dictionary();myMap[myObject] = "foo";myObject tarafından başvurulan nesneyi çöp toplama işlemi için uygun hale getirmek istiyorsanız, bu nesneyi işareteden tüm başvuruları kaldırmanız gerekir. Bu durumda, aşağıdaki kodda gösterildiği gibi, myObject öğesinin değerinideğiştirmeniz ve myMap öğesinden myObject anahtarını silmeniz gerekir:myObject = null;delete myMap[myObject];Alternatif olarak, tüm sözlük anahtarlarını zayıf başvurular haline getirmek için, Dictionary useWeakReferenceparametresini kullanabilirsiniz. Çöp toplama sistemi, zayıf başvuruları yoksayar, başka bir deyişle, yalnızca zayıfbaşvurular içeren bir nesne de çöp toplama işlemi için uygundur. Örneğin, aşağıdaki kodda, nesneyi çöp toplamaişlemi için uygun hale getirmek üzere myMap öğesinden myObject anahtarını silmeniz gerekmez:import flash.utils.Dictionary;var myObject:Object = new Object();var myMap:Dictionary = new Dictionary(tru