一般的な用途で自動が嫌いな理由はいくつかあります。
- コードを変更せずにリファクタリングできます。はい、これはautoを使用する利点としてしばしばリストされるものの1つです。関数の戻り値の型を変更するだけで、それを呼び出すコードがすべてautoを使用する場合、追加の作業は必要ありません!あなたはコンパイルをヒットし、ビルドします-0警告、0エラー-そしてあなたは先に進み、機能が使用されている80の場所を調べて潜在的に変更するという混乱に対処することなくコードをチェックインします。
しかし、待って、それは本当に良いアイデアですか?半ダースのユースケースで型が問題になり、そのコードが実際に異なる動作をするようになったらどうなるでしょうか?これは、入力値だけでなく、関数を呼び出す他のクラスのプライベート実装の動作自体を変更することにより、カプセル化を暗黙的に破ることもできます。
1a。私は「自己文書化コード」の概念を信じています。自己文書化コードの背後にある理由は、コメントが古くなる傾向があり、コードが行っていることをもはや反映しなくなるのに対し、コード自体は-明示的な方法で記述されている場合-自明であり、常に最新であるその意図に基づいて、古いコメントと混同することはありません。ただし、コード自体を変更することなくタイプを変更できる場合、コード/変数自体が古くなる可能性があります。例えば:
auto bThreadOK = CheckThreadHealth();
問題を除いて、ある時点でCheckThreadHealth()がリファクタリングされ、boolではなく、エラーステータスを示す列挙値があればそれを返します。しかし、その変更を行った人は、この特定のコード行の検査を見逃し、警告やエラーなしでコンパイルされたため、コンパイラは役に立ちませんでした。
- 実際の型が何であるかを決して知ることはできません。これは、多くの場合、自動車の主要な「利点」としてリストされています。「だれが気にしますか?それはコンパイルされます!」と言うことができるとき、なぜ関数があなたに与えているものを学ぶのか。
たぶん作品の一種です。ループの繰り返しごとに500バイトの構造体のコピーを作成しているので、1つの値を検査できますが、コードはまだ完全に機能しているため、一種の動作を言います。そのため、単体テストでも、その単純で無邪気な外観の自動車の背後に不良コードが隠れていることに気付くことはありません。ファイルをスキャンする他のほとんどの人は、一見しただけでは気づかないでしょう。
タイプがわからない場合、これはさらに悪化する可能性がありますが、それが何であるかについて間違った仮定をする変数名を選択すると、実際には1aと同じ結果を達成しますが、最初からではなくリファクタリング後。
- 最初にコードを記述するときにコードを入力することは、プログラミングの最も時間のかかる部分ではありません。はい、autoは最初にいくつかのコードの記述を高速化します。免責事項として、私は> 100 WPMと入力するので、他の人ほど気にしないかもしれません。しかし、私がしなければならないのが終日新しいコードを書くことだったら、私は幸せなキャンピングカーになります。プログラミングの最も時間のかかる部分は、コードの再現が難しいエッジケースのバグを診断することです。これは、多くの場合、微妙な非自明な問題に起因します。符号付きと符号なし、フロートと整数、ブールとポインタなど)。
autoは主に、標準ライブラリテンプレートタイプを使用したひどい構文の回避策として導入されたことは明らかです。既に慣れ親しんでいるテンプレート構文を修正しようとするのではなく(既存のすべてのコードが壊れる可能性があるため、ほぼ不可能かもしれません)、基本的に問題を隠すキーワードを追加します。基本的に、「ハック」と呼ばれるものです。
実際、標準ライブラリコンテナでautoを使用することに異論はありません。それは明らかにキーワードが作成されたものであり、標準ライブラリの関数は基本的に目的(またはその種類)で根本的に変更される可能性が低いため、自動で比較的安全に使用できます。しかし、より揮発性が高く、より根本的な変更の対象となる可能性のある独自のコードとインターフェイスで使用することには非常に慎重です。
言語の機能を強化するautoのもう1つの便利なアプリケーションは、型に依存しないマクロでの一時的な作成です。これは以前は本当にできなかったことですが、今はできます。
auto
多くの場合、すでに読みにくいときに物事を読みにくくします。つまり、関数が長すぎる、変数の名前が不適切などです。