[...]他のプログラマーが何らかの種類のデータ編成の一貫性を壊すのを防ぐためにプライベートスコープで制限することが非常に重要である理由をはっきりと説明できる人は誰もいません。
十分に小さなコードベースを備えた十分に小さなチームで、優れた標準(たった1人)と十分に調整されている場合、誰でもすべてのデータフィールドを操作できるように、すべてのデータを公開する信頼できるソフトウェアを見つけることができます。struct
大きく開いたとして暴露struct
アクセスにそのヘッダを含む誰のための広いオープン定義。マーフィーの法則は、これらの場合に常に適用されるわけではありません。
しかし、私は、数百万のLOCがあり、80年代にさかのぼる巨大なコードベースの反対のシナリオで作業してきました。かろうじて同じ言語、人々がとにかく従わないことが多いSDK以外のコーディング標準、ユニット/統合テスト、ブランチなしのSVNの使用、場合によってはコードをチェックインせずに6週間、バグで爆破すること、およびそれまでは、情報を隠蔽して不変条件を維持することの価値を本当に理解していました。
私は自分のマシンで一貫して問題を再現することさえできず、時にはチーム全体の間で誰もできなかったバグに対処しました。そして、あらゆる種類の試行錯誤の後で、ユーザーから報告された問題またはそれに似た問題をようやく幸運に再現できたとき(そして、試行錯誤は、ソフトウェアの非効率性とユーザーエンドの生産に対するデバッグでの実行との組み合わせにより、多くの場合、数時間かかりましたデータは、データをロードするためだけに15分以上かかることがよくあります)。文字列の長さがのようなガベージネガティブ数に設定されstruct
ている文字列型の場合は、までトレースします。len
-921141282
それは決して起こらないはずですが、誰がそれをしたのですか?したがって、メモリブレークポイントを設定して調べる必要があり、最終的に設定したとき、それは、初期化されていない変数の算術演算のカスケード相互作用のようであり、最終的には文字列len
フィールドが負のガベージ番号に設定され、そのコードにはありませんでした数年で変更されました。それはレーダーの下を飛んだ。
そして、すべてその時、このような多くのバグに遭遇した後、私はそれだけで使用した場合どのくらいの、より信頼性の高い当社のソフトウェアは次のようになり、自分自身に考えたgetters
とsetters
?ゲッターとセッターは一般に、可能な最悪の種類のインターフェース設計を示しますが、誰かが文字列の長さを負の値に設定しようとした場合、セッターは少なくともアサーションエラーをトリガーする可能性があります。私たちはそのバグの年を捕まえることができた以前は秒単位で導入された正確な時間であり、何時間もの調査努力の集大成ではありません。そして、それは開発者として利己的に考えているだけです。ユーザーとQAチームを救うことができた悲しみのすべての時間をカバーしているわけではありません。あなたが徹夜で修正した最近の35のバグに直面してセッターとゲッターを使用した場合、システムがどれほど良くなるか夢見ているときに、システムがかなり悪い場所にあることを知っています。
structs
これらのデータフィールドにアクセスするシステム内の場所を見つけるためだけに、他の誰もこれらのデータフィールドにアクセスするべきではないという方法で文書化されたケースさえありました。
したがって、これらは、最悪のシナリオに直面することによって本当に最大限に感謝することができるものですが、十分に調整されたチームと小さなコードベースで残りの人生を過ごすのに十分な運がなければ、多くの場合そうなるでしょう。強力なコーディング標準。
C ++の美しいコードは何ですか[...]?
それは難しいことです。私はまだそれを理解しようとしています。私が長年にわたって書いた、または少なくとも信頼性が高く、比較的時代を超えて安定している(変更を必要としない)少なくとも、私が美しく考えるコードのほとんどはCで、最近はLuaで書かれました。私はまだ、数年後にそれを振り返ることができず、少なくともそれを変更できればよいと思うまで、時の試練に合格しているように見えるC ++コードを書くのに苦労しています。C ++ 11からずっと簡単になっているように感じますが、変更を確認せずにコードがどれだけうまく機能しているかを確認するには、何年か必要です。私にとっての究極の「美しさ」は「安定性」です。それ以上の変更を必要とせず、誘惑すらしなくても、関連性があり、今後何年にもわたって役立つコードのように、