15年間のC ++の後、私はまだconstを使うことを愛することを学んでいません。私はそれが使用されていることを理解していますが、実際にconstが正しいことで私が直面していた問題を回避できる状況になったことはありません。
それでは、どのようにconstの利点を愛するようになりましたか?
15年間のC ++の後、私はまだconstを使うことを愛することを学んでいません。私はそれが使用されていることを理解していますが、実際にconstが正しいことで私が直面していた問題を回避できる状況になったことはありません。
それでは、どのようにconstの利点を愛するようになりましたか?
回答:
哲学を受け入れようとするまで、私は納得しませんでした。
最初const
に、最も基本的なクラスメンバーとメンバー関数引数の実際に読み取り専用のメンバーに配置することから始めました。
そこから、私はもうコンパイルできませんでした。その後、これらの基本クラスを使用してコードに取り組み、以前のconst
追加が実際にそれらを使用した場合と比較して本当に正当かどうかを確認しました。コードの他の部分に一定性を追加することで、途中でいくつかのバグを修正するのに役立ちました。
伝染性です。ほとんどのコードはより安定しており、デバッグする方が簡単であることがわかりました。これは、修正すべきでないものを変更し始めた場合にコンパイラが停止することを確信できるからです。
アプリケーションを再び実行すると、バグが少なくなり、コードを読むときに理解しやすくなり、より速くなりました(仕事に適さないとわかったいくつかのアルゴリズムを変更する必要がありました)。
私は確信しました。
今、私はあなたが新しいコードを書いたり、現在のコードを変更しなければならないときに自信を感じるので、constnessに加えて多くのアサーションを使用しているとさらに良いと思います。コンパイラは、必要に応じて停止することを知っています。変更するべきではないものすべてをチェックする必要があることを忘れることができ、ビジネス固有の思考やアーキテクチャー思考のための思考時間を増やすことができます。
const
私が上ですくい取ることができ、コード読み取り時に、私は変更する必要はありません知っていることも、ローカル変数のためにこの方法をif
かfor
、私の変数が一定である、私は:またはwhatelseを変わらないことを知ってください!最適化についてはあまり気にすることはできませんでしたが、私は脳が限られており、インデントのレベルが少ない+ const-correctnessは大いに役立ちます!
私はオブジェクト指向プログラミングの支持者ではありませんでしたが、もし何かがあったとしても、一般的にプログラミングについて学べば学ぶほど成長率は下がります。さまざまなプログラミングパラダイムを研究しているうちに、不変性はプログラム設計の中心概念の1つであり、あらゆる哲学に従って書かれたソフトウェアに影響を与えることに気付きました。関数型プログラミングでは、単純な安全性保証に加えて最適化と同時実行性に影響を与えるため、非常に重要です。
基本的に、不変状態になり得る正当な理由がない限り、不変である可能性のあるものはすべておそらくそうです。私の経験では、この目標を追求して任意の言語でプログラムを作成すると、より安全で優れたコードになります。const
該当する場所を使用しても、失うものは何もありません。不変性は無料です。
(ちなみに、const
明示的に修飾されていない限り、すべての型がC ++の方言用にGCCのフォークを作成するというアイデアをいじりましたmutable
。
オブジェクト指向の観点から、不変性は無制限の書き込みアクセスを防ぐことによりカプセル化を実施します。不変オブジェクトは自身の状態を完全に管理する必要があるため、通常の値のように動作するため、クラス間の結合が減少します。定数の正確性は、特に並行プログラミングのコンテキストで、プログラムの正確性を証明するプロセスを大幅に容易にします。C ++参照およびC ++ 0x右辺値参照セマンティクスを使用すると、不変オブジェクトをあらゆる場所にコピーするオーバーヘッドを心配することなく使用できます。さらに、ほとんど不変のオブジェクトで作業している場合、コンパイラはかなり驚くべき最適化マジックを実行できます。
const
どこにでも入力するのは面倒ですが、あなたはすぐに慣れてしまい、信頼性と保守性の面で時間の経過とともに利点が明らかになります。私は素晴らしい作家ではないので、それを主張することは証明された難しい仕事のようですが、プログラムの設計と実装の際に開発者としてconstの正確さが非常に役立っていることを知っています。この点で最高の先生。
mutable
、constの正確性に関して明確な意味を持っていることをお勧めします。つまり、このデータオブジェクトは、オブジェクトの動作に影響を与えない方法で変更でき、回答のキャッシュなどを許可します。別のキーワードを作成します。
mutable
論理的な選択です。void alter(mutable Point&)
同じように、理にかなっているmutable int foo
ローカル変数のために、そしてどちらも既存の言語や既存の使用とこれらの競合のmutable
。また、Object mutable* mutable
それが必要か正しいかについて警告するほど怖いようです。
constの正確性の利点は、プログラムに規律を課し、プログラムの一部について推論しやすくすることです。
規律は、どこで何かが変わる可能性があるかを知る必要があるということです。対応する利点は、状態を変更している可能性があるものを特定できる場合に、コードの一部が何をするのかを簡単に確認できることです。
ビーイングconstの正しいことは、私はキャスト演算子を使用していない同様の問題に近い治療設計の正しさを強調しています。キャストを使用せず、constを正しく使用せず、可変の最小限の使用- これらはすべて、デザインの良さを測定するためのポインターですが、手元の全体的な問題を解決するための実際のツールではありません。
PS:私はそれを使うことの正確さconst
を理解すると、完全に確信しました;)
私はそれが可能であると知ってすぐに改宗者になりました。「良いプログラミングスタイル」の観点からそれは理にかなっています。constが正しいのが良い習慣である理由はさまざまです。
他の回答でカバーされている2つのポイントを要約し、新しいポイントを追加するには:
const
APIのユーザーにコードを文書化します。関数とその呼び出し元の間で、関数がパラメーターを変更しないというコントラクトを形成します。(const_cast
関数がそのパラメーターを変更できるようにすることはできませんconst
。パラメーターを変更せずに注釈を忘れた他の関数にそのパラメーターを渡すことができます。)ループ不変式と同じ方法。
const
コンパイラーに対する意図を文書化します。コンパイル時にミスを見つけることは、そのコードが実行されるのを待つよりも常に優れています。
const
型安全なポリモーフィズムには必要です。ポインター(生のポインターだけでなく、すべての形式で)は、共変である場合にのみ共変ですconst
(注:「constへのポインター」とは異なります)。共分散には読み取り専用インターフェイスが必要であり、反分散には書き込み専用インターフェイスが必要です。
これらの2番目は最初に学んだ。const
ポインターと参照パラメーターのターゲットのみで開始しましたが、エラーを早期に検出してローカルで使用するなどの利点を確認し始めるまでは
その後、ほとんど#define
のsが(C ++で)グローバル定数に置き換えられ、型安全性の利点が追加されることを学びました。そこで私もそれを使用しました。
最後に、型システムとラムダ計算のクラスを取り、型const
と非const
型が根本的に異なることを学習しました(異なる操作をサポートしているため)。それ以来、const
。