2011-06-28 36 views
7

Một vài câu hỏi trên lớp từ điển trong Actionscript 3:điển Câu hỏi AS3

  1. cách tốt nhất để kiểm tra một chìa khóa không sử dụng là gì? Tôi đang thực hiện dictionary[key] == undefined ngay bây giờ. Đó có phải là cách nhanh nhất và sạch nhất?

  2. Tôi có phải vòng qua và delete dictionary[key] hoặc tôi có thể để từ điển không nằm trong phạm vi không?

  3. Có giải pháp nào tốt hơn để ánh xạ người nghe tin nhắn đến một lớp phát sóng không? Tôi làm điều gì đó như thế này:

    addListener(function : Function, messageType : Type) 
    { 
        if(dictionary[messageType] == undefined) 
         dictionary[messageType] = new Vector<Function>(); 
    
        dictionary[messageType].push(function); 
    } 
    
    broadcast(message : Message, messageType : Type) 
    { 
        if(dictionary[messageType] != undefined) 
        { 
         for each(var function : Function in dictionary[messageType]) 
          function(message); 
        } 
    } 
    

Tôi chỉ cần gõ chữ đó ra ngay bây giờ, vì vậy nó có thể không chính xác 100%. Ý tưởng tốt để sử dụng một hệ thống định tuyến với một từ điển như thế?

+0

Đối với n ° 1 có còn là 'hành in': 'if (chìa khóa trong từ điển)' mà tôi nghĩ là đẹp nhất để xem xét. – RIAstar

Trả lời

2
  1. bạn cũng có thể viết if (!dictionary[key]) ...

  2. bạn có thể vô hiệu hóa một đối tượng từ điển thay vì lặp qua để xóa tất cả các phím: dictionary = null;

  3. tôi đã viết một lớp phát thanh viên và bạn hoàn toàn hoan nghênh sử dụng nó nếu bạn muốn! nó hoạt động khá tốt cho giao tiếp toàn cầu giữa các đối tượng không hiển thị. tuy nhiên, nếu bạn muốn cho phép giao tiếp toàn cục giữa các đối tượng hiển thị, bạn có thể thêm và gửi sự kiện tùy chỉnh qua giai đoạn thay thế - giả sử chúng được thêm vào giai đoạn, tất nhiên.

Broadcast.as

package com.mattie.events.broadcaster 
{ 
//Class 
public class Broadcast 
    { 
    //Variables 
    public var name:String; 
    public var data:Object; 

    //Constructor 
    public function Broadcast(name:String, data:Object) 
     { 
     this.name = name; 
     this.data = data; 
     } 
    } 
} 

Broadcaster.as

package com.mattie.events.broadcaster 
{ 
//Imports 
import flash.utils.Dictionary; 

//Class 
public final class Broadcaster 
    { 
    //Properties 
    private static var singleton:Broadcaster; 

    private var publicationsProperty:Dictionary; 
    private var subscriptionsProperty:Array; 

    //Constructor 
    public function Broadcaster() 
     { 
     if (singleton) 
      throw new Error("Broadcaster is a singleton that cannot be publically instantiated and is only accessible thru the \"broadcaster\" public property."); 

     publicationsProperty = new Dictionary(true); 
     subscriptionsProperty = new Array(); 
     } 

    //Publish Data 
    public function publish(name:String, data:Object = null):void 
     { 
     publicationsProperty[name] = data; 

     for (var i:uint = 0; i < subscriptionsProperty.length; i++) 
      if (subscriptionsProperty[i].name == name) 
       { 
       var handler:Function = subscriptionsProperty[i].handler; 
       handler(new Broadcast(name, data)); 
       } 
     } 

    //Subscribe Handler 
    public function subscribe(name:String, handler:Function):void 
     { 
     if (publicationsProperty[name]) 
      handler(new Broadcast(name, publicationsProperty[name])); 

     for (var i:uint = 0; i < subscriptionsProperty.length; i++) 
      if (subscriptionsProperty[i].name == name && subscriptionsProperty[i].handler == handler) 
       return; 

     subscriptionsProperty.push({name: name, handler: handler}); 
     } 

    //Unpublish Data 
    public function unpublish(name:String):void 
     { 
     delete publicationsProperty[name]; 
     } 

    //Unsubscribe Handler 
    public function unsubscribe(name:String, handler:Function):void 
     { 
     for (var i:uint = 0; i < subscriptionsProperty.length; i++) 
      if (subscriptionsProperty[i].name == name && subscriptionsProperty[i].handler == handler) 
       { 
       subscriptionsProperty.splice(i, 1); 
       return; 
       } 
     } 

    //Publications Getter 
    public function get publications():Dictionary 
     { 
     return publicationsProperty; 
     } 

    //Subscriptions Getter 
    public function get subscriptions():Array 
     { 
     return subscriptionsProperty; 
     } 

    //Singleton Getter 
    public static function get broadcaster():Broadcaster 
     { 
     if (!singleton) 
      singleton = new Broadcaster(); 

     return singleton; 
     } 
    } 
} 
+5

'if (! Dictionary [key])' - điều này có thể dễ dàng sai nếu 'dictionary [key] = false' hoặc' dictionary [key] = 0'. –

+0

ah, bắt tốt. bạn hoàn toàn đúng. – TheDarkIn1978

7

- Bạn có hai lựa chọn hợp lệ: so sánh với undefined hoặc so sánh với null. Sự khác biệt là như thế này:

  • undefined: một giá trị không tồn tại ở tất cả các
  • null: một giá trị tồn tại, nhưng chứa rỗng

Vì vậy, bạn chọn những gì thích hợp trong trường hợp của bạn. Xem ví dụ.

import flash.utils.Dictionary; 

var test:Dictionary = new Dictionary(); 

trace(test[1] == null); // true, because null is internally converted to undefined 
trace(test[1] === null); // false, because of strictly typed comparison 
trace(test[1] == undefined); // true 
trace(test[1] === undefined); // true 

- Tôi luôn luôn làm vòng qua từ điển để làm sạch chúng lên khi tôi có tài liệu tham khảo ở đó (và không chỉ loại ptimitive như số hoặc chuỗi). Vâng, nó không phải là cần thiết, nhưng cách này tôi giúp thu gom rác một chút, mà nói chung là một ý tưởng tốt.

- Điều này khiến tôi bối rối. Tại sao bạn cần phát sóng theo cách này? Nó trông giống như những gì chúng tôi đã có ngày trước với lớp AsBroadcaster trong AS1-2, mà không nguyên bản cung cấp cho chúng tôi khả năng phát sóng.AS3 có một hệ thống điều phối sự kiện bản địa, mà bạn có thể nâng cấp cho phù hợp với nhu cầu của bạn (ví dụ, nếu bạn cần duy trì một danh sách người nghe cho từng loại sự kiện).

Các liên kết này có thể có ích:

+0

Bạn cũng có thể sử dụng các biểu thức "trong", ví dụ: 'if (khóa trong từ điển) {...}' –