私はperlCGIで実行されている大きなWebアプリケーションを持っています。正常に動作しており、よく書かれていますが、過去に行われたように、すべてのhtmlはCGI呼び出しでハードコードされているため、想像できるように、管理や改善などが困難です。テンプレートを追加し、フレームワーク(catalystまたはCGI :: application)と統合します。私の質問は:ここの誰かがそのような経験をしていますか?注意しなければならないことがありますか?両方のフレームワークでネイティブCGIスクリプトを実行できることを認識しているので、トラウマなしで両方(CGIネイティブ広告の「フレームワーク」コード)を一緒に実行できるので便利です。任意のヒント?
5 に答える
最初にテストを記述します (たとえば、 を使用Test::WWW::Mechanize
)。次に、何かを変更すると、何かが壊れているかどうか、何が壊れているのかが常にわかります。
次に、HTML をテンプレートに抽出し、一般的に使用されるサブをモジュールに抽出します。その後、フレームワークに切り替えるのは簡単です。
一般に、アプリケーションが常に機能するように、段階的に進めてください。
CGIスクリプトの処理ロジックからHTMLを取り出します。これらはテンプレート変数になる候補であるため、HTML出力に影響を与えるすべてのコードを特定します。それをHTMLファイルに分割し、識別された部分をテンプレート変数でマークします。最終的には、すべての処理がコードの開始時に実行され、HTMLテンプレートがすべての処理の終了時に呼び出されるように、ページをリファクタリングできるようになります。
フレームワークが行う前提の1つは、URLがコードにマップされることです。たとえば、フレームワークでは、次のように表示されることがよくあります。
http://app.com/docs/list
http://app.com/docs/view/123
通常、古いCGIスクリプトはそのようには機能しませんが、次のようなものになる可能性が高くなります。
http://app.com/docs.cgi?action=view&id=123
フレームワークを利用するには、すべてのURLを変更する必要があるかもしれません。これを実行できるかどうか、および古いリンクを機能させ続ける方法は、決定の大部分を占める可能性があります。
また、フレームワークは、データベース呼び出しを抽象化し、オブジェクトのみを処理できる、ある種のORM(オブジェクトリレーショナルマッパー)のサポートを提供します。これはCatalyst
通常DBIx::Class
です。これに切り替えるためのコストを評価する必要があります。
古いコードを参照プラットフォームとして使用して、完全に書き直したいと思うかもしれません。これは、予想よりもはるかに少ない作業である可能性があります。ただし、いくつかのおもちゃのサイトから始めて、どのフレームワーク/orm/テンプレートを使用するかを判断してください。
このような状況では、基本的にゼロから書き直し、古いコードは A) テスト、B) 設計の詳細に役立ちます。理想的には、複製したいすべての基本機能に対して一連のテストを作成するか、少なくとも最終結果ページを解析するテストを作成して、新しいコードが同じ入力に対して同じ情報を返していることを確認できるようにします。
フレームワークが自動的に処理する量によっては、コード内の設計の詳細が役に立たない場合があります。適切な一連のテストがあり、単純な変換がうまく機能する場合は、完了です。新しいものの動作が古いものと一致しない場合は、おそらく「なぜ?」をさらに深く掘り下げる必要があります。それは一見奇妙なもので、一見すると意味をなさないでしょう。
最初に覚えておくべきことの 1 つは、使用しているフレームワークで誰かが似たようなものを作っていないか調べることです。多くの時間とお金を節約できます。
Perl の代わりに Python を使用して行った方法を次に示しますが、それは問題ではありません。
- HTML とコードを個別のファイルに分離しました。そのためにテンプレートエンジンを使用しました。
- 一連のパラメーターを使用してテンプレートをレンダリングするコードから関数を作成しました。
- 関数( Django に触発されてビューと呼んでいます) を賢明な方法で整理しました。(管理者ビュー、ユーザー ビューなど)ビューはすべて同じ呼び出し規則に従います。
- ビューにビュー固有のコードのみが含まれるように、データベースとリクエストのものをリファクタリングしました(読み取り: GET、POST リクエストなどを処理しますが、低レベルのものは何もありません!)。そのために既存のライブラリに大きく依存していました。
私は今ここにいます。:-) もちろん、次の明らかなステップは次のとおりです。
- URLをビューにマップするディスパッチャーを作成します。これにより、より適切な URL と、より適切な 404 およびエラー処理ももちろん実現されます。