質問

コード生成ツールを使用しますか(プロキシの生成に使用されるツールと、Visual Studioに組み込まれたデザイナーから)。

アプリケーションのどの部分を生成しますか?

通常、独自のジェネレーターを使用しますか?その場合、どのタイプのジェネレーターを作成しますか(aspテンプレート、coddomなど)。そうでない場合、どのサードパーティ製ツールを使用しますか?

現在、データベース構造、ビジネスエンティティ、DAL、BLLの生成からすべてを処理するカスタムコードジェネレーターを使用するいくつかの異なるプロジェクトに取り組んでいます。私は他の人々の経験がこの種のツールであることに興味があります。

役に立ちましたか?

解決

私は、コードジェネレーターを「間違っている」と考えている哲学陣営にいます。なぜなら、それらは言語の一部とすべきものを示しているからです。

しかし、コードを書くコードを書くことはプラグマティックプログラマーの倫理の大部分であり、実際には、生成されたコードがデフォルトで隠されている場合、コード生成はうまく機能します。どれだけ哲学的に純粋になりたいとしても、言語は解決したい問題ほど速く進化することはありません。

Visual StudioでWindowsフォームを構築するときに生成されるコードが思い浮かびます。必要に応じて、生成されたコードを見ることができますが、そうしないことをお勧めします。ただし、WPFを使用した宣言型言語への移行は、命令型コードよりもプログラムで宣言型コードを操作する方がクリーンで信頼性が高いため、優れていました。

彼らはLINQ-To-SQLクラスでも同じことを行うべきでした。プロパティのみを持ち、カスタム動作を持たないクラスには、宣言型言語が必要です。おそらく、これらのエンティティクラスを動的にするのが簡単になるでしょう。基になるデータベーススキーマが変更されると自動的に変更されます。

CodeSmithを使用して、データベース内のすべてのテーブルの.NetTiersクラスを生成しようとしましたが、2つの問題が発生しました。

  1. .NetTiersは肥大化し、生成されたコードは膨大でした。コード生成ツールを使用すると、クリープが簡単になります。

  2. スキーマが積極的に開発および改訂されていたため、多くのファイルを再生成する必要があり、すべてのファイルが再生成および置換されていたため、すべてをソース管理に維持することが非常に困難になりました。生成されたコードがソース管理に含まれるべきかどうか がわからないことになりました。

コード生成の最適な場所は、設計段階ではなく、コンパイラまたはビルド段階です。 C#で匿名の型またはメソッドを使用すると、コンパイラーはコード生成をオンザフライで実行します。設計段階でコードを生成すると、基礎となるパラメーターが変更されるたびに再生成する必要がある stuff のチャンクを取得します。

他のヒント

はい、しかしインターンと呼んでいます。

.net / webドメインで作業しているわけではありませんが、さまざまな自家製言語からの自家製コード生成ツールは、開発ツールチェーンの重要な部分です。 2つの主要なツール(文法とパーサーと正式な定義)、およびm4やperlなどのマクロ上に構築された多数のマイナーなツールがあります。これらはすべて、最終的にプレーンCを生成し、ネイティブにコンパイルされます。

ドメイン固有の言語は、私の経験で大規模なソフトウェアを開発するためのプログラマーの生産性にとって重要なツールの1つです。コンパイラー、シミュレーター、または基本言語(通常は移植可能なC、場合によってはC ++を意味する)をまったくサポートしない多くの繰り返しパターンを持つ他の非常に複雑なソフトウェアのようなものを構築する場合は、コード生成ツールが最適です。ドメイン固有の言語を一般化の次のステップと見なします。まず、一般的な計算を関数(または履歴を作成するサブルーチン)に分割し、次にそのような機能が利用可能な場合は共通の関数をテンプレートまたはジェネリックに分割します。より一般的なものを繰り返し、本格的なカスタム言語にコードを繰り返します。

それは、実際に書くコードの量を減らし、面倒な繰り返しや付加価値のないコードをプログラミングプロセスから削除することです。パターンが繰り返されるとすぐに、ドメイン固有の言語を適用してください!

古典的なASP作業(2001年頃)を行っていたときに、独自のジェネレータ(データアクセス、sprocなど)をロールバックし始めました。対処がはるかに簡単だったため、CodeSmithにゆっくりと移行しました。私はまだ、主に.NETコード用にすべてのデータアクセスレイヤータイプのもの(sprocsを含む)を生成していました。

数年前、マクロコード生成(つまりCodeSmith)からマイクロコード生成にジャンプしました。

違いは、CodeSmithを使用すると、アプリ用に大量のコードが生成され、すべてが汎用で、すべてが一度に生成されることです。これは、エッジケースの場合に問題となり、テンプレートのソース(テーブル構造)を変更すると再生成されます。また、使用していないがテンプレートから生成されたキャリングコードの在庫が多い場合もありました。これらの方法はすべて機能しましたか?多分そうでないかもしれません。生成されたコードを入力してクリーンアップすると、膨大な作業が必要になります(つまり、同じコードベースで1年以上経過した後)。

マイクロコード生成では、対照的に、必要なクラスを正確に、適切なシナリオで生成できます。私がこれを行うために使用する主なツールは、ReSharperです。これを行う方法は、実稼働コードを作成する前に単体テストを作成することです。そのシナリオでは、ReSharperはユニットテストをテンプレートとして使用して、実稼働コードのスケルトンを自動生成します。その後は、空白を埋めるだけです。

データアクセスについては、もう何も生成していません。データアクセスレイヤー(つまり、NHibernate)に配置するために使用したすべてのものが、優れたO / R Mに置き換わることがわかりました。それを考えると、私は自分の人生で別のデータアクセス層を記述したり生成したりすることは決してありません(私は拒否します)。

