コード生成アプローチ

前回の記事では、実際の製品でコード生成がどのように使用されるかを見てきました。

この記事では、どのコード生成アプローチが私たちの生活を楽にしてくれるかを見ていきます。



コード生成



コード生成は、特定のデータに基づいてコードを生成するプロセスです。



いくつかの分野を強調したいと思います



高レベルのコード生成



このアプローチにより、シンプルで直感的なコードに基づいて低レベルのコードを取得できます。 このアプローチは、抽象化の維持に役立ちます。 ソースコードが記述されている言語は、生成されるコードの言語と一致しない場合があります。



たとえば、私たちはいくつかの独自の言語でサイトを書いています。 サーバー上にはPHPがあります。 理論的にどの世代が可能か見てみましょう。

user = Users.find(5);

user.lastActivity = DateTime.Now;

user.save();


MySQLを使用するようにサイトを構成し、出力で同様のコードを取得できます。

$ user_query = mysql_query( 'SELECT * FROM `users` WHERE` id` = 5'$ mysql_connection );

$ user = mysql_fetch_assoc( $ user_query );

mysql_query( 'UPDATE` users` SET `lastActivity` =' .time()。 'WHERE` id` ='$ page [ 'id' ]、 $ mysql_connection );


コードジェネレーターがスマートであれば、次のようなものを生成できます。

mysql_query( 'UPDATE` users` SET `lastActivity` =' .time()。 'WHERE` id` = 5'$ mysql_connection );


突然、MySQLを使用しないことにしましたが、たとえば、ファイルへの直接書き込みを使用する場合、コードは次のようになります。

$ user_list = unserialize( file_get_contents'users.txt' ));

foreach$ user_list as $ current_user

{

if$ current_user- > id == 5

{

$ user = $ current_user ;

休憩 ;

}

}

$ user-> lastActivity = time();

file_put_contents( 'users.txt' 、シリアル化( $ user_list ));




別の例。 私たちは自分の言語で書きます:

deletedRowsCount = query:id> 5のmyTableから削除します;


MySQLを使用する場合、次のコードを取得できます。

$ query = mysql_query( 'DELETE FROM `myTable` WHERE` id`> 5'$ mysql_connection );

$ deletedRowsCount = mysql_affected_rows( $ mysql_connection );


ファイルを使用する場合、次のコードを取得できます。

$ deleteRowsCount = 0 ;

$ myTable_list = unserialize( file_get_contents'myTable.txt' ));

foreach$ myTable_list as $ key_myTable => $ current_myTable

{

if$ current_myTable- > id> 5

{

設定解除$ myTable_list [ $ key_myTable ]);

$ deletedRowsCount ++;

}

}

file_put_contents( 'myTable.txt' 、シリアル化( $ myTable_list ));




コード例は完璧ではありませんが、コード生成のデモンストレーションの仕事をします。



また、この原理で動作する実際のコードジェネレーターの動作の例を示したいと思います。 これはLINQコードジェネレーターです。



ソースコード:

byte [] source = new byte [] {1、5、7、4、3、9、8、2、6};

var dest = from n from source where n> 5 select n;




結果のコード:

IEnumerable < byte > dest = Enumerable .Where < byte >( new byte [] { 1、5、7、4、3、9、8、2、6 }、 new CS $ <> 9__CachedAnonymousMethodDelegate1 (Main_b__0));



デリゲートも生成されます:

[ CompilerGenerated ]

private static Func < bytebool > CS $ <> 9__CachedAnonymousMethodDelegate1 ;


そして方法:

[ CompilerGenerated ]

private static bool Main_b__0( バイト n)

{

return (n> 5 );

}




メタデータの生成



このアプローチにより、データ構造(メタデータ)の記述に基づいてデータ操作コードを作成できます。 たとえば、MySQLデータベースがあります。 データベースを操作するためのエンティティを生成したい。 データベース構造の最も単純なデータは簡単に取得できます。

show tables;

+---------------+

| Tables_in_gen |

+---------------+

| users |

+---------------+



describe users;

+-------+--------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+--------------+------+-----+---------+----------------+

| id | int(11) | NO | PRI | NULL | auto_increment |

| name | varchar(100) | YES | | NULL | |

+-------+--------------+------+-----+---------+----------------+







これから、プリミティブなユーザー情報ストレージクラスを生成できます。

クラス User

{

パブリック $ id ;

パブリック $名 ;

}




考えてみると、select、update、insert、deleteメソッドを実装できます。 将来的には、同様のコードジェネレーターに遭遇し、そのようなコードジェネレーターの開発も検討します。



パターンベースのコード生成



これは、コード生成に対するシンプルで日常的なアプローチの1つです。 そのようなシステムの例はSmartyです。 このシステムは、主にテンプレートに基づいてHTMLコードを生成するために使用されます。 実験中に、PHPおよびC#コードを生成しました。



たとえば、特定のソース$ sourceにフィールドのリストがあり、それに基づいてプロパティを持つクラスを作成する必要があります。



テンプレートは次のように取得できます。

クラス MyClass

{

{{foreach from = $ source item = name}}

public $ {{$ name}} ;

{{/ foreach}}

}



そして、 $ source = array'width''height''name' )を取得すると:

クラス MyClass

{

パブリック $幅 ;

パブリック $高さ ;

パブリック $名 ;

}





次の記事では、コード生成を使用して複雑さを管理する方法について説明します。



All Articles