問題タブ [code-generation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - コードジェネレーターをユニットテストするにはどうすればよいですか?
これは私が知っている難しい自由形式の質問ですが、私はそれを床に投げて、誰かが何か面白い提案があるかどうかを確認したいと思いました。
PythonインターフェイスをC++コード(SWIGを介して生成)に変換し、これをWebServicesとして公開するために必要なコードを生成するコードジェネレーターを開発しました。このコードを開発したとき、TDDを使用して開発しましたが、テストが非常に脆弱であることがわかりました。各テストは基本的に、特定の入力コード(C ++ヘッダー)に対して特定の出力コードを取得することを確認する必要があるため、XML入力ファイルからテスト定義を読み取り、テストを生成する小さなエンジンを作成しました。これらの期待からのケース。
問題は、コードを変更することを恐れていることです。それと、ユニットテスト自体がa:複雑で、b:もろいという事実。
だから私はこの問題への代替アプローチを考えようとしています、そしてそれは私がおそらくそれを間違った方法で取り組んでいることに気づきます。たぶん私は結果にもっと焦点を合わせる必要があります、IE:私が生成したコードは実際に実行され、私が望むように見えるのではなく、私が望むことをしますか?
誰かがこれに似た何かの経験を共有したいと思ったことはありますか?
python - Visual Studio 用の Python コード ジェネレーター?
python .py ファイルを C# プロジェクトに追加し、そのファイルに python ファイルを実行するカスタム ジェネレーターのタグを付けて、出力をコード生成の結果として扱うというアイデアがありました。それを C# ファイルに入れると、ビルド プロセスの一部としてかなり多くのコード生成を行うことができます。
Visual Studio 2008 用のカスタム ジェネレーターが存在するかどうかは誰にもわかりませんか?
database - オブジェクト定義からのデータベース テーブルの生成
既存のデータベース (LINQ to SQL、Hibernate など) を操作するためのデータ アクセス層を作成する (自動) 方法がいくつかあることは知っています。しかし、私は次のようなことに少し疲れてきました(そして、物事を行うためのより良い方法があるはずだと私は信じています):
- Visio でのテーブルの作成/変更
- Visio の「データベースの更新」を使用してデータベースを作成/変更する
- テーブルを「LINQ to SQL クラス」オブジェクトにインポートする
- それに応じてコードを変更する
- コンパイル中
オブジェクト/エンティティ定義からデータベース スキーマを生成する方法についてはどうですか? このようなツールの適切なリファレンスを見つけることができないようです (少なくともいくつかのフレームワークでは、ある種の組み込みサポートが期待されます)。
次のことができれば完璧です。
- オブジェクト定義を変更する
- オブジェクトを操作するコードを変更する
- コンパイル (データベースの変更は自動的に魔法のように行われます)
c# - WMIコード/クラスを生成する方法はありますか?
WMIにアクセスするためのC#クラスをどのように生成しますか?
build-process - 自動ビルドで生成されたコードを管理する最良の方法は?
私の自動化された NAnt ビルドには、(SubSonic を使用して) データベースから大量のコードを生成するステップがあり、コードはデータベース内のスキーマ名と一致するフォルダーに分割されます。例えば:
- /生成コード
- /dbo
- SomeTable.cs
- その他のテーブル.cs
- /abc
- Customer.cs
- Order.cs
- /dbo
スキーマ名は、アプリが必要とする生成されたクラスを分離するためにあります。たとえば、この中央フォルダーから生成されたコードを取得する ABC アプリがあります。次のように、ビルド前のイベントでそれを行っています。
del /F /Q $(ProjectDir)Entities\generated*.cs
copy $(ProjectDir)....\generated-code\abc*.cs $(ProjectDir)Entities\generated*.cs
そのため、すべてのビルドで、Nant スクリプトはジェネレーターを実行し、すべてのコードを中央の保持場所に配置します。次に、ソリューション ビルドを開始します。これには、生成されたクラスを必要とする各プロジェクトのビルド前イベントが含まれます。
だからここに私が見ている摩擦があります:
1) 新しいアプリごとに、このビルド前イベントをセットアップする必要があります。これをしなければならないのはちょっと面倒です。
2)ビルドサーバーではコードを生成しないため、実際にはこれらの各コマンドの前に IF $(ConfigurationName) == "Debug" があるため、リリースビルドでは発生しません
3) コマンドが失敗し、ローカル ビルドが失敗することがあります。次の場合は失敗します: - 生成されたコードがまだない (新しいプロジェクトをセットアップしただけで、データベースがまだない) - ディレクトリに既存のコードがない (最初のビルド)
通常、これらはマイナーな修正であり、新しいプロジェクトまたは新しいマシンをビルドで起動して実行する方法をハッキングしただけですが、ワンクリック ビルドの涅槃を妨げています。
ですから、もう少し耐久性があるところでこれを改善する方法についての提案を聞きたいです。アプリケーション フォルダへのコードのコピーを NAnt スクリプトに移動することはできますか? これは私にはちょっと後ろ向きに思えますが、私はその議論に喜んで耳を傾けます。
OK、発射してください:)
c# - C# クラスからデータベース テーブルを生成するにはどうすればよいですか?
特定のクラスのデータベース テーブルを自動生成する方法を知っている人はいますか? パーシスタンス レイヤー全体を探しているわけではありません。既に使用しているデータ アクセス ソリューションがありますが、突然、多数のクラスから大量の情報を保存する必要があり、作成する必要がありません。これらすべてのテーブルを手作業で。たとえば、次のクラスがあるとします。
私は次のSQLを期待しています:
また、複合型をどのように処理できるのかも疑問に思っています。たとえば、前に引用したクラスで、次のように変更した場合:
どうすればこれを処理できますか?
リフレクションを使用して自分でデータベース スクリプトを自動生成して、各クラスのプロパティを列挙しようとしましたが、扱いにくく、複雑なデータ型に困惑しました。
language-agnostic - 生成されたコードは人間が読める必要がありますか?
インターフェイスとそのインターフェイスを実装するいくつかのクラスのソース コードを生成するツールに取り組んでいます。私の出力は特に複雑ではないので、出力を通常のコード形式の標準に準拠させることは難しくありません。
しかし、これは私に考えさせました:自動生成されたコードは人間が読める程度である必要がありますか? 生成されたコードを人間が簡単に読み取って理解できるようにするために、いつ余分な努力を払う必要がありますか?
私の場合、生成しているクラスは基本的に、ビルドの別の部分に関連するデータのコンテナであり、データを取得するメソッドを備えています。クラス自体のコードを見る必要はありません。クラスが提供するさまざまな getter を呼び出すだけで済みます。したがって、コードが「クリーン」で、適切にフォーマットされていて、人間が簡単に読み取れるかどうかは、おそらくそれほど重要ではありません。
しかし、単純なロジックが少量以上含まれるコードを生成するとどうなるでしょうか?
language-agnostic - コード ジェネレーター vs. ORM vs. ストアド プロシージャ
これらのソフトウェア アーキテクチャのそれぞれが、どの分野で優れているか、または失敗するか?
どちらかを選択するよう促す重要な要件はどれですか?
優れたオブジェクト指向コードと優れたデータベース開発を行える開発者がいると仮定してください。
また、聖戦は避けてください :) 3 つのテクノロジにはすべて長所と短所があります。
visual-studio - Visual Studio で複数のゲッター/セッターまたはアクセサーを自動生成する方法
始める前に、この投稿があり、私の質問に答えていないことを知っています: Visual Studio でゲッターとセッターを生成する方法は?
Visual Studio 2008 では、プライベート変数を右クリックしてゲッターとセッター (アクセサー) を自動生成する機能があります -> リファクタリング -> フィールドのカプセル化...
これは、2 つまたは 3 つのメソッドを持つクラスには最適ですが、MS に来てください! いくつかのアクセサーを持つクラスを操作したことがありますか?
数回クリックするだけで ALL を生成する方法を探しています (Eclipse 関係者は、私が話していることを知っているでしょう。クラスを右クリックして、[アクセサの生成] を選択します。完了)。クラスでウィザードをクリックするのに 20 分も費やすのは本当に好きではありません。以前は、クラスを生成する .NET 1.0 コードがいくつかありましたが、それはとうの昔になくなっており、この機能は IDE の標準になるはずです。
更新: Linq to Entities と SQLMetal が本当にクールなアイデアであり、上記の段落での私の単純な要求をはるかに超えていることがわかったと言及するかもしれません。
garbage-collection - gcなしでクロージャーを実装するには?
言語を設計しています。まず、生成するコードを決定します。この言語には、レキシカル クロージャと、javascript に似たプロトタイプ ベースの継承があります。しかし、私は gc のファンではないので、できる限り避けようとしています。質問: スタック フレームをヒープに割り当ててガベージ コレクターに任せずにクロージャーを実装するエレガントな方法はありますか?
私の最初の考え:
- 参照カウントを使用し、サイクルをガベージ コレクションします (これはあまり好きではありません)。
- スパゲッティ スタックを使用します (非常に非効率に見えます)。
- クロージャの形成を一部のコンテキストに制限して、リターン アドレス スタックとローカル スタックを回避できるようにします。
高級言語を使用したり、呼び出し規約に従ったりしないので、好きなだけスタックを粉砕できます。
(編集:参照カウントがガベージコレクションの一種であることは知っていますが、より一般的な意味でgcを使用しています)