私は、適度に大きなシステム(約60k LOCの非ムースOO Perl)を維持することを任されています。私はそれを書き直すのではなく、リファクタリングの知恵に疑問を持ち始めています。私はこの質問が長らく議論されていることを知っていますが、状況は非常に複雑であり、反対方向を強く指し示すいくつかの要素を持っています。質問の冗長さには申し訳ありません。それは私が全体の画像を横断しながら管理することができるように簡潔です。これをリファクタリングして書き直しを計画する必要がありますか?
遠方での行動に頻繁に依存していることからもわかるように、抽象化されたものはきれいに何かをカプセル化するのにはかなり不十分で、手元のモジュールとは無関係のタイプのオブジェクト、およびソーシャルネットワークのように見える依存グラフが含まれています。これは、私が感じたことは悪いですが、リファクタリングすることができました。
テストカバレッジはばらつきがあります。これはもちろん修正可能であり、リファクタリングの前に修正する必要があります。もちろん、そのようなシステムでは、テストに足りない量の足場が必要となります。これは、テストの範囲をより困難にしますが、それでもなお不可能です。
そして私はゆっくりと混沌にいくつかの秩序をもたらし、多くの時間を費やすことを計画のです。私は思っていましたが、システムはビジネス上の目的のためには十分に機能していますが、それは問題があるにもかかわらず、何か正しいことをしているに違いありません。そして、 "誰もが知っている"このようなものを書き換えることは、災害のためのレシピです。
しかし、最近、私はシステムの最も重要な信頼性の低い部品の一部が深く座って、データスキーマにすべての道を行く、重大な設計ミスしていることを発見しました。全体的な方法論には大きな問題があります(これは私だけではなく、それに取り組んできた人々の合意です)。そのための回避策はおそらくその部分のコードの半分を構成します。ビジネスの論理。コードは自分自身にとって(あまりにも数ヶ月間それに取り組んできた)、または以前のプライマリメンテナー(数年間)が完全に理解するにはあまりにも複雑です。また、テストカバレッジは10%未満です。
誰もが、はるかに少ないそれらがどのように完全にかつ正確にその一部が実現かを説明できると確信していません。コードが解読不能で、満たされている要件が十分に理解されていない場合、この部分の優れたテストカバレッジを得ることは不可能です。テストカバレッジなしでリファクタリングするのは適切ではないし、このサイズのシステムでは複雑であり、動的にタイプされているため変更の影響を自動検出することは不可能です。この暗いコーナーが手つかずのまま
が原因絶えず変化するビジネス要件にオプションではありません。
私が見ることのできる唯一の実用的な方法は、ビジネスレベルでシステム要件を再定義し、その仕様を満たし、誰も予想していない破損を招くことを約束することから始まります。私はそれが悪い戦略だと知っていますが、私は選択肢を見ません。それが進路として選択されていれば、リファクタリングのメリットの多くが窓から出てきているように思えるので、これをリファクタリングしようとしても真剣に疑問を投げかけてくれます。
この場合、リファクタリングはリファクタリングですか?実際の経験に裏打ちされた回答は強く推奨されます。なぜなら、理論的な側面はここや他のところでよく確立されていると思うからです。
これは大きな赤い旗です...あなたは実際にコードが何をしているのかわかりません!確かに進歩を考える前に、コードを理解し文書化した時点に到達する必要がありますか? – AmbroseChapel
+1:これは素晴らしい質問だと思います。なぜなら、この記事が同じボートの他の人たちに優れた指針を与えることができるように、ローカライズすぎると思う理由があるからです。 – Zaid