副作用を最小限に抑える(理想的にはありません)
独自のスコープ外の状態に3つの変更を引き起こす関数は、単に何かを入力し、他の何かを出力する関数よりも推論および保守がはるかに困難です。関数が何をするのかを単に知ることはできません。それが何をしたのか、それが他のすべての関連関数にどのように影響するのかを覚えておく必要があります。
OOPの場合、副作用を最小限に抑えるということは、メンバーが少ないクラス、特にクラスの状態を変更できるメンバーが少ないことを意味します。メンバー関数は、自身の状態を超えて状態を変更でき、副作用があるからです(クラスの内部を操作できるなど)。また、独自のデータメンバが少ないクラスを意味するため、これらのメソッドが改ざんされる状態が少なくなり、副作用が発生しにくくなります。
簡単な例として、sorted
バイナリ検索とリニア検索のどちらを実行するかを決定するために使用する状態を維持できる、ファンシーなデータ構造を設計しようとすることを想像してください。このような場合、デザインを2つのクラスに分けると便利です。sorted
ソートされていないクラスを呼び出すと、そのコンテンツを常にソートしたままにする別のクラスのデータ構造が返される場合があります。これで、副作用が少なくなり(したがって、エラーが発生しにくくなり、コードを理解しやすくなります)、より広く適用できるコードになります(前の設計は、ソートする必要のない小さな配列の処理と人間の知的効率の両方で無駄になります)。
余分な外部依存関係を回避する
13の異なるライブラリを使用して比較的単純なタスクを達成することにより、最大限のコード再利用で想像可能な最も簡潔なコードを実装できる場合があります。ただし、13の異なるライブラリの少なくとも一部を理解させる必要があるため、読者に知的オーバーヘッドが移ります。この固有の複雑さは、機能するために他の多くのライブラリを引き込んで構築する必要があるサードパーティのライブラリを構築および理解しようとした人なら誰でもすぐに認識されるはずです。
これはおそらく非常に物議を醸す見解ですが、最終結果が十分にテストされている場合は、控えめなコードの複製を反対の極端に好むでしょう(テストされていない欠陥のあるコードが何度も複製されるより悪いことはありません)。ベクトル外積を計算するための3行の複製コードと、3行のコードを削るだけの壮大な数学ライブラリを選択する場合は、チーム全体がこの数学ライブラリを使用していない限り、前者をお勧めします、その時点で、デカップリングの利点と引き換えに十分に簡単な場合、1行ではなく3行のコードを記述することを検討することもできます。
コードの再利用はバランスのとれた行為です。再利用しすぎると、上記で保存した3行の単純なコードのように、読者とメンテナーが3行のコードよりもはるかに多くの情報を理解する必要があるため、知的複雑さを1対多の方法で転送します。また、数学ライブラリが変更されるとコードも不安定になるため、コードの安定性が低下します。再利用が少なすぎると、知的オーバーヘッドも増加し、コードは中央の改善の恩恵を受けなくなりますので、バランスをとる行為ですが、バランスのとれた行為であるという考えは、あらゆる小さな形式の控えめな複製を排除しようとする可能性があるため、言及する価値があります反対の極端よりも、維持するのが難しいとしても、それ以上ではありません。
廃品をテストする
これは当たり前のことですが、コードがすべての入力ケースを処理せず、一部のエッジケースを逃した場合、目や手に転送される直前に取得できなかったコードを他の人が維持することを期待できますか?そもそも完全に正しくなかったコードはもちろんのこと、完全に機能するコードに変更を加えることは十分に困難です。
それに加えて、徹底的なテストに合格したコードは、一般的に変更する理由が少なくなります。これは、変更する必要のない安定したコードにはメンテナンスコストがかからないため、保守性よりも達成すべき聖杯である安定性に関連しています。
インターフェースドキュメント
両方を文書化するために同じ時間を割くことができない場合は、「物事がそれを行う方法」よりも「物事が行うこと」を優先します。すべての可能な入力ケースで何をするか(または少なくとも、何を行うべきか)についての意図が明白な明確なインターフェースは、どのようにコードを使用するだけでなく、それがどのように機能するか。
一方、人々がそれが何をすべきかさえ知らないこれらの品質を欠くコードは、その実装の詳細がどれだけよく文書化されていてもSOLです。ソースコードの実装方法に関する20ページのマニュアルは、そもそもどのように使用されるべきか、あらゆるシナリオで何を行うべきかを正確に把握することさえできない人々にとっては価値がありません。
実装面では、他のユーザーとは異なる方法でドキュメント化することを優先してください。例として、Intelにはレイトレーシングカーネル用の境界ボリューム階層があります。私はこの分野で働いているので、ドキュメントを調べなくても、彼らのコードが実行していることの大部分を一目で理解できます。ただし、BVHを横断し、光線パケットを使用して交差点を並行して実行するというアイデアである、独自の何かを実行します。コードのこれらの部分は、ほとんどの歴史的なBVH実装からエキゾチックで珍しいので、私は彼らにドキュメントの優先順位をつけて欲しいのです。
読みやすさ
この部分は非常に主観的です。人間の思考プロセスに近い種類の読みやすさについてはあまり気にしません。著者が問題を解決するために奇妙で複雑な思考プロセスを使用している場合、最高レベルで物事を説明する最もよく文書化されたコードをフォローするのは依然として困難です。一方、ロジックが非常に単純であれば、2文字または3文字の名前を使用した簡潔なコードの方が理解しやすいことがよくあります。査読をして、他の人が何を好むかを見ることができると思います。
私は主に保守性と、さらに重要なことには安定性に興味があります。変更する理由が見つからないコードは、メンテナンスコストがゼロです。