2009-05-06 2 views
10

私はこれです:ハードコーディングに対するあなたの態度は?

ハードコーディングは方法です!すべての私の問題は消えます。それを1つずつコーディングしてください。そして、問題はあなたの一日を殺して戻ってくる。

私は絶対に嫌っていましたが、実際には「ビジネスマン」というのは、自分が望むものを手に入れるのに時間がかからないためです。特に企業環境で働くソフトウェア開発者として、ほとんどの人はこう言うでしょう: "ええ、どうして気になるの?ハードコーディングに対するあなたの態度は何ですか?

+0

いくつかの企業環境では、人々は仕事を長期間維持するためにコードを意図的にハードコードすることを知っています。 – Jeff

+4

主観的なタグが追加されました –

+0

そして、その主題がコーディングが難しいと思っていました! – SteveL

答えて

18

ハードコーディングは可能な限り避けるべきです。

コード上で何かをハードコードすると、コードのportabilityが大きく「破棄」されます。プラットフォームに依存しない言語であっても、「一度コンパイルしてどこでも実行」と言うことはできません。良いソフトウェアエンジニアリングの慣行ではないので、ハードコードを避ける方が良いと思います。

私はそれが必要な場合があります。特にコードのデバッグに必要です。私が提案する方法は次のとおりです。最初にハードコードでコードを開発し、それを安定させ、ハードコードを削除します。

セキュリティ上の懸念などの理由で、ハードコーディングが必要な場合があります。レジストリ、設定ファイルなどを使用することは許可されない可能性があります。なぜなら、攻撃の対象となる可能性があるためです。しかし、私はそれがまれなケースだと思います。

+0

私は同意しますが、しばしば「ビジネス主導型の環境」では、人々は自社の製品を柔軟に保守しやすいものにリファクタリングする価値を見ていません。彼らは何かが戻ってきて、彼らを苦しめない限りROIしか見ません。 – Jeff

+1

あなたが覚えておく必要があることは、外部構成によって変更することができ、テストする必要があることです。忘れてはならないのは、顧客は馬鹿であり、ファイルを捨ててはならないということです。すべてが壊れた場合、それはあなたの責任です。ハードコーディングはこの問題の影響を受けません。クライアントにデプロイする前に、すべてのテストを特定の構成で実行できます。 –

+1

私はジェフリーに同意します。ビジネスの観点から、ROIはより高い優先順位を得るかもしれません。:) –

0

私は通常、値をハードコードではなく構成ファイルに入れてみます。値をハードコードする必要がある場合は、ハードコードされた値を持つ定数を作成し、コード内のどこでも同じ定数を参照します。値を変更する必要がある場合は、1か所で値を変更できます。

アプリケーション全体の定数については、通常、クラスを作成し、定数を作成します。

1

ハードコーディングは方法です!

しかし、Anthonyが述べたように、私は自分のクラスに設定可能な値を入れました。こうすることで、コンパイル時に構成可能になりますが、構成のために外部のxml/txtファイルが追加されて複雑さが増すことはありません。

xml/txtファイルは、絶対に必要な場合にのみ構成用に使用します。さもなければハードコーディングより悪くなくても悪いことになります。言うまでもなく、クライアントがまったく変更したくない設定ファイルに人が入れていることはたくさんあります。

クライアントごとに異なる構成が必要な場合は、ハードコードされた値を独自のアセンブリ/ dllに入れ、クライアントごとに異なる構成アセンブリを展開します。

Ayendeと言うと、hard coding everythingは変更を有効にするための鍵です。

+0

ayende rocks !!! – Jeff

4

私の初期の段階でハードコーディングを経験したことのある人(誰にも仲間に言ってはいけません)として、私は自らがあなたのところに戻ってくると自信を持って伝えます。このアプリケーションは私が作ったものです(は今のところが話されていません)。が完全にに書き換えられました。ハードコードされたコンテンツがたくさんありました。それは1998年の仲間に戻った。

今後、そのクライアントをサポートしたくない場合を除き、実行しないでください。あなたが今保存する時間は、後で修正するのに費やされる時間になります。

+1

私は、ソフトウェアを書く人もそれを維持する人であるかどうかは、ストーリーが異なると思います。誰かがソフトウェアを書いているだけで誰かにそれを維持するためにそれを投げ捨てるなら、私はこのメンテナの男が大声で叫んでいるのを見ることができます! – Jeff

