コーディングの規約とガイドラインに従うことでコードの一貫性が向上するが、運用を誤ると残念な結果につながることがある。 Arne Mertz氏は、規約やガイドラインの採用範囲をソフトウェア開発者で選択し、逸脱箇所を明確に文書化しておくことを提案している。こうすることで、開発者同士がコミュニティや日々の仕事の中でエクスペリアンスを議論でき、不必要で煩雑な書類作業に煩わされることなく、コラボレーションの促進やコード品質の向上を目指すことができる。
Arne Mertz氏が、NDC Tech Townでコーディングの規約とガイドラインをテーマに講演した。
コーディングの規約とガイドラインは開発者の共同作業を促進し、より一貫性のある質の高いコード生成を可能にする。 しかしながら、運用を誤ると真逆の結果に陥ることがある。コードの可読性や最適性に問題が生じるほか、ときには間違った対処法になりかねない。詳細は、Mertz氏がInfoQの記事『 how to use programming rules and guidelines(コーディングの規約とガイドラインの使い方)』で語った通りである。
同氏は一例として、C++ Core Guidelineの「Don’t make data members const or references in a copyable or movable type(constまたは参照型のデータメンバはコピーやムーブができない)」という規約を挙げている。参照型に関する部分は重要だが、省略されることが多い。同氏は、以下のように説明している。
constメンバの再割り当てや、参照型メンバの参照先変更は行えません。そのため、constメンバや参照型メンバの割り当ては、通常不可能になっています。コンパイラもこうした型へのムーブ代入演算子やコピー代入演算子の生成ができなくなっています。従い、これらのメンバは、値のセマンティクスを持つように設計された型に使用すべきではないのです。
これらの値型がアプリケーションの大部分を占めることが多いが、値のセマンティクスを持たない型もあるとMertz氏は言う。その例として、アプリケーションサービスとリポジトリを挙げた。この例にアプリケーションサービスとリポジトリを挙げ、後者では、参照型メンバを持つことは完全に可能かつ一般的である、と同氏は語る。
Mertz氏は、どのガイドラインを採用し、どのように文書化するかを考えるよう提案する。SharePointの上の50ページにも及ぶWord文書では目を通すことすら稀になると言う。それでは、開発者がガイドラインを知る由もなく、ほとんどの内容が蔑ろになるだろう。
ガイドラインの多くは自動チェックが可能だ。一例としてはclang-tidyの使用があげられるが、特定のケースにあわせて警告をオフにする必要がある。と言うのも、ガイドラインは規約ほど拘束力のあるものではないからだと同氏は語る。
またMertz氏は、自社のC++コミュニティで盛んな交流がおこなわれており、さまざまなプロジェクトを通したデベロッパーエクスペリエンスの交換が行われていると述べた。より経験豊富な開発者が、質疑応答やアドバイスを共有することで、若手をサポートしていると説明する。
弊社では、C++のサンプルプロジェクトに典型的なclang-tidyファイルを使用しており、C++ Core Guidelinesなどの自動チェックにおいてセンシブルデフォルトの活用が可能になっています。
加えて、毎週行われている開発者向けの勉強会で顧客ガイドラインの記載内容が議題になることがあると述べる。しかし、開発者用ガイドラインが必要になった場合は、より具体的なものを自分たちで考案することもあると言う。
ガイドラインの作成プロセスは実用性重視であり、作業の計画性は高くありません。しかし、ここで時間をさくことで、煩雑な書類作業による業務負荷削減と一貫性やクオリティの高いコード生成の両立につながることが分かりました。
こうしたミーティングには、「技術的な振り返り」の側面もあり、自身にとっての最適解や、過去に特定のコードベースで陥った失敗を回避する術を議論する場になっている、と同氏は締めくくった。
InfoQは、コーディングの規約とガイドラインについてArne Mertz氏にインタビューした。
InfoQ:規約とガイドラインの違いはどのようなものですか?
Arne Mertz氏:程度に多少の差はありますが、規約は絶対です。適応箇所全体で順守する必要があります。一方、ガイドラインはベストプラクティスやセンシブルデフォルトであり、開発者ごとの差異も許容されます。ガイドラインは規約ではなく、絶対的な順守が求められてはいません。そのため、意図的にガイドラインから逸脱する場合は、理由をコメントなどで文書化することをお勧めします。
規約があると便利なものです。開発者や自動化ツールは、規約に照らし合わせて「誤り」であると指摘するだけで済みます。ただ、その後でコード修正をする必要があります。一方ガイドラインでは、自由の幅が広がるものの、より大きな責任を伴うことになります。自動操縦のように、ただシステムに従うだけとはいかないのです。 とはいえ、ガイドラインは重要なツールです。
InfoQ:ガイドラインの利用で、ソフトウェア開発チームにはどのようなメリットがあるのでしょうか?
Mertz氏:チームで共通のガイドラインに準拠すると、コード結果の予測が可能になります。コード設計の重要な原則にPrinciple of least astonishment(驚き最小の原則)があります。これに則ることで、コードの可動性や理解性を向上させることができます。
コードのガイドラインへの知識は、コードを作る側でなくとも役に立ちます。読み手にコーディングガイドラインや一般的なコーディング規約の知識があれば、コードの逸脱や注目すべき箇所の発見が容易になるのです。