web-dev-qa-db-ja.com

後でデザインを変更することは、その価値のために時間がかかるようです

(コーディングしない人にとっては、この質問のコードスニペットに恐れをなさないでください。彼らの質問は、コードデザイン自体ではなく、デザインを変更するためのアプローチに関するものです)。

最近、こんな技術設計を提案しました

public class MyDatabaseLayer
{
    public ResponseCode runQuery(Query q)
    {
        try 
           {
              //do database stuff
           }
        catch 
            {
               //catch database exceptions (like bad username/password) and put them into a user friendly ResponseCode
            }
        return r;
    }

}

ただし、「早く投げ、遅くキャッチする」という原則によれば、私のデザインは次のようになります。

public class MyDatabaseLayer 
{
    public ResponseCode runQuery(Query q) throws SomeDatabaseExceptions
    {
        //do database stuff without handling exceptions
        return r;
    }
}

問題は、それはすでに設計段階の後半であり、元のソリューションがどのように機能するかについてはすでに考えました。

プロジェクトは非常に単純なので、ソリューションのコーディングにも、将来の変更にも問題はないと確信しています。

この段階でデザインを変更することは、それを遅らせるだけであり、実際に機能する製品を提供することなく、私を輪になって回らせることになると思います。

問題は、この種の問題に対処するためにどのような手法があるのか​​、コードをリファクタリングして「完璧」にするのか、それとも「十分に良い」ものとして提供するのかということです。

3
dwjohnston

3つの質問を自問してください。

  • 今、デザインを変更するためのリソースはありますか?そうでない場合は、そのままにしておきます。
  • 設計変更により、製品の耐用年数にわたってより多くの価値が追加される可能性がありますか?そうでない場合は、そのままにしておきます。
  • 自分のリソースでできるより良いことはありますか?もしそうなら、代わりにそれを行います。

ソフトウェアの構築、製品の設計、雑用など、何でもすることのポイントは、価値の低い代替品をより高いものに置き換えることです。たとえば、キッチンの床を掃除するのは、掃除にかかる労力よりも清潔さを重視しているからです。

したがって、設計の「改善」が特定の設計原則を確認することを目的としているが、実際の価値を追加しない場合は、それらを作成しても意味がありません。

これらすべての問題は、将来何が起こるかを誰も止められないということです。これは、今日私が物事を改善するために費やした努力は、無駄な努力になる可能性があることを意味します。たとえば、車のオイルは定期的に交換しています。そうすることで、車の寿命を延ばすことができれば幸いです。しかし、オイル交換の直後に車が償却された場合、私はお金を無駄にしてしまいました。

このジレンマの解決策は、私が入手できる情報に基づいて最善の推測をすることです。そうするための助けとして、人々は、少なくともコストで最大の価値を追加する方法で彼らを導く規則または原則を考え出しました。ここでソフトウェア設計の原則などが登場しますが、同様のヒューリスティックを他の多くの生活分野に適用できます。

課題は、適切なタイミングで適切な原則を選択しています。当然のことながら、そうするための厳格なルールはありませんが、幸いなことに、適用できる原則が(当然のことながら)あります。

ここに幾つかあります:

  • 何かがベストプラクティスと見なされる理由を理解します。
  • 原則が関係する状況の種類を理解する
  • ...そしてそれはしません。
  • これらを現在の状況と比較してください。
  • 原則を実行するためのコストを理解します。
  • ...そしてそれを適用することから生じる可能性のある利点。
  • 原則を今すぐ適用するためのリソースがあるかどうかを判断します。
  • あなたと同様の仕事をした他の人の両方の経験から学びましょう。
  • すべてを一度に変更しようとするのではなく、段階的な改善を行うことができるかどうかを検討してください。

最後に覚えておくべきことは、コストとメリットは複雑で、滑りやすいものであることが多いということです。キッチンの床を掃除する例に戻ると、掃除に費やす時間には、即時のメリット(見栄えが良い)、中期的なメリット(妻が幸せで、結果として人間関係が改善される)、長期的なメリットの両方があります。 (それは長持ちします、私たちは隅でフェスタするカビの生えたものから厄介な病気を拾う可能性は低いです)。直接的なメリットはそれほど重要ではないように思われるかもしれません...しかし、他のいくつかは重要です。ソフトウェアの優れた設計の利点の多くは似ています。特に、優れた設計により、他の(多くの場合はより深い)問題を解決するために使用できる「ヘッドスペース」が解放されます。

3
Kramii

この段階でデザインを変更することは、それを遅らせるだけであり、実際に機能する製品を提供することなく、私を輪になって回らせることになると思います。

これが見積もりだと思います。あなたは良いまたは美しいコードを書くためにそこにいません。あなたは誰かのために価値を創造し、販売されるソフトウェアを作成するためにそこにいます。良いデザインはそれ自体が目標ではありません。保守や拡張を容易にするなど、より優れたソフトウェアを作成できる場合にのみ望ましいです。

アジャイルソフトウェア開発 まさにこの問題に対処します。あなたの問題をアジャイルに見る方法は、最適ではない合意された設計を今すぐ提供して、ソフトウェアの動作部分をできるだけ早く持つことです...しかし、後でリファクタリングすることに対して非常にオープンです。

もちろん、ここには多くの余裕があります。何をしているのかを計画し、実際の設計作業を事前に行わずに、「何かを速く動作させるために」コードにただ座っていることを主張する人は誰もいません。しかし、計画された行動方針から逸脱する衝動を感じた場合は、作業を行う前に製品、設計を改善するために、アジャイルソフトウェア開発では、その衝動を踏んで行動しないように指示します。ドアから何かを取り出し、フィードバックを収集し、次にリファクタリングについて考えます。

2
Stephan Kolassa