web-dev-qa-db-ja.com

要件が変わったときにコードの品質を高く保つためのテクニックは何ですか?

ゼロから機能を作成するときはいつでも、それは優れた堅牢なコードです。

しかし、多くの場合、コードがどのように機能するかについての私の想定は、時間とともに進化します。これらの変更をコードに反映した後、システム全体が突然その品質を失います。

古いコードを削除し、新しい想定を念頭に置いて、新しいコードを最初から作成するのが最善の方法であるように思えます。しかし、時間の明らかな制約から、大幅に変更しながらコードの品質を高く保つ方法を学びたいと思います。

質問:このスキルを伸ばすのに役立つテクニックや本はありますか?

コードレビューがコードの問題を明らかにするための優れたツールであることに気づき、同意します。しかし、私はそれらの問題がそもそも起こらないようにし、他のチームメンバーを巻き込むことなく自分でそれを行うスキルを開発することに興味があります。

PS:これを、リファクタリングと混同しないでください。これは、動作を同じに保ちながらコードを変更するためのものです。コードの要件が変更された私の場合、それは明らかにリファクタリングではなく、動作の変更を伴います。

5

要件が変わったときにコードの品質を高く保つためのテクニックは何ですか?

テスト駆動開発を試しましたか?それはまさにこの目的のためです。 TDDの機能を使い終えると、機能だけでなく、その機能をカバーするすべての自動テストも利用できるようになります。新しい機能や変更が導入されたら、これらのテストを実行して、何も壊れていないことを確認できます。これは、変更を実装する前後に、コードの構造を安全に改善するのに役立ちます。

これは私を2番目のポイントに導きます:

PS:これをリファクタリングと混同しないでくださいは、動作を同じに保ちながらコードを変更するためのものです。コードの要件が変更された私の場合、それは明らかにリファクタリングではなく、動作の変更を伴います。

ご自身の言うとおり、直面している問題は、変更のたびにコードの品質が低下することです。そのため、最終的にはコードベースのリファクタリングが必要になり、そうでなければ生産性の停止点に達する可能性があります。それを逃れることはありません。

しかし、おそらく、「コードをリファクタリングするだけ」などの答えが不要であることを単に意味しているだけかもしれません。しかし、これはまさにあなたの質問がここで求めていることです。

また、この質問への回答は、ケントベックの引用なしでは完全なものではありません。

難しい変更に直面した場合は、最初にそれを簡単にし(警告、これは難しい場合があります)、次に簡単な変更を行います。

コンテキストを少し追加するために、ケントベックが「最初に[変更]を簡単にする」と言ったとき、彼は現在のコードベースをリファクタリングして、現在の新しい要件をより歓迎するように話している実装する必要があります。

12
MichelHenrich

ゼロから機能を作成するときはいつでも、それは優れた堅牢なコードです。

私たちは皆、現時点でそれを考えています。私たちはめったに正しくありません。

しかし、多くの場合、コードがどのように機能するかについての私の想定は、時間とともに進化します。これらの変更をコードに反映した後、システム全体が突然その品質を失います。

うーん、ダメ。それは質がなかった。もしあなたが仮定を簡単に変えることができたとしたら。品質は、今日の要件を満たすだけではありません。

古いコードを削除し、新しい想定を念頭に置いて、新しいコードを最初から作成するのが最善の方法であるように思えます。しかし、時間の明らかな制約から、大幅に変更しながらコードの品質を高く保つ方法を学びたいと思います。

単純に柔軟なコードを記述できない場合は、書き換えが最適です。すでに存在しない要件を満たそうとしている、半ば変異したコードよりも確かに優れています。

質問:このスキルを伸ばすのに役立つテクニックや本はありますか?

開発の観点からは、これは俊敏です。ウォーターフォールは、多くの計画外および緊急の変更にうまく対応しません。今のところ、これにはアジャイルが最適です。

コーディングの観点から見ると、これに対する最善の原則は単一の責任です。各モジュールには、変更する理由が1つだけ、できれば一意である必要があります。 1か所で意思決定を行います。それらを広めないでください。最初からそれに従ってください、そして、変化はそれほど外傷的ではありません。

コードレビューがコードの問題を明らかにするための優れたツールであることに気づき、同意します。しかし、私はそれらの問題がそもそも起こらないようにし、他のチームメンバーを巻き込むことなく自分でそれを行うスキルを開発することに興味があります。

コードレビューは主に、コードが読み取り可能かどうかのチェックです。間違いなく価値がありますが、すべてを保証するわけではありません。他の人はあなたのデザインと実装をチェックするかもしれませんが、それに頼りません。

PS:これを、リファクタリングと混同しないでください。これは、動作を同じに保ちながらコードを変更するためのものです。コードの要件が変更された私の場合、それは明らかにリファクタリングではなく、動作の変更を伴います。

