2009-08-11 32 views
15

Trong Actionscript 3, có bất kỳ chi phí nào trong quá trình nhập gói đầy đủ so với nhập các lớp độc lập không?Gói nhập liệu Actionscript 3. * so với gói nhập.Class

Ví dụ:. Nhập khẩu flash.display * vs flash.display.Sprite nhập khẩu

Tôi biết đó là một thực hành tốt để nhập khẩu chỉ các lớp cần thiết từ một gói phần mềm để tránh xung đột, nhưng tôi đã thường được cho biết nó cũng có chi phí về kích thước tệp được biên dịch nếu tôi nhập đầy đủ các gói trong nhiều lớp khác nhau chỉ sử dụng một số lớp từ các gói đó.

Tôi tự hỏi nếu một lớp học sẽ được nhập một lần cho toàn bộ dự án hoặc nếu nhập được nhân với các lớp sử dụng chúng.

Kết quả kích thước tệp được biên dịch và hiệu suất thời gian chạy là hai khía cạnh khác nhau mà câu hỏi này bao trùm.

Trả lời

7

Lần truy cập duy nhất phải là thời gian biên dịch, nhưng rday viết rằng có một lần truy cập nhỏ. Nhưng đó phải là thứ mà Adobe sẽ khắc phục trong tương lai.

Báo cáo nhập khẩu không thực sự được xem như là nhập thực tế, nó chỉ đơn thuần là cách để trình biên dịch biết bạn đang tham chiếu đến lớp nào.

ví dụ: Nếu bạn làm cho bạn sở hữu Point lớp và nó đã được sử dụng trong một gói khác, trình biên dịch cần phải biết nếu bạn đang tham chiếu đến lớp Point của riêng bạn hoặc lớp học Point của Adobe.

Cách khác là viết tên đầy đủ thời gian đủ điều kiện mà bạn đã tham chiếu đến một lớp học.

ví dụ: var mySprite:flash.display.Sprite = new flash.display.Sprite();

Như được chỉ ra bởi Juan Pablo Califano trong nhận xét, điều này không thực sự làm việc với trình biên dịch (mặc dù tôi nghĩ rằng nó có thể hoạt động với AS2). Tôi chỉ có nghĩa là để chỉ ra lý do tại sao chúng tôi có tuyên bố nhập khẩu để bắt đầu.

Trong mọi trường hợp, nó sẽ không ảnh hưởng đến tệp được biên dịch nếu bạn nhập toàn bộ gói (mặc dù nó có hiệu quả).Nó sẽ như thế nào bao giờ có hiệu lực biên dịch thời gian, kể từ khi bạn đang cho trình biên dịch nhiều thứ nó cần phải xem xét thông qua.

Đối với "nhập" cùng một lớp nhiều lần. Nó sẽ không tạo ra sự khác biệt. Trình biên dịch sẽ chỉ bao gồm cùng một lớp một lần. Khác kích thước tập tin được biên dịch sẽ nhanh chóng quay ra khỏi tầm kiểm soát, vì hầu hết các lớp tham chiếu đến nhiều lớp mà lại nhắc đến các lớp khác. Nhưng một lần nữa, Adobe có thể đã tối ưu hóa để làm điều đó.

Tóm lại, bạn chỉ nên nhập nội dung bạn cần, không có lợi thế thực sự nào để nhập toàn bộ gói. Chỉ cần sử dụng một công cụ mã hóa thích hợp như FlashDevelop (nó là miễn phí) và bạn thậm chí không phải tự viết các câu lệnh nhập khẩu.

Một lưu ý phụ, nếu bạn đang biên soạn một thư viện (cũng không bao gồm lớp), tôi không chắc liệu nhập gói ngoài có thể bao gồm trong tệp đã biên dịch của bạn hay không. Điều đó có thể có tác động thực tế; mặc dù hy vọng Adobe không vít lên đó;)

+1

Chỉ cần lưu ý: ngay cả khi bạn sử dụng đường dẫn đủ điều kiện trong mã của mình, bạn cần nhập hoặc trình biên dịch khác sẽ khiếu nại. –

+0

Đúng, tôi quên điều đó. Nhưng nó có ý nghĩa hơn là một lý do tại sao chúng ta có các báo cáo nhập khẩu, vì sự thay thế sẽ rất khó chịu. –