+0

それはあまりハードコーディングではなく、貧弱な構造の場合のように聞こえる。抽象化がたくさんあるレイアウトの悪いプログラムは、配置の悪いプログラムよりも維持管理が悪いです。私は両方の壁を跳ね返っている、それは中間の場所を見つけるために経験を必要とします – STW

+0

ハードコードされた値が確かに変更されない場合、良いコメントとユニットテストに加えて、それはうまくいくはずです。 –

0

すべてのケースをカバーするアサーションを作成するのは難しいいくつかの要因があります。

あなたは彼らはむしろすぐ後でより再びポップアップしますする可能性があるハードコーディング開始した場合、それはその後、いくつかのサイクルの長いプロジェクトがある場合。したがって、これらの場合、適切な解決策で修正する方がよいでしょう。

しかし、サイクルが短いプロジェクトやスケジュールが事前に設定されていて、製品を出荷する必要がある場合は、製品が機能しても内部のことは気にしません。しかし、このような場合には、ソリューションをハードコーディングする方が好きですが、将来的には適切な解決策を立てることが容易になるように、パスを開いてください。

ハードコーディングはとにかく悪いですが、私はあなたはそれが次の人の生活がより簡単に作ることができ、そしておそらく少なくともあまりない、あなたを呪うません適切に文書化;)。

しかし、私の経験から、私は、外出先からハードコードに避け、そして唯一の私は他のオプションをしたんときにそれらを使用して、そしていつも私は時間をしたときに、後に、私はそれを正しく修正することができ、それらの例を文書化し始めました。

14

ハードコーディングに間違いはありませんが、正しい理由でそれが正しく行われました!

「正しく実行する」とは、すべてのハードコーディングを1つまたは2つのモジュールに集中させることを意味します。

Cの定義では、Java用のcodes.h内のすべての値にpublic constantsで完全なcodes.javaクラスがあります。

ハードコーディングには「正しい理由」がいくつかあります。

  • シンプル。
  • サポート - あなたの値が外部構成ファイルにある場合、あなたは愚かな構成から身を守ることはできません。可能なすべての構成をテストすることはできません。
  • パフォーマンス。
  • 可読性。あなたはあなたの編集セッションで知る必要があるすべてを見ることができます!

は、複雑なコンフィギュレーションファイルの上に回避するために、いくつかの理由があります。あなたが十分なパラメータとオプションを持っていれば、あまり良い言語でプログラミングを終了するだけです。

+0

私はこれに同意します! – Mugunth

0

それは彼らが望むものを得るためにあまり時間がかかります。

「私はコメントなしで自分のコードを書くのが好きです」

もちろん、ハードコーディングがの場合は常に a Very Bad Thingです。 (つまり、π、e、Planckの定数などの数学的定数を設定ファイルに格納するのは馬鹿げているかもしれません。また、正弦/余弦の値のルックアップテーブルをハードコーディングするのはおそらくファイルからロードするよりもはるかに効率的です)。しかし、データを難読化することは、単に便宜のためにというスマートなアイデアではありません。柔軟性がなく、後でデータを変更するのは、それよりもはるかに面倒です。

また、ハードコーディングは、多くの状況では不可能ではないにしても、ローカリゼーションを非常に困難にする可能性があります。それが一部の企業の内部アプリだとしたら、ある程度はそれほど重要ではないと思うが、一般的には良いソフトウェア開発の習慣にはならない。

7

概念的には、あまりにも多くのハードコーディングが嫌いです。

しかし、プラクシスでは、私はいくつかの値をハードコードする傾向があります。ハードコードの主な理由は次のとおりです。

    仕様によって、正確にこの値を変更する必要があります。 変更可能にすると、ソフトウェアが不安定になる可能性があります。
  • 値はおそらく後で変更することができますが、誰がどのように知っているのかわからないので、それがどこに属しているのか分かりません。それは、設定ファイル、リソースファイル、データベース、レジストリまたは他の場所に属している可能性があります。 それを間違った場所に置くのは、ハードコーディングするより悪いです。

