4

私は、私が唯一の開発者である 12 年前のコード ベースで作業しています。直感 (または論理の飛躍的進歩 ;-) に基づいて非常に小さな変更を加えることがあります。

通常、私はその変更を分解し、コードを徹底的に読むようにしています。

ただし、時々 (最近はますます) テストを行い、希望する効果があることを確認します。(私はかなり徹底的なテスターであり、コードを読んでもテストします)。

これは私にとってはうまくいき、驚くべきことに (私が目にするほとんどのソフトウェアと比較して) バグがほとんど出回っていません。

しかし、私が疑問に思っているのは、これがコーディングの「アート」面にすぎないかということです。はい、理想的な世界では、変更によって変更されたすべてのコードを徹底的に読み取ることになりますが、実際には、コードの小さなセクションにのみ影響を与えると確信している場合、これは一般的な方法ですか?

これが貧弱なプログラマーの手に渡れば、破滅的なアプローチになることは明らかです。しかし、その後、表向きはコードを読んで左右に壊しているプログラマーを見てきました (彼らだけが取り組んできた独自のコードに基づいて)。

4

8 に答える 8

3

レガシー コードを二重の安全ブランケット テスト (優れた単体テストと優れたシステム/統合/回帰テスト、2 つの層のそれぞれからの優れたカバレッジ) にラップしたら、テストに依存して誤解をキャッチすることは効果的な短期的な方法です。戦術的アプローチ。これは、レガシー コードベースにテストを追加することを高い ROI 戦略にする理由の一部です。これにより、緊急のバグ修正を行ったり、非常に緊急の機能をより迅速に追加したりできます。既存のコードの複雑さ。

ただし、他の回答が示唆しているように、そのような変更は技術的負債を蓄積しています。他の借金と同様に、返済が早ければ早いほど、長期的には有利になります。この場合、「見返り」は内部構造の文書化だけではありませんが、多くの場合、コードベースを明快さと順応性のためにリファクタリングすることになります。本当に優れたテストは、そのようなリファクタリングを自信を持って行うのに役立ちます。レガシ コードのバグ修正と機能強化のために行います。

于 2009-05-02T04:49:28.537 に答える
3

それは時々私に起こりました。しかし、別の人がコメントで言及した点を強調したいと思います。

  • 理解している部分が何であれ、それを文書化してみてください。次に別の変更を行うときに、自分自身と他の人の時間を大幅に節約できます。

そして、私の2セントの価値のために...

  • あなたは自分の仕事を「テスト」し、それを以前の結果と比較すると言いました。私は数年前に、企業が所有できる最も価値のあるものはコード自体ではなく、テスト (つまり、JUnit) であると主張しようとしている人を読みました。彼は、ソフトウェアのライフサイクル全体を通して、小さな修正や拡張から完全な書き直しまで、コードは頻繁に変更されると述べました。成熟と経験により、私は今、彼の意味を理解し、彼のアドバイスを使おうとしています. テスト ケースを使用すると、新しい作業が機能し、何も壊れていないことを証明できます。私のポイントは... 保存して、持っている可能性のあるテストを再利用してみてください。一部のプログラマーは、これらのテストを破棄する傾向があります。後で他のプログラマーが同様に変更を加えると、それらは非常に価値のあるものになります。

幸せなコードの変更、

ジーチ!

于 2009-05-02T05:07:30.270 に答える
2

コードを変更してテストすると、コードを理解するのに役立つ場合があります。もちろん、理解できない変更を行うときは、常に危険な地面を踏んでいます。あなたの成功は、あなたの「経験」だけでなく、現在のコードの安定性にも基づいていると思います。
適切に作成されたコードを簡単に変更できます。しかし、時間が経つにつれて、この練習はあなたに追いつくでしょう.
コードを見て理解できない場合は、今こそそれを理解して文書化するときです。そうしないと、他のすべてのプログラマーが、いつ変更を加えなければならないかを把握しなければならなくなります。一度実行して正しく行うことで、将来の時間と手間を省くことができます。

于 2009-05-02T04:38:25.800 に答える
1

私はプロの開発者になってまだ数年しか経っていないので、この質問の意図されたターゲットではない可能性が高いです。ただし、とにかく 2 セントを投入します。