+0

Không có vấn đề gì. Và có, đó là hành vi trong AS 2. Nếu bạn đã sử dụng tên đầy đủ, bạn có thể bỏ qua việc nhập. –

0

Giống như hầu hết các ngôn ngữ, có rất ít hoặc không có chi phí hoạt động liên quan đến việc nhập toàn bộ gói thay vì các lớp riêng lẻ.

Tuy nhiên nó là nhiều một thực hành tốt vì nó mang lại một veiw nhiều hơn nữa súc tích phụ thuộc cho lớp học của bạn

1

Các ActionScript 3 spec nói tất cả các tên công cộng từ gói sẽ nhập khẩu nếu bạn sử dụng '*'. Vì vậy, có một hit, mặc dù nó có thể không phải là một lớn tùy thuộc vào kích thước gói. Cuốn sách ActionScript Design Patterns cũng không khuyến khích điều này do hành lý quá cước, cũng như một số Adobe ActionScript tips.

Điều đó đang được nói, tôi mất một như thành phần trong một ứng dụng tôi đã viết và

import mx.containers.*; 
    import mx.events.*; 
    import mx.managers.*; 

Thay vì tên lớp duy nhất. Kích thước của tôi tăng 3 byte. Bây giờ, toàn bộ ứng dụng là 935kB, vì vậy tôi có thể có các lớp đó được nhập ở nơi khác, và hit không phải là rất lớn. Tôi đặt cược ứng dụng của bạn nhỏ hơn, tác động lớn hơn lên kích thước biên dịch của bạn sẽ là (tỷ lệ phần trăm khôn ngoan).

+0

Một chút disapointing rằng trình biên dịch không thể tối ưu hóa điều đó. –

+0

Nhưng tôi nghĩ rằng tối ưu hóa hơn có nghĩa là có nhiều thời gian hơn để biên dịch (xuất bản), Flash AS3 là chậm tiến trình trong quá trình xuất bản. Vì vậy, theo ý kiến ​​của tôi, đầu tiên họ nên làm cho nó tốt hơn (một cái gì đó giống như ngôn ngữ cao hơn, biên dịch chỉ deltas) và nhanh hơn sau đó họ nên suy nghĩ về những tối ưu hóa. !!! :) – DexTer

0

thực hành tốt là nói chung để có mã số đó là có thể đọc được ... có một sự khởi đầu lớp với 200 báo cáo nhập khẩu do đó sẽ được thực hành chứ không phải xấu ...

trong as3, một câu lệnh import chỉ thêm một phạm vi mới vào độ phân giải của trình biên dịch ... những gì được biên dịch thành một SWF và cái gì không, không được xác định bởi các câu lệnh import, mà bởi các dependency thực, tức là mã từ lớp A sử dụng lớp B ...

vì vậy khi chạy nó không tạo ra sự khác biệt, cách bạn nhập các lớp học của bạn ...

Greetz

back2dos

+0

+1. Cá nhân tôi thích nhập khẩu rõ ràng mọi lớp. Tôi nghĩ rằng nó hai lần nếu tôi đã phải làm điều đó bằng tay, mặc dù. Tuy nhiên, dù sao, bạn cũng đúng về cách thức hoạt động của quá trình nhập. Đó là một chỉ thị của trình biên dịch, nhưng nó không ép buộc biên dịch. Nếu không, tại sao mọi người sẽ sử dụng "var dummy: SomeClass;" hack để buộc sự bao gồm của một lớp không được tham chiếu như vậy trong mã? –

1

Hoàn toàn không có sự khác biệt trong mã biên dịch cho dù bạn nhập toàn bộ gói hay chỉ là lớp bạn đang sử dụng. Nhập khẩu chỉ quan trọng đối với trình biên dịch để tìm vị trí của các lớp.

Bạn có thể thử dịch ngược hoặc xem mã byte trước và sau.

1

Bạn có thể kiểm tra chính xác những gì các lớp học đang được nhập khẩu bằng công 'link-report' compiler option

Trình biên dịch có thể mất nhiều thời gian để sắp xếp ra những gì để bao gồm và những gì không bao gồm, nhưng nếu bạn kiểm tra các báo cáo liên kết của bạn, bạn sẽ chú ý nó chỉ bao gồm những gì nó sử dụng. :)

