Hình 7 Cu trúc cây – Nút con

Một phần của tài liệu sinh source code theo giao diện tự động (Trang 32 - 41)

M cđ chun hóa cao vi tính nng này tuy cơng ngh laszlo phát trin mi cho th h web hin đi nh ng đi v i ngi lp trình s làm quen nhanh chóng d a

Hình 7 Cu trúc cây – Nút con

HU

TE

CH

C u trúc cây là khái ni m quan tr ng đ c s d ng trong CodeDOM. M i m t đ i t ng trong mã ngu n đ c bi u di n nh m t nút c a cây.

Xây d ng đ th CodeDOM

HU

TE

CH

SV Khóa 2001 – Khoa Cơng Ngh Ph n M m Page 28 of 80 using System; using System.Drawing; using System.Collections; using System.ComponentModel; CodeNamespaceImport namespace SamplesNamespace { } CodeNamespace

public class Samples : System.Windows.Forms.Form {

}

CodeTypeDeclaration

private System.Windows.Forms.Button button1;

private System.ComponentModel.Container components = null; private int _numOfStep;

CodeMemberField public Samples() { } get { return this._numOfStep;} public virtual int NumOfStep { } this.InitializeComponent(); CodeConstructor CodeStatement CodeMemberProperty set {this._numOfStep = value;} CodeStatement CodeStatement Hình 8 Kh o sát mã ngu n đ t o đ th CodeDOM

HU

TE

CH

Trong hình trên, ta thy m i thành ph n mã ngu n đ c CodeDOM bi u di n b ng m t l p t ng ng. Namespace đ c bi u di n b i l p CodeNamespace, l p đ c bi u di n b ng CodeTypeDeclaration, hàm dng là CodeConstructor, các

câu l nh là CodeStatement, khai báo các bi n c a l p là CodeMemeberField, …

C u trúc đ th CodeDOM có th đ c minh h a nh sau: CodeCompileUnit CodeNamespace Class CodeNamespaceImport CodeT ypeDeclaration Struct Interface Enumeration CodeT ypeMember Consrtuctor Method Field Property Event CodeStatement Hình 8 C u trúc đ th CodeDOM

HU

TE

CH

SV Khóa 2001 – Khoa Cơng Ngh Ph n M m Page 30 of 80

3.2.2 S d ng CodeDOM

Sinh mã ngu n trang Code-behind

sinh mã ngu n cho trang Code-behind, ta c n t o m t đ th CodeDOM và s d ng hai namespace sau:

System.CodeDom đ nh ngh a các ki u (type) dùng đ trình bày c u trúc logic c a mã ngu n, không ph thu c m t ngơn ng l p trình c th nào.

