2010-03-24 25 views
7

Các phiên bản mới hơn của ColdFusion (Tôi tin CF 8 và 9) cho phép bạn tạo các cấu trúc với ký hiệu chữ tương tự như JSON.ColdFusion structs Phân công trực tiếp vs đối tượng chữ ký hiệu

Câu hỏi của tôi là, có những lợi ích cụ thể (hiệu quả thực hiện có thể) để sử dụng ký hiệu chữ đối tượng trên từng bài tập riêng lẻ cho dữ liệu về cơ bản là tĩnh không?

Ví dụ:

Với bài tập cá nhân bạn sẽ làm một cái gì đó như thế này:

var user = {}; 
user.Fname = "MyFirstnam"; 
user.Lname = "MyLastName"; 
user.titles = []; 
ArrayAppend(user.titles,'Mr'); 
ArrayAppend(user.titles,'Dr.'); 

Trong khi với literals đối tượng bạn sẽ làm điều gì đó như thế nào.

var user = {Fname = "MyFirstnam", 
      Lname = "MyLastName", 
      titles = ['Mr','Dr']}; 

Bây giờ ví dụ hạn chế này là phải thừa nhận là đơn giản, nhưng nếu tiêu đề là một mảng của cấu trúc (Say một loạt các địa chỉ), các ký hiệu đen trở nên vụng về để làm việc với.

Trả lời

4

Trước khi thử mọi thứ, tôi nghĩ ngay rằng các chữ sẽ nhanh hơn, khi bạn tạo mọi thứ bạn cần trong thời gian chạy và không cần lãng phí thời gian tạo biến, sau đó gọi các hàm để nối thêm và tất cả.

Sau đó tôi đã viết một bài kiểm tra nhỏ để tạo biểu đồ có kết quả. Bạn đã cho tôi tò mò có :-)

Kết quả chứng minh rằng tôi đã đúng, như đồ thị cho thấy một sự khác biệt đáng kinh ngạc như bạn có thể thấy: alt text http://i44.tinypic.com/jiz8lw.jpg

Nhưng hãy nhớ rằng mặc dù người ta sẽ nhảy và đi với ký hiệu chữ, Tôi nghĩ rằng điều quan trọng cần nhớ là ký hiệu chữ có thể khó xử, và hầu như mọi lúc sẽ gây nhầm lẫn hơn. Rõ ràng, nếu bạn đang phát triển một trang thực sự cần tăng tốc, ký hiệu chữ là những gì bạn đang tìm kiếm, nhưng hãy lưu ý rằng đôi khi trên CF8, nó sẽ tạo ra một số hành vi lạ lùng.

Chỉ cần để cho bạn thấy những loại xét nghiệm tôi chạy:

<cfset aLiterals = arrayNew(1) /> 
<cfset aDirect = arrayNew(1) /> 

<cfsilent> 
    <cfloop from="1" to="10000" index="mm"> 

     <!--- LITERAL ---> 
     <!--- start timer ---> 
     <cfset start = getTickcount() /> 
     <cfloop from="1" to="1000" index="ii"> 
      <cfset user = {Fname = "MyFirstnam", Lname = "MyLastName", titles = ['Mr','Dr']} /> 
     </cfloop> 
     <!--- end timer ---> 
     <cfset end = getTickCount()> 

     <!--- Display total time ---> 
     <cfset total = end-start> 
     <cfset arrayAppend(aLiterals,total) /> 

     <!--- DIRECT ---> 
     <!--- start timer ---> 
     <cfset start1 = getTickcount() /> 
     <cfloop from="1" to="1000" index="jj"> 
      <cfset user = {} /> 
      <cfset user.Fname = "MyFirstnam" /> 
      <cfset user.Lname = "MyLastName" /> 
      <cfset user.titles = [] /> 
      <cfset ArrayAppend(user.titles,'Mr') /> 
      <cfset ArrayAppend(user.titles,'Dr.') /> 
     </cfloop> 

     <!--- end timer ---> 
     <cfset end1 = getTickCount()> 

     <!--- Display total time ---> 
     <cfset total1 = end1-start1> 
     <cfset arrayAppend(aDirect,total1) /> 
    </cfloop> 
</cfsilent> 

<!--- The cfchart ---> 
<cfchart format="png" xaxistitle="function" yaxistitle="Loading Time (in secs.)"> 
    <cfchartseries type="bar" serieslabel="literal"> 
     <cfchartdata item="literal" value="#arrayAvg(aLiterals)#"> 
    </cfchartseries> 
    <cfchartseries type="bar" serieslabel="direct"> 
     <cfchartdata item="direct" value="#arrayAvg(aDirect)#"> 
    </cfchartseries> 
</cfchart> 

Hy vọng điều này sẽ giúp bạn.

+0

Tuyệt vời! Chính xác những gì tôi đang tìm kiếm. Cảm ơn. –

+0

Lưu ý cho quan tâm: đối với sự khác biệt Railo 3.1.2 là nhỏ hơn một chút, nhưng vẫn đáng kể. – Sergii

+0

Bạn không so sánh táo với táo. Có lẽ trong vòng lặp thứ hai, hãy thử sử dụng ký pháp kết hợp mảng, và sau đó chạy lại kiểm tra hiệu suất. Ví dụ: '' – yfeldblum

4

Ký hiệu chữ viết là lập trình khai báo chứ không phải lập trình thủ tục.

Với ký hiệu chữ, bạn cho máy tính biết bạn muốn gì rõ ràng và chỉ trong một bước. Không có ký hiệu chữ, bạn xây dựng những gì bạn muốn từ từ, từng mảnh một và không rõ ràng.

Lưu ý rằng ký hiệu chữ trong CF8 rất khó xử và thiếu sót, tốt nhất. Nó hiếm khi được sử dụng, và sau đó chỉ trong trường hợp đơn giản. Các ký hiệu chữ trong CF9 là tốt.

Đối CF8, bạn có thể xác định những người giúp đỡ:

Và sử dụng chúng như vậy:

var user = $S(
    Fname = "MyFirstnam", 
    Lname = "MyLastName", 
    titles = $A('Mr', 'Dr') 
); 

Những người giúp đỡ làm việc tất cả các thời gian, giữ gìn trường hợp chìa khóa struct (phím struct không chỉ đơn giản là uppercased nhưng được sắp xếp khi bạn gõ chúng), và làm tổ đệ quy mà không bị ràng buộc.

+0

Cảm ơn. Tôi hiểu sự khác biệt, tôi quan tâm nhất nếu có một lợi thế đặc biệt đối với ký hiệu chữ của đối tượng để bù đắp các cạm bẫy cú pháp (dấu ngoặc/dấu phẩy) cho dữ liệu tĩnh có thể dễ dàng thực hiện theo cả hai cách. –

+0

Như tôi đã đề cập ở đầu, ký hiệu chữ là lập trình khai báo, trong đó lập trình viên thể hiện ý định của mình ngắn gọn và rõ ràng. Trong lập trình thủ tục, lập trình viên được giảm xuống để xác định cách xây dựng các cấu trúc dữ liệu một cách ploddingly và từng bước, và không thể diễn tả ý định của mình một cách súc tích và rõ ràng. Phần còn lại của bài viết là một làm rõ về ký hiệu chữ và việc sử dụng nó trong CF8 so với CF9. Mặc dù một người có thể không quen thuộc với nó hoặc không được sử dụng nó mà không thực hành, cú pháp không phải là một cạm bẫy - cú pháp giải phóng lập trình thay thế. – yfeldblum

Các vấn đề liên quan