さらに、大規模な単体テストスイートを使用することのメリットなど、

Fog Creek Softwareの社内言語Wasabiにはコンパイル時コードジェネレーターが組み込まれているため、それらを使用して、データベーステーブルにマップするエンティティクラスの内容を自動的に作成します。したがって、1ダースの異なるプロパティとメソッドを持つクラスを作成する代わりに、次のように記述できます。

<ActiveRecord("Kiwi")> _
Class CKiwi
End Class

およびCKiwiには、Kiwiテーブルの基礎となるスキーマで定義されたすべての列のLoad(ix As Int32)、Commit()、およびフィールド/プロパティがあります。巨大なO / R Mライブラリを用意する必要はありませんが、製品にテーブルをすばやく追加できます。

コンパイラの精神でのコード生成は素晴らしいものです。 「ウィザード」の精神でのコード生成一様に悪いアイデアであることが判明しました。

以前はCodeSmithを使用して、NHibernate hbms、エンティティ、その他のいくつかのものを生成していました。しばらくして、このフローにうんざりしたので、流しました。

T4ジェネレーターは無料で、生成のために検討する価値があります。

MonoRailリンクの生成には、引き続きCastle CodeGeneratorを使用します。

  1. 例外にはコードジェネレーターを使用しています
  2. CRUD操作のためのDAOの生成
  3. JAXBを使用してコードを生成する
  4. XDocletを使用してEJBローカル/ホームインターフェイスを生成します
  5. Velocityテンプレートを使用して、ビジネスモデルのドキュメントを生成します
  6. Apache Axisを使用してWSDLスタブを生成します

数か月前に ActiveWriter に会って、とても助けになりました。私が気に入っているのは、このアプローチの柔軟性です。データアクセスの問題を処理する部分クラスを生成し、クラスのビジネス部分をコーディングできます。私は非常に満足しているので、私は多くの労力を節約できます。スキーマを変更し、再生成して続行するのはとても良いことです。

いくつかのタスク用に独自のツールを作成しています。実行するのが楽しいだけでなく、長い目で見れば時間の節約にもなります。 非常に退屈なタスクの場合は、正気が失われます。

自作のコードジェネレーターは、エンドユーザーのスプレッドシートから単体テストケースを構築するのに非常によく機能します。

テストケースを構築するためのツールを参照してください一例。

LLBLGenを使用して、データアクセスレイヤーを作成します。使用するデータベースにジェネレーターを向け、使用するテーブルを選択すると、必要なクラスが大量に生成されます。すべて非常に迅速かつ簡単です。

データベースへのアクセスを管理するコードジェネレーターを社内で構築しています。ストアドプロシージャを記述し、ゲートウェイクラスで抽象化された対応するメソッドを取得します。

また、Flashと適切に連携するためにWebサービスを生成します。つまり、適切な方法で例外を処理します。

最後に、例外のベストプラクティス(コンストラクタのトンなど)の面倒な作業をなくす例外ジェネレータがあります

以前の雇用主では、XMLスキーマ定義ファイル(XSD)を静的C ++ライブラリに変換する自家製のVB.NETアプリケーションがありました。これにより、C ++データ型(bool、std :: stringなど)での作業がはるかに容易になり、興味深いXMLコードはすべて、これらの生成されたクラス内に隠されました。

ここでオフィスでGrailsを使い始めました。以前は、社内のJSF / Hibernate CRUD生成スクリプトのセットがありました。

... Grailsが勝ちました。 Grailsからのコード生成は非常に優れており、コードを実際にコードファイルに配置することなく、約15分でCRUDアプリを実行できます!

もちろん、変更したいときに、実際のコードをコードファイルに生成できます。ほとんどの場合、通常のCRUDでは、ビューを変更するだけで済みます。

これを使用して、さまざまなプラットフォーム(windows、linux、solaris、mac、bsdなど)で再編成できるシリアル化可能なデータオブジェクトを生成しました。これは社内のソリューションでした。

パーサーを作成したデータ形式の専門家がWebフォームから独自のサンプルを送信し、出力を見て、それが正しいかどうかを教えてくれる素敵なツールを作成しました。

それから、jUnitテストが生成されます。ラブリー。

1人のユーザーがそれを使用することに煩わされなかったことを除き、テストケースは収集しませんでした。

他の一部と同様に、データアクセス、HTMLフォーム処理、特定のビジネスロジック操作のために、独自のコードジェネレーター(Inon Datamanager / Viewmanager)も作成しました。これをうまく機能させるための鍵は、生成されたコードに触れたり見たりする必要がないように設計することです。

このようにして、ほとんど言語の一部になります-言語(この場合はJava)は、ドメインモデル仕様とビューモデルを含むように拡張され、その後、実際のJavaコードでカスタムビジネスロジックを入力します。

これにより、基礎となる動作の詳細を設定するJavaの能力を持ちながら、アナリストやビジネスユーザーと通信するための適切なツールが提供されます。

優れたLLBLGENに興味がある場合は、亜音速も評価できます。サブソニックとt4のオーバーラップや相互作用についてロブコネリーが言わなければならないこともあるかもしれません。

Xsltベースのコード生成ツールを作成して使用しました。 http://perfectstorm.codeplex.com/

これは、単一のルートxmlモデルを使用して、dal、procs、tablesを生成します。

私は、Java Script、Action Script、Java、C#、Objective Cなどのいくつかの言語でWebサービスのプロキシクラスを生成するカスタムコード生成フレームワークを作成しました。いくつかのヘルパークラス、コード生成は本当に多くの時間を節約できますが、生成されたコードは可能な限りシンプルであり、過度に使用すべきではないと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top