問題タブ [legacy-code]
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++ - レガシー コード「ヘッダー スパゲッティ」のクリーンアップ
非常に遅いコンパイル時間 (Linux/Unix) の原因となっている「ヘッダー スパゲッティ」をクリーンアップするための推奨される方法はありますか?
GCCで「#pragma once」に相当するものはありますか?
(これに関して矛盾するメッセージが見つかりました)
ありがとう。
legacy-code - 複数のシステムを統合するにはどうすればよいですか?
私が働いている場所では、過去数十年にわたってかなりの数のシステムが作成されており、それらを維持しています。
システムは多様であり、複数のオペレーティングシステム(Linux、Solaris、Windows)、複数のデータベース(oracle、sybase、mysqlのいくつかのバージョン)、さらには複数の言語(C、C ++、JSP、PHP、およびその他のホスト)があります。使用済み。
同じデータを複数のシステムに入力するという犠牲を払っても、各システムはかなり自律的です。
経営陣は最近、すべてのシステムが互いに楽しく通信し、データを共有するために何が必要かを調査する必要があると決定しました。
個々のシステムのいずれかにソフトウェアの変更を加えることはできますが、1つ(またはそれ以上)のシステムを完全に書き直すことは、管理者が楽しませる可能性が高いものではないことに注意してください。
ここでの開発者の最初の考えは単純明快でした。システムAがシステムBからのデータを必要とする場合、システムBのデータベースに接続してそれを取得する必要があります。同様に、Bデータを提供する必要がある場合は、Bのデータベースに挿入するだけです。
使用されるデータベース(およびバージョン)の混乱により、他の開発者は、複数の接続を調整する必要がないように、他のすべてのシステムのテーブルを組み合わせて、1つの新しいデータベースを作成する必要があると考えました。これを行うことで、いくつかのテーブルを統合し、冗長なデータエントリを取り除くことができるかもしれないと彼らは望んでいます。
これは、私が全体の混乱についての私の意見のために連れてこられた頃です。
システム通信の手段としてデータベースを使用するという考え全体は、私には面白いにおいがします。ビジネスロジックは複数のシステムに配置する必要があります(システムAがシステムBにデータを追加する場合、挿入を行う前にデータに関するBのルールをよりよく理解します)、いくつかのシステムは、見つけるために何らかの形式のデータベースポーリングを実行する必要があります。データベーススキーマへの変更は現在複数のシステムに伝播するため、データへの変更、継続的なメンテナンスは頭痛の種になります。
私が最初に考えたのは、時間をかけてさまざまなシステム用のAPI /サービスを作成することでした。これを作成すると、データの受け渡しや取得に簡単に使用できるようになります。他の多くの開発者は、データベースを使用するよりも、それが過剰ではるかに多くの作業であると感じています。
では、これらのシステムを相互に通信させるための最善の方法は何でしょうか。
refactoring - 品質の向上に最も大きな影響を与えるレガシー コードベースに対して何ができますか?
レガシー コードベースで作業する場合、コードベースの品質を向上させるために時間の経過とともに最も大きな影響を与えるものは何ですか?
- 未使用のコードを削除
- 重複したコードを削除
- 単体テストを追加して、カバレッジが低い場合のテスト カバレッジを改善します
- ファイル間で一貫したフォーマットを作成する
- サードパーティのソフトウェアを更新する
- 静的解析ツール (ieFindbugs) によって生成される警告を減らす
コードベースは、さまざまなレベルの専門知識を持つ多くの開発者によって長年にわたって書かれており、多くの領域がテストされておらず、テストの作成にかなりの時間を費やさないとテストできない領域もあります。
c++ - C++ アプリで参照されていないメソッドを見つける
ブロックを数回回った大きな C/C++ レガシー ソース ツリーがあります。使用されなくなったメソッドが相当数あると予想されます。未使用のコードをすばやく特定するのに役立つツールはありますか?
java - 最終メソッドでクラスをモックするにはどうすればよいですか?
私はクラスAを持っているとしましょう
今、私はクラスBを持っています
このメソッドの単体テストを行うにはどうすればよいですか? 最終的な理由foo()
は、A を拡張するクラスでその機能を変更したくないからです。しかし、メソッドを真に単体テストすると同時に、実際のA.foo()
メソッドに手を伸ばして実行したくありません。
たとえば、最後のキーワードを削除して、の行に沿って注釈を追加する方法はあり@finalUnlessTest
ますか? あなたは何をお勧めします?A をインターフェイスにリファクタリングすることは非常に困難です。なぜなら、それは私たちの中心的なクラスの 1 つであり、残念ながら非常に結合されているからです。
編集#1申し訳ありませんが、言及するのを忘れていました.Javaについて話している. 私たちはまだモッキング フレームワークを使用していません。
OK と答えてください。JMockitは信じられないほど素晴らしいものであり、私の目にはレガシー コードをテストするためのキラー アプリです。特に私の場合、信じられないほど便利です。本当にありがとう!基本的に、私の疑似例では次のようなことを行います。
これはめちゃくちゃクールですか、それとも何ですか?
language-agnostic - 継承されたコードベースに慣れるための最良の方法
Stacker新しいプログラマーが現場に足を踏み入れたときに見つけた最も衝撃的なことについて、誰も尋ねませんでした。
リストの非常に上位にあるのは、すぐに慣れなければならないコードベースを継承することの影響です。N 行のコードを維持する責任が突然自分に課せられ、それがどのくらいの期間にわたってまとめられているかを知り、それに貢献し始める時間が短いことに気付くと、非常にショックを受ける可能性があります。
この新しいデータをすべて効率的に吸収するにはどうすればよいでしょうか? この移行を容易にするものは何ですか? ショックが収まるほどの数のオープンソース プロジェクトにすでに貢献している唯一の現実的な解決策はありますか?
これは、ベテラン プログラマーにも当てはまります。新しいコードベースへの移行を容易にするために、どのような手法を使用していますか?
これらの移行に関するいくつかの戦争の話を聞きたいので、これに Community-Building タグを追加しました。特にストレスの多い学習曲線をどのように処理したかを自由に共有してください.
legacy - 大規模なコードベースに慣れるための最良の方法は何ですか?
大規模なコードベースが既に配置されている既存のチームに参加することは、困難な場合があります。最善のアプローチは何ですか;
- ブロード; コードから、すべてがどのように相互にリンクしているかの概要をつかむようにしてください
- 狭い; 一度にコードの小さなセクションに集中し、それらがどのように機能するかを完全に理解する
- 開発する機能を選択し、作業を進めながら学習します
- クラス図と UML が利用可能である場合 (および最新の場合) から洞察を得るようにしてください。
- まったく別の何か?
私は現在、約 20k 行の C++ アプリとライブラリに取り組んでいます (編集: 物事の壮大な計画では小さい!)。業界では、経験豊富なプログラマーから紹介を受けると思います。しかし、そうでない場合、できるだけ早く付加価値を開始するにはどうすればよいでしょうか?
--
回答の要約:
- デバッグ モードでコードをステップ実行して、その動作を確認します
- あなたよりもコードベースに精通している人とペアを組んで、コーディングする人と見たり議論したりする人を交代で行います。チーム メンバー間でパートナーをローテーションして、知識が広まるようにします。
- 単体テストを書きます。コードがどのように機能すると思うかについての主張から始めます。期待どおりの結果が得られた場合は、おそらくコードを理解しています。そうでない場合は、パズルを解くか、問い合わせを行う必要があります。(ドナルに感謝します。これは素晴らしい答えです)
- 上記と同様の方法で、機能コードの既存の単体テストを実行します
- UML、Doxygen によって生成されたクラス ダイアグラム、およびその他のドキュメントを読んで、コードの全体像を把握してください。
- 小さな編集やバグ修正を行い、徐々に積み上げていきます
- メモを取り、飛び込んで開発を開始しないでください。面倒なコードや不適切なコードを生成するよりも、理解に時間を費やす方が価値があります。
この投稿は、 the-best-way-to-familiarize-yourself-with-an-inherited-codebaseの部分的な複製です
java - レガシ コードのジェネリック
Java 5 に移行したばかりのかなり大量のコードがあります。Java 5 バージョンでのリリースを目標として、これらのコンポーネントでジェネリックを使用してきましたが、残りのコードはもちろん生のコードでいっぱいです。種類。生の型のエラーを生成するようにコンパイラを設定し、手動でそれらをクリアし始めましたが、現在の速度では、処理に非常に長い時間がかかります (約2500のエラーがあります)。そして、これは Eclipse の便利な Infer Generic Type クイック フィックスによって実現されます。これは常にエラーを取り除きますが、多くの場合、さらに作業が必要なコードを生成します。
これに対処するより良い方法はありますか?Eclipse より優れた自動化ツールはありますか? リファクタリングを1つずつ行うのではなく、すべての発生に適用する方法はありますか? それとも、警告を無視しますか?
c++ - 従来のC/C++プロジェクトでのデッドコードの検出
C / C ++コードでデッドコードを検出するにはどうすればよいですか?使用するコードベースがかなり大きく、少なくとも10〜15%がデッドコードです。この領域を識別するためのUnixベースのツールはありますか?一部のコードはまだ多くのプリプロセッサを使用していますが、自動化されたプロセスでそれを処理できますか?
security - 主要なクロス サイト スクリプティングの落とし穴を回避するクラシック ASP を使用して「終了」ページを構築する
私は、勤務先の会社で管理されている多数のサブサイトで使用されている従来の ASP Web ページの更新に取り組んでいます。
このページの目的は、ユーザーが「私たちの」サイトを離れて別のサイトに移動することをユーザーに通知することです。基本的には免責事項ですが、リソースの制限と時間の制限により、私たちが管理するすべてのサイトに免責事項を追加することはできません.
これが問題の核心です。現在のコードは、クエリ文字列から変数を取得して、新しいウィンドウに「続行」リンクを作成します。これは明らかに、クロス サイト スクリプティングの形で多くの問題を引き起こします。
vbScript/ASP を使用したクロス サイト スクリプティングの問題のほとんど (すべてではないにしても) を解消するには、この更新プログラムにどのようにアプローチすればよいでしょうか。
私が使用しているコードは以下のとおりです。