私はいつもこれをします。締め切りが迫っているときは、全体を理解しているかどうかに関係なく、コードを確実に機能させることができます。

私は通常、後で戻って自分が何をしたか (通常は週末に) を見て、コピー/貼り付けたコードの悪い決定を反映するようにコードを更新するように最善を尽くします。しかし、締め切りは重要です。特に、契約に期限を守らなかった場合の罰則がある場合はなおさらです。後で問題を修正するアップデートをいつでも送信できます。

于 2009-05-02T04:32:43.117 に答える
0

メソッドを変更する場合は、このメソッドを呼び出すメソッドを含めて徹底的にテストする必要があります。

于 2010-05-31T02:26:14.187 に答える
0

いいえ、私は決してこれをしません。私は自分のコードが 100% 論理的でバグがなく、今後何年にもわたって他の人に読まれることを期待しています。コードのコンテキストを完全に理解していないという概念全体が危険に思えます。また、コードを読み取ることが、システムの正確な動作を判断するための最速の方法である必要があります。そうでない場合は、コードの品質に問題があることをお勧めします。

読みながら勉強もしています。私が取り組んでいるシステムの進行状況について非常に興味を持っていることは、私の専門的な基準の重要な部分だと思います. この好奇心には、システムを進化させ、改善する能力が伴います。それができなければ、開発はすぐにつまらなくなると思います。

于 2009-05-02T06:13:08.397 に答える
0

常に!

于 2009-05-02T04:57:30.577 に答える
0

分離してテストおよび理解できる小さな断片でコードを構成する必要があります。

関数、メソッド、クラスのいずれであっても、それぞれの小さなピースは 1 つのことを適切に行う必要があります。

これらの小さな部分からより大きな機能を構成できるようにする必要があります。これにより、各構成が内部でどれほど複雑であっても、その機能の抽象化のレベルでは単純なままになります。

言い換えれば、高レベルであっても、複雑な内部構造を単純な外部構造で説明できるはずです。

これは、Andrew Koenig が「抽象化は選択的無知である」と言ったときの意味です。何かが内部でどのように機能するかについての知識を意図的にあきらめることによって、それがどのように機能するかではなく、それが何をするかを考えることができます

簡単な例を挙げましょう。ハイエンドでは、「このクラスは、あるデータ構造で最小の int を見つける」と言うかもしれません。それは、それがどのように行うかではなく、何をするかを教えてくれます。この高レベルの抽象化では、私たちが気にかけているのはそれだけです。

私たちは何かをするものを持っています、そしてそれはモジュラーです、それを同じことをする他のものに置き換えることができます。それはパブリックインターフェースを持っています。

下位レベルでは、これがどのように機能するかは、内部的にはヒープまたは優先キューなどである可能性があります。

そして、それらは、ツリー、自己均衡ツリー、または (次善の) リンクされたリストの観点から実装される場合があります。リンクされたリストは次善の実装になりますが、それが同じことをしている限り、私たちは本当にカフェではありません。同じインターフェースで。

そして、それらはツリー トラバーサルの観点から実装されます (事前注文: 常に左、親、右の順序で進みます)。そして、それらはノード上の単純な操作の観点から実装されています。

重要な部分は次のとおりです。アプリの残りの部分は、そのモジュールの内部や副作用に依存していないため、貧弱な実装をより良い実装に交換しても、他のコードは変更されず、全体的に速度が向上します。

各層は、そのすぐ上の層とすぐ下の層とのみ通信するため、各層を置き換えることができます。視覚的には、ベン図の重なりではなく、円の中に円の中に円のように見えます。

直感に頼る必要がある場合は、コードに副作用があるか、他のモジュールへの過度に広範なインターフェイスがあるか、インターフェイスではなく、自己完結型で構築されたコードではないことを示唆しています。 、交差しない、モジュール、オーバーラップと交差、脆弱なコードがあります。理解できるほど単純な断片に分解していないこと。

(くそ、遅い。この説明をもっとうまく分解できたのではないかと心配している.これを編集するために戻ってくるだろう.)

于 2009-05-02T04:58:13.710 に答える