がありますいくつかの「ハードコーディングする最良の実践者の」私が思うは決してオーバーエンジニアリングです:

  • ハードコーディングされた値が常に定数の中央の場所に宣言する必要があります。
  • 値がハードコードされていても、値がどこに来るかを気にする必要のないコンポーネントへの引き数として渡す必要があります。コンポーネントを再利用できるようにします。

これにより、ハードコードされた値を後で他の場所に移動することができます。

+1

私はこれが本当のキーだと思います。あなたのメインアプリでハードコードしても、その値をすべてのコンポーネントに渡す必要があります。ハードコーディングを1か所にとどめておくことは、どこでも重要なパブリック静的最終MAGIC_NUMBERを意味するものではありません。 –

19

ITには銀の弾丸が存在しません。

  • スマートであればやるよ。
  • 愚かな場合はやめてください。

誰かがあなたに愚かなことを言うなら、電子メールスレッドを保存し、J.O.Bを保存します。

+12

+1。ハードコーディングとソフトコーディングは、従来の意味を持ちません。ハードコーディングは、変更を必要とするレートのために抽象的である必要があるコードに特定の詳細を残しています。ソフトコーディングは、変更が予想されなくても、コードから特定のものを抽象化しています。 「良いコーディング」は、2つのものをブレンドしたものです。*変更できる可能性はありますが変更される可能性はほとんどありません。 *抽象化によって変更されるか簡略化されるものは抽象化されています。私たちは皆、あまりにもハードコーディングが悪いことを知っています。しかし、すべての抽象化のn層を掘り下げようとすると、それほど悪くなる可能性があります。 – STW

+0

@ Yoooder-そのコメントを回答に入れるべきです。 – RichardOD

0

私が12個の文字を指すようにchar *が必要な場合sizeof(char)はいつも私が12個の整数を指すようにint *が必要な場合は、私はmalloc(12 * sizeof(int))を書く1になるので、私は無事malloc(12)を書くことができます。

ハードコードいくつかは、確実にに変更されます。それ以外には2秒かかります。どうしてそちらに行かないのですか?

2

私は、デフォルト値をハードコーディングだと思うが設定できるように必要になる可能性があるすべてのもののために行くための方法です:

当社GUIコード(クライアント・サーバー)で、我々は3段階のルックアップを使用します。私達は私達の好みを尋ねますデフォルト値を持つプリファレンスのインスタンス。しかし、この渡されたデフォルト値は、設定ファイルがあればそれによって上書きされます。

これで、後で2つのオプションがあります。顧客が何か別のものを求めている場合は、設定ファイルで変更することができます。また、ユーザーが設定できるように設定ダイアログを構成することもできます。

実際には、設定によって上書きできるハードコードがあり、ユーザーの設定によって上書きされる可能性があります。

唯一の問題は、ハードコードが正しく行われている場合、それはボーナスすることができ

+1

私は彼が設定可能な値を意味しないと思っていますが、変更できるすべての値 - ユーザーが持つことができる最大数のブタのようなものです。 – IAdapter

0

...すべての設定キーを文書化することです。たとえば、動的割り当ての代わりに配列サイズをハードコードした場合、配列がメモリ内のどこに存在するかを正確に知っているので、デバッグが容易になります。これはあなたが実際にこれらのようなことを知りたいと仮定しています。

2

通常、元のコードを書き込むよりも、コードを維持するために多くの時間と費用が費やされます。コードに費やされた総額の80%は、通常、保守期間中に費やされます。したがって、メンテナンスをより困難にするものは、最初に正しく行うよりも、最終的にはコストがかかります。ハードコーディングは、メンテナンスをより困難にする1つのことであり、その結果、悪い考えです。組み込みおよび重要なソフトウェアで

+0

多くの商用製品を出荷している人として、一度コードが消えてしまい、決して「維持」されていないことがわかります。ゲームシステムのためのゲームカートやディスク。これらのケースでは、合計の0%が保守に費やされます。 しかし、長い寿命が予想される製品の場合でも、時にはソフトウェアの寿命の最も重要な時代は出荷前です。締め切りが間に合わない場合は、ソフトウェアが死ぬ可能性があり、メンテナンスする必要はありません。 – Nosredna

+0

