国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

淺淡代碼生成

2024-07-21 02:15:12
字體:
來源:轉載
供稿:網友

  什么是代碼生成?

  代碼生成,就是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不僅僅是界面描述語言了,而是一種新的程序模型了,通過聲明的方式來寫軟件,這就是抽象的含義!

中國最大的web開發資源網站及技術社區,
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安国市| 衡山县| 志丹县| 南宁市| 岢岚县| 津南区| 湘阴县| 北票市| 五家渠市| 溧水县| 上虞市| 乌拉特中旗| 连州市| 黎平县| 石嘴山市| 成安县| 门头沟区| 岳西县| 桃源县| 武鸣县| 肇庆市| 富川| 讷河市| 开远市| 通道| 望江县| 泗洪县| 唐海县| 合阳县| 漳州市| 临汾市| 佛坪县| 双流县| 满城县| 铁岭市| 左权县| 太白县| 延寿县| 南汇区| 子洲县| 鹤山市|