System.CodeDom.Compiler đ c s d ng đ sinh ra mã ngu n t đ th CodeDOM và biên dch mã ngu n (h tr các ngôn ng C#, JScript, Vb.NET) G c c a đ th CodeDOM là CodeCompileUnit, bi u di n cho m t project hay m t assembly. T t c m i thành ph n mã ngu n khác đ u ph i đ c liên k t v i nhau và có g c chung là CodeCompileUnit.

Minh h a cách s d ng CodeDOM đ sinh mã ngu n:

T o đ th CodeDOM:

//T o g c c a đ th

CodeCompileUnit unit = new CodeCompileUnit();

//T o using namespace

CodeNamespace codeUsing = new CodeNamespace();

codeUsing.Imports.Add(new CodeNamespaceImport("System"));

//T o namespace đ ch a l p

CodeNamespace samplesNamespace = new CodeNamespace("SamplesNamespace");

//Nút con namespace đ c thêm vào g c

unit.Namespaces.Add(codeUsing);

unit.Namespaces.Add(samplesNamespace);

HU

TE

CH

CodeTypeDeclaration myClass = new CodeTypeDeclaration ("Samples"); type1.IsClass = true;

type1.BaseTypes.Add("System.Windows.Forms.Form");

samplesNamespace.Types.Add(type1);

//Thêm khai báo bi n vào l p CodeMemberField button = new

CodeMemberField(typeof(System.Windows.Forms.Button), "button1");

myClass.Members.Add(button);

//Thêm hàm d ng vào l p

CodeConstructor constructor = new CodeConstructor(); constructor.Attributes = MemberAttributes.Public;

myClass.Members.Add(constructor);

//Thêm ph ng th c InitializeComponent vào l p

CodeMemberMethod initMethod = new CodeMemberMethod(); initMethod.Name = "InitializeComponent";

myClass.Members.Add(initMethod);

//G i ph ng th c InitializeComponent trong hàm d ng

constructor.Statements.Add(new CodeMethodInvokeExpression(

new CodeThisReferenceExpression(), "InitializeComponent"));

Sinh mã ngu n:

Sau khi đã có CodeCompileUnit, cn t o m t CodeDomProvider đ phát sinh mã ngu n. N u mu n sinh mã C#, ta chn CsharpCodeProvider, hay ch n VBCodeProvider đ sinh mã VB.NET.

CodeDomProvider provider;

if (language == "CSHARP")

provider = new CSharpCodeProvider();

HU

TE

CH

SV Khóa 2001 – Khoa Cơng Ngh Ph n M m Page 32 of 80 provider = new VBCodeProvider();

StringWriter sw = new StringWriter();

ICodeGenerator generator= provider.CreateGenerator(); generator.GenerateCodeFromCompileUnit(unit, sw, new CodeGeneratorOptions());

Mã ngu n đ c sinh ra nh sau:

C#

using System;

namespace SamplesNamespace

{

public class Samples : System.Windows.Forms.Form

{

private System.Windows.Forms.Button button1;

public Samples()

{

this.InitializeComponent();

}

private void InitializeComponent()

{ } } }

}

VB.NET

Option Strict Off Option Explicit On Imports System

Namespace SamplesNamespace

HU

TE

CH

Inherits System.Windows.Forms.Form

Private button1 As System.Windows.Forms.Button Public Sub New()

MyBase.New()

Me.InitializeComponent() End Sub

Private Sub InitializeComponent() End Sub

End Class

End Namespace

3.2.3 ánh giá gi i pháp

u đi m

. D a vào c u trúc cây đ phát sinh mã ngu n, vì v y mã ngu n đ c sinh ra có th b t kì m t ngơn ng nào (C#, VB.NET…) n u ngơn ng này có h tr đ c t CodeDOM.

. Các ch ng trình đ c t o ra, biên d ch và th c thi đ ng th i gian ch y.

Cho phép bi u di n c u trúc mã ngu n trong b nh b ng mơ hình các đ i t ng đ c l p v i ngơn ng l p trình.

. Trong t ng lai, có th m ra kh n ng “d ch” mã ngu n đ c vi t b ng ngôn ng này sang ngôn ng khác. (Ch ng h n mã ngu n vi t b ng C# đ c “d ch” ra thành d ng vi t b ng VB.NET).

H n ch

Ch a h tr nh ng tr ng h p sau: 1.

HU

TE

CH

SV Khóa 2001 – Khoa Cơng Ngh Ph n M m Page 34 of 80 {

public void MyClass {

} } }

namespace MyNamespace2 {

using MyAlias = MyNamespace.MyClass;

public void MyClass2 : MyAlias { } } 2. namespace OutterNamespace { namespace InnerNamespace {

public void MyClass {

} } } }

3. Khai báo danh sách bi n namespace MyNamespace {

public void MyClass {

public void MyClass() {

int i,j,k;

} } } }

4. khái ni m "unsafe" trong C#. class MyUnsafeClass

{

unsafe static void MyPointerFn(int* ptr)

{

*p *= *p; }

unsafe public static void main()

{

//unsafe operation using address-of operator &

int i = 10; MyPointerFn(&i);

HUTE

Một phần của tài liệu sinh source code theo giao diện tự động (Trang 32 - 41)

Tải bản đầy đủ (PDF)

(111 trang)