これは大きく変わったと思います。たとえば、少なくともある程度は、あとでパッチを当てていない、多くのゲームを考えることはできません。そしてもちろん、あなたの製品が成功すれば続編を作りたいのであれば、古いコードをもっと再利用できるほど良いでしょう。 EAはスポーツゲーム(Madden、FIFA Soccer、NHL)に毎年少しずつ追加し、多額の金を稼ぐだけです。 – Makis

4

、ハードコーディングは、2つの主な利点ました:それはこれがあまり少ないCPU負荷、すなわち低消費電力を、意味や

簡単です

  • 速く

    • ですダイナミックメモリの割り当て、アルゴリズムの複雑さ、すなわちデバッグの容易さが低下します。

      通常、ハードコードされたデータは、より多くのmaintai不自由さ

      さらに、データベースからのこのヘッダファイルの自動生成によって柔軟性が提供されます。

  • 0

    私は常に定数を作成しますが、「唯一の」使用が可能な限り、可能な限り/賢明に閉じます。

    ユニット内の他の場所に必要な場合は、ユニットの上部に移動します。

    それが別のユニットで必要な場合、定数は設定単位に移動します。

    誰かがそれがchangableたい場合は、設定ユニット(まだの場合)に移動し、設定ファイルから設定されますなど

    一日の終わりには、あなたがものを与える名は、そのドキュメントです少なくともそれはあなたがあなたの73を誰かと混ぜ合わせないことを意味します73.あなたは私が何を意味するかを見ます。

    0

    C/C++のハードコード文字列については、私は通常、ハードコーディングを避けるための最も単純な方法としてそれらを定義しています(ただし、まだハードコードされています)。その理由は、スペルミスのある定義済みの識別子はコンパイラによって捕捉されますが、引用符の間には何も挿入されません。

    0

    構成に対する私の態度は?それはあまりにも頻繁にあまりにも不自然に行われ、ユーザが設定可能な値の100を突きつけようとするとTCOが増加します。必要な場合にのみ、構成可能性(ソフトコーディング)を追加してください。

    必要なとき...設定可能な値は、ユーザーの入力と同じ不信で処理する必要があり、入力が悪いときは明快なエラーメッセージを表示する必要があります。ほとんどのコンポーネントは、データアクセスインフラストラクチャから分離するのと同じように、構成インフラストラクチャから分離する必要があります。構成インフラストラクチャから切り離されると、構成システムからのさまざまな「入力」の処理方法をテストすることができます。最も重要なことは、プログラムは最低限の構成で正常に動作するはずです。

    ただし、アンチパターンのこのタイプは非常に一般的です:

    File.Open(configuration["widgetsFileStorage"] + "/" + widgetImage) 
    

    またはこの(あなたがこれまでのhrefに直接ユーザー入力を置く私はどういうわけか、多くの人がこれまでの設定値を信頼しないでしょうか?。過度に )。

    LinkWriter.href=configuration["supportUrl"] 
    

    いつ設定しますか?あなたが証明するように、あなたは必要です。心配の良い分離は、後の時点で値を設定することを容易にするでしょう。私は、ファイルをファイルロケータに配置する責任を負います。

    File.Open(new WidgetFileLocater().GetUncPath(widgetImage)) 
    

    私のファイルロケータの後ろどこかの設定ファイル、データベースを参照する場合もあれば、そうでない場合もあります。おそらく、アプリケーションディレクトリの "images"ディレクトリにハードコーディングを開始します。柔軟性のためのユースケース(誰かがSAN上に置くことを望んでいるか?とにかく、アプリのほとんどは、設定されているかどうかではありません。私はおそらく、ファイルロケータにいくつかの依存関係注入を使用して、設定ファイルから不正な入力を正しく処理したことを確認していました。

    また、構成はほとんど常に緩やかに型付けされており、コンパイルされていないため、コードよりも危険です。このリスクは開発者には敬遠されることはほとんどありません(しかし、システム管理者が大いに尊重します)。私はpython/ironpython/booのようなスクリプト言語を使用して設定の必要性を議論しました。私は、コンパイル後に、XMLやテキストよりはるかに自由な構文と型チェックを使って、内容を変更することができます。

    警告:私の態度は、繰り返しのリリースサイクルを前提としています。 Microsoftのように2〜10年のリリースサイクルをお持ちの場合は、さらに多くの値を設定することを推奨します。

    関連する問題