生成されたコードのクリーンアップ:リファクタリングまたはマップ?


8

環境:

最近、XSD.exeによって生成されたクラスファイルを処理する必要がありました。ばかばかしく冗長なクラス/変数名(someRidiculouslyLongPrefixThenMaybeOneThingUniqueAtTheEnd一見するとと比較するのは難しいと思いますsomeRidiculouslyLongPrefixThenMaybeOneOtherThingChanged)と注釈がいたるところにあり、長さが3500行でした。結論として、一体何が起こっているのかを理解するのに私は年齢を重ねました。私はそれを読んで、自分の名前を何かの隣に置くことは決してないと思ったので...

質問:

1)生成されたコードをいじる(つまり、クリーンにする)ことは悪い習慣ですか。

2)生成されたクラスを自分の素敵でクリーンなクラスにマップするマッパーを作成することをお勧めします(これで、とても楽しく作業できます)。

編集:

すべてのコメントをありがとう。

実際に何か面白いことをするつもりだった場合(つまり、トランスポートオブジェクト以外のドメインオブジェクトがあった場合)、それらを「よりクリーンな」クラスにマップすると思います。それらのうちの一種の機能。この場合、クラスは事実上DTOであるため、おそらく名前が対応する要素と一致することは理にかなっています。述べたように、私はそれに触れる必要はありません-処理のためにデータを別のレイヤーに渡す前に、アクセサー/ミューテーターを呼び出すだけです。

今のところ、私はそれらを一人にしておくと思います。


生成されたコードを(変更はもちろん)確認する必要があるのはなぜですか。コードジェネレーターのデバッグは別として、そうではないようです。

それらはクラス定義でした。:|
トムトム

2
ええ、それはわかりますが、生成されたという事実は、だれも(おそらく、コードジェネレーターの作成者を救うため)生成されたコードを見る必要がないことを意味します。それを呼び出してください、はい(クラス/メソッドの名前があなたを怒らせるなら、醜さを分離するアダプターを書くことはできませんか?)、しかしそれを見ないでください。

xsd-でこれとまったく同じ問題が2
jkで発生しました。

ポイントを取った、デルナン。汚くならないように名前を扱います。結局、私はそれらを書きませんでした。
トムトム

回答:


14

生成されたコードをリファクタリングして整理して整理することの危険性は、自分または別の開発者がツールによって再度生成された場合、変更が失われることです。

あなたのチームは、別のファイルでコードを生成し、それをクリーンなバージョンにコピーし、リファクタリングを行って変更を適用するだけの時間とリソースを必要とする位置にいる可能性があります。(私はEntity Frameworkのオリジナルバージョンを使用してきました。)

生成された名前を使用できない場合は、生成元を変更するか、#2で提案されているようにしてください。


4
生成されたコードを編集する必要があるのは、確実に再作成する必要がない場合だけです。手動の編集に依存して再生成する必要がある場合、途中で何かが確実に失われます。
マイケルコーン2013年

メンテナンスのオーバーヘッドは間違いなく取引の妨げになります-ありがとう。
トムトム

1
@MichaelKohneそれから3週間後、要件はほんの少し変わっただけです。= P
イズカタ2013年

10

原則として、生成されたコードには触れないでください。これを行うと、二度と生成されないことを約束することになります。そうしないと、行ったすべての変更をやり直す必要があります。生成されたコードをより見栄えよくしたい場合は、コード生成とクリーンアップの両方を自動化する必要があります。たとえば、XMLファイルをどこかに生成する場合xmlindent、ビルドプロセスの一部として実行することができます。

同様の理由で、生成されたコードはソース管理に属しません。データとルールをソース管理下に置き、ビルドスクリプトにコード生成を処理させます。

生成されたコードへの変更は、コードジェネレーターを通過する必要があります。つまり、生成されたコードの外観を変える場合は、コードジェネレーターの入力、コードジェネレーター自体を変更するか、スクリプト可能な後処理を適用します。ただし、手動で編集しないでください。

例外は「足場」スタイルのコードジェネレーターです。ジェネレーターを1回実行すると、さらに構築するためのスケルトンが提供されます。これらを使用すると、同じファイルに対してジェネレータを再度実行することはないため、生成されたファイルを通常のソースファイルとして扱い、ジェネレータからのものであることを忘れます。


興味深い点RE:ソース管理/構築プロセス。うーん。(申し訳ありませんが、まだ+1できません-新しいアカウントを作成する必要がありました:$)
Tom Tom

ただし、生成されたコードを作成するのに非常にコストがかかる場合があることに注意してください。たとえば、それがデータベースをスキャンしていて、大規模なデータベースがある場合、新しいチェックアウト/ブランチ/何かを行うことにするたびにそれを行う必要はないかもしれません
Earlz

3

@NikolaiDante(+1)の回答に完全に同意します。

dotnet / c#には、「部分クラス」の概念があります。「使用するクラス」のソースコードは、生成された部分と手動で追加/編集された部分の2つの個別のファイルで構成されます。APIの美化は、コードジェネレーターによって上書きされない「手動」ファイルに組み込まれます。

java / hybrisの世界では、none-generated-codeの継承を使用します。

たとえば、「GeneratedCustomer」から継承した「api-beautifications」を持つクラスCustomerがあります。


これは興味深い解決策ですが、メンテナンスのオーバーヘッド(生成されたコードの変更ごとにラッパークラスを作成/更新する)の領域にとどまることを恐れています。しかし、ありがとう!
トムトム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.