そうだね。リファクタリングは設計を変更します。新しい要件を満たすには、変換が必要です。何だと思う?リファクタリングを使用すると、変更に対応する必要性を予期していなかった古い設計を変更できる設計に変更できます。それができたら、新しいニーズを反映し、それらを通過させることができる新しい単体テストを作成する準備が整います。

ここでは本をお勧めしませんが、この回答には十分な話題があるので、今すぐ本を見つけることができます。

12
candied_orange

バグ、不必要なコードの存在、変更前と変更後は不要、コードの冗長性、抽象化の誤りなど、あらゆる種類の悪いこと。

コードの品質の説明に固執することは、プロジェクトのライフサイクルに 静的プログラム分析 を導入するのに私には理にかなっているようです。 テストは必須であることを言及する必要はありません(単一、統合、機能、エンドツーエンド、...)。

静的分析によって提供されるメトリックは、表現した用語でコードの品質を客観的に記述するの点でかなり優れています。

時々、分析はあなたが知らなかった疑わしい慣行についてあなたに教えることができます。

静的解析で言えないのは、デザインの良い/悪いモデルの悪い/良いまたはシステムの効率性または非効率性。少なくとも私が知っているツールは違います。

ピアレビューまたはペアプログラミング

さらに1人(または2人)の開発者に参加することで、学習プロセスが大幅に改善されます。視点、スキル、知識のポイントのコントラストは、静的分析では得られなかったポイントの改善に役立つ可能性があります。

しかし、私はこれらの問題がそもそも起こらないようにし、他のチームメンバーを巻き込まずに自分でそれを行うスキルを開発することに興味があります

あなたのスキルに関して、防ぐは気づいている問題です。 開発スキルは時間と練習の問題です。

古いコードを削除し、新しい想定を念頭に置いて、新しいコードを最初から作成するのが最善の方法であるように思えます。しかし、時間の明らかな制約から、大幅に変更しながらコードの品質を高く保つ方法を学びたいと思います。

それがbestであるのか、またはdesirableであるのかはわかりませんが、同じように考える傾向があります。時間は相対的な制約です。場合によっては、目標が練習と自己改善である場合、全体として追加の努力に値する目標があります。

3
Laiv

質問:このスキルを伸ばすのに役立つテクニックや本はありますか?

もちろんです。 1つ目は、デザインを変更しながらコードの品質を維持するための本です リファクタリング 。常に稼働しているシステムを維持しながら、所有しているものを必要なものに変更するプロセスについて説明します。リファクタリング手法とテスト駆動設計および機能しているバージョン管理システムを組み合わせることにより、コードに対して大きな力を得ることができます。

ゼロからの書き換えは、私がよくやっていたことです。非常に魅力的ですが、それをしない理由はたくさんあります。あなたが持っているコードから始めるなら、あなたはいつでもあなたのコードの健全性を知ることを可能にする作業システム、テスト構造、そしてテストのスイートを既に持っています。大小のリファクタリング手順を使用して既存のコードをリファクタリングすることにより、作業状態に戻ってから1回または2回を超えてコミットすることはありません。これにより、ソリューションスペースを自由に探索できます。

1
BobDalgleish

はい、おそらく、ソフトウェアアーキテクチャに関する記述の大部分は、要件の変更に直面して適応できるコードの記述に関するものです。

考えてみれば、コードが決して変更されないのであれば、ほとんどの設計原則は重要ではありません。二度とそれを見るつもりがないなら、なぜ読みやすいコードさえあるのですか? SOLIDのような原則に従うことは、コードを変更する必要がある場合にのみ実際に効果があります。

そのためのいくつかの重要な原則は、「懸念の分離」と「単一の責任」です。目的は、単一の要件の変更が理想的には単一のクラスまたはモジュールの変更を必要とするように、コードをユニットに分離することです。裏側は、YAGNIの原則です。つまり、特定の要件の変更を予測して準備することはできません。

1
JacquesB

要件が頻繁に頻繁に変化している理由を自問する必要があります。そもそも要件を適切に理解しておらず、この理解を構築するためのコードを書いているのでしょうか?その場合、捨てるために1つを構築し、2回目に正しく構築することは理にかなっています。しかし、コードを書く前に要件を理解することはさらに賢明です。解決されるビジネス問題について考え、それを概念レベルでモデル化します。ユーザーはだれであり、ソフトウェアを通じてユーザーがとるフローは何か、ユーザーが操作するオブジェクトのタイプは何か、それらのオブジェクトに存在するアクションは何か、システムのデータフローは何かなど...モックアップとプロトタイプを使用して、ユーザーまたはユーザーを理解している人からアイデアを渡します。

解決される現実世界の問題を適切に理解すると、要件に大幅な変更を加える必要が生じることはほとんどありません。それらを拡張するか、小さな点を微調整する必要があるかもしれませんが、問題自体が変更されない限り、大きな変更は起こりません。

0
Joeri Sebrechts