5

Phát biểu điểm ryanday, tôi không thể giải thích thêm 3 byte, nhưng một vài lưu ý ...

Các Patterns ActionScript Thiết kế cuốn sách cũng không khuyến khích này do hành lý quá cước

Vâng, trên trang 115, nhưng tôi nghĩ rằng đó là sai và gửi errata đến hiệu ứng đó.

Thông số ActionScript 3 cho biết tất cả tên công khai từ gói sẽ được nhập nếu bạn sử dụng '*'. Vì vậy, có một lần truy cập,

Loại đó, nhưng tôi không đồng ý việc diễn giải và nhấn. Nó nói: "Tên của các thành viên gói được thực hiện có thể nhìn thấy ..." (in full).Trong bối cảnh này, nó đang đề cập đến việc làm cho tên của các thành viên có thể nhìn thấy đến các công cụ biên dịch và biên tập, không hiển thị trong SWF được biên dịch. tức là không phải có nghĩa là các lớp được biên dịch vào SWF - trừ khi chúng thực sự được sử dụng (một biến được khai báo loại đó).

Một cách khác để xem xét điều này, bạn có thể nhập thủ công flash.display.MovieClip. Nhưng nếu bạn không tạo bất kỳ thể hiện nào của MovieClip, lớp MovieClip sẽ không được biên dịch thành SWF cuối cùng.

Để thỏa mãn bản thân mình, tôi biên soạn helloworld sau trong 3 cách khác nhau, xuất ra liên kết báo cáo theo đề nghị của @secoif ...

package 
{ 
    import flash.display.Sprite; 
    import flash.text.TextField; 

    public class ASHelloWorld extends Sprite 
    { 
     public function ASHelloWorld() 
     { 
      var tf:TextField = new TextField(); 
      tf.text = "Hello World!"; 
      addChild(tf); 
     } 
    } 
} 

Thứ nhất, như văn bản, liên kết báo cáo:

<report> 
    <scripts> 
    <script name="~/Documents/eclipse3.5carbonFbPlugin-FX4-LS10/ASHelloWorld/src/ASHelloWorld.as" mod="1278415735000" size="682" optimizedsize="344"> 
     <def id="ASHelloWorld" /> 
     <pre id="flash.display:Sprite" /> 
     <dep id="AS3" /> 
     <dep id="flash.text:TextField" /> 
    </script> 
    </scripts> 
    <external-defs> 
    <ext id="AS3" /> 
    <ext id="flash.text:TextField" /> 
    <ext id="flash.display:Sprite" /> 
    </external-defs> 
</report> 

Thứ hai, xóa tệp báo cáo liên kết và thay đổi nhập thành:

import flash.display.MovieClip; 
    import flash.display.Sprite; 
    import flash.text.TextField; 

Xây dựng sạch và liên kết repor t trông giống hệt nhau. Cùng kích thước, cùng tối ưu hóa, cùng một lớp được liên kết.

Thứ ba, xóa các tập tin báo cáo liên kết và thay đổi nhập khẩu để:

import flash.display.*; 
    import flash.text.*; 

sạch xây dựng, và các báo cáo liên kết trông giống hệt nhau. Cùng kích thước, cùng tối ưu hóa, cùng một lớp được liên kết.

Chỉ các lớp Sprite và TextField mới đưa nó vào SWF trong mỗi trường hợp.

Nhìn vào kích thước tệp SWF thực trên đĩa, có vẻ như có sự khác biệt nhỏ (1 hoặc 2 byte) so với 3 phiên bản. Không tồi tệ hơn cho SWF lớn hơn được đề cập trong bài đăng của ryanday.

0

Tôi phát hiện hơn AS3, chỉ cần sử dụng báo cáo nhập sẽ bao gồm các lớp trong đầu ra của bạn, bất kể các lớp đó được tham chiếu trong mã thực tế hay không. Ngược lại điều này với Java, nó sẽ chỉ bao gồm các lớp nếu chúng thực sự được sử dụng, không chỉ đề cập trong các câu lệnh import. Nhưng tôi thấy điều này hữu ích khi thiết kế một API Flash, chỉ đề cập đến các lớp đó trong các câu lệnh nhập khẩu và chúng sẽ được đưa vào.