淺淡代碼產生

來源:互聯網
上載者:User
什麼是代碼產生?
代碼產生,就是Code Generation,想必大家都不會陌生。我們使用Visual Studio等開發工具的時候,很多代碼架構都是自動產生。初步的印象就是,代碼產生可以減少重複工作。但是,如果更加深入的去看,就會看到,其實不僅代碼架構可以自動產生,連編譯器都可以認為是代碼產生器—從進階語言到機器語言(這個過程太自然了,以致於我們已經不認為是代碼產生了)。所以,代碼產生有不同的層次,最低級的是IDE那樣的函數架構,其次是MFC那樣的工程嚮導,再進階的一點應該是 IDL這樣的介面定義語言,再再然後是向微軟提出的DSL(Domain Specific Language)。

為什麼要有代碼產生?
代碼產生的層級,反映了抽象的層級。因為我們有一個很抽象的領域模型,但是與可以執行的代碼中間還有一段很長的過程。如果沒有代碼產生,就需要我們人工不斷的填補這個空白。為了提高我們的開發的效率和速度,必須能快速有效把領域模型轉化為執行代碼,代碼產生於是應運而生。

代碼產生可以有很多層級,因為一個抽象層可能不能一下子到位的轉化到最底層,所以需要分步驟地,先轉換到中間一層,在如此一層層的往下,代碼產生也是在一層層間進行。

最近把想了很久的JSP和XAML給親手實驗了一把,對代碼產生概念的理解又深入了不少。

JSP的代碼產生
1.有一個簡單的html頁面hello.htm,內容如下:
hello world!
這個沒有什麼稀奇的,用IE瀏覽就出個”hello world!”的文字而已。
2.如果我把hello.htm改名為hello.jsp會怎樣?
答案是,用IE瀏覽的時候,還是出”hello world!”的文字,沒有任何變化!
3.但是看問題不能光看錶面啊,我們注意到Tomcat的work的N級子目錄下有了hello_jsp.java和hello_jsp.class兩個檔案。開啟一看:


public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

out.write("hello world!");

現在jsp經過了編譯,以servlet的方式啟動並執行!每次修改.jsp檔案後,tomcat都會重建.java檔案,並編譯成.class然後運行。下次訪問時,沒有更改jsp,就直接運行.class。從而提高了啟動並執行速度,而不再是解釋執行的!服務端指令碼於是同時兼具了編寫簡單和運行快速的特點!

如果在.jsp檔案裡嵌入java程式碼片段呢?那很簡單,就是在out.write()之後的某個位置原樣插入那些程式碼片段!原來這些程式碼片段是運行在這樣的代碼環境裡的!你終於明白什麼對象和方法可以用了吧!

以前看過ASP.NET的代碼,跟Jsp也是類似的原理的代碼產生。

XAML的代碼產生
微軟的WinFX的Avalon,現在叫做Windows Presentation Foundation,用XAML來描述介面布局,而使用Code Behide技術來分離頁面和代碼。等等,XAML不僅僅可以用來描述介面布局,還可以用來定義程式的架構。

一個簡單的視窗描述(mypage.xml)
<Window xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
      xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"
      x:Class="MySpace.MyPage"
      Text="MyPage"
/>

編譯後的代碼產生(mypage.g.cs)
namespace MySpace {
public partial class MyPage: System.Windows.Window, …{
….

因為有Code Behide技術,你可以把代碼寫在另一個檔案裡,不像jsp那樣跟html混在一起(當然Jsp可以通過jsp:useBean等分離代碼)。

Code Behide代碼(mypage.xml.cs)
namespace MySpace {
public partial class MyPage

你看,同一個類在兩個檔案裡定義了!要在以前,這可能是要出問題的!但是,現在微軟居然為了這修改了C#的語言規範,引入了partial class的概念,允許一個類在兩個不同的檔案裡定義!

剛才說過了,XAML不僅僅是介面布局的描述,還可以描述應用程式。比如

定義一個應用程式(myapp.xml)
<NavigationApplication xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
                       xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"
                       x:Class="MySpace.MyApp"
                       StartupUri="a.xaml"
               StartingUp="AppStartingUp">
</NavigationApplication>

產生的程式碼(myapp.g.cs)
namespace MySpace {
public partial class MyApp : System.Windows.Navigation.NavigationApplication {

Code Behide(myapp.xml.cs)
namespace MySpace{
public partial class MyApp

可以看到XAML不僅僅是介面描述語言了,而是一種新的程式模型了,通過聲明的方式來寫軟體,這就是抽象的含義!
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.