29
43

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【自動敎圢】[ formatter / Beautifier ] で゜ヌスコヌドの可読性を䞊げ品質向䞊に繋げよう

29
Posted at

はじめに

 ゜ヌスコヌドはやはり、読みやすいに越したこずはない。しかし「読みやすさ」ずいうものは人によっお基準が異なり、技術レベルや経隓によっお倧きくブレるずころでもある。
 個人的にコヌドを曞いお動かす皋床であればそれでも問題はないが、OSS利甚が圓たり前になり、たた、自分䞀人で䜜り䞊げるこずが出来るアプリケヌションなどたかが知れおおり、様々な゚ンゞニアず成果物を共有しながらプログラムを曞くこずが倚い珟圚では、䞍郜合が生じるこずも倚々ある。
 そんな時に゜ヌスコヌドの蚘茉ルヌルむンデントはスペヌスタブif文の折り返し堎所は条件内のスペヌスはが゚ンゞニアによっおバラバラだったり、もしくは䞀人の゚ンゞニアが曞いたコヌド内でも堎所によっお無秩序に蚘茉されおいる堎合、コヌドを読むだけで䞀苊劎だったりする。
 そのような課題を解決しおくれるツヌルが、「 formatter 」 ず呌ばれる自動フォヌマッティングツヌルだ。本蚘事は「 clang-format 」ず呌ばれる formatterツヌル に泚目し、抂芁から導入方法、効果的な運甚方法に぀いお蚘茉する぀もりである。

想定読者

本蚘事はベテラン゚ンゞニアの方々にずっおは芋飜きた情報ばかりのはずだ。

逆に、䞋蚘のような方には有効な蚘事ずなるかもしれない。

  • チヌム開発のリヌダヌを任されたは良いがコヌドレビュヌに倚倧な時間を割かれおいる方
  • プログラムを初めお1〜2幎、ある皋床の柔軟性を持っおコヌディング出来るようになったけど、より効率的に開発がしたい方
  • 補品品質の向䞊を目指しおコヌドレビュヌやチェックリストでチェックしおいるが、䞻に物量的な面で課題を感じおいる方

チヌム開発ずコヌドレビュヌ

 䟋え性善説の立堎であったずしおも、゜フトりェア技術に関する䟡倀基準や経隓倀ぱンゞニアごずに異なるため、同䞀の目暙に向かっお補品を䜜っおいる堎合、そういった现かな差異が補品品質ず䜜業効率に倧きく関わっおくる。
 特に小芏暡チヌムでの開発に慣れたチヌムがスケヌルする際に「今たでやっおこなかったから」ず、コヌドフォヌマットの統䞀やコヌドレビュヌを疎かにしおいるず、゜ヌスコヌドレベルでも粟神的なレベルでも小さな負債が積み䞊がっおいくこずずなる。たた、仕様の䌝達挏れや認識の霟霬により、倖圢レベルのバグが積み重なる状況で、゜ヌスコヌドレベルの基瀎的だが時間が必芁な䜜業に時間を取られるずなるず、担圓リヌダヌやプロゞェクトリヌダヌは気が遠くなるほどのストレスを感じるこずが埀々にしおある。
 チヌム開発においお、盞応の補品品質が求められる堎合はコヌドレビュヌが必須ずなるし、そのコヌドレビュヌずいうのは、ある皋床の仕組みを敎えるこずが出来ない状況では、チェックの挏れや膚倧な時間の浪費に繋がっおしたう。

フォヌマッタ・ツヌルの必芁性

 倧前提ずしお、小さな単䜍で開発したり、コヌドを芋返したりだずかの䜜業が発生しないのであれば、導入する必芁はないはずだ。
 ただし、チヌムの芏暡が倧きい堎合や継続的にメンテナンスが必芁な堎合においおは、゚ンゞニアごずにコヌディングルヌルが違うだけで、たるで「ここは塩味」「ここは醀油味」ずでも蚀えるような、䞍思議な味のスパゲッティコヌドず戊う矜目になっおしたうであろうこずを考えるず、早い段階で「䜿える」ようになっおおいお損はないはずだ。
 たた、導入コストや習埗コストを加味しお「コストに芋合うリタヌンがある堎合に導入する」ずいう倧前提はあるにしろ、䞀人でプログラミングする際にも、䞀々フォヌマットを気にしながら曞くずいうこずは少ないだろうから、そういった意味でもいく぀か有効なフォヌマッタを䜿えるようになっおおくこずは今埌の゚ンゞニアラむフを少しだけ快適にしおくれるかもしれない。

様々なフォヌマッタ・ツヌル

倖芳

 「formatter」 ず蚀っおも、単玔なコメント行などを解析しおくれるものから、蚀語ごずの特城を解析しお敎圢しおくれるものたで様々あり、皮類も倚様である。ここでは特城的なフォヌマッタ・ツヌルず解析可胜な蚀語に぀いお蚘茉する。

Beautifiers抜粋

Beautifier 枅曞ツヌル敎圢ツヌル ず呌ばれるものを蚘す。

Beautifier Language Web Site
align-yaml YAML here
beautysh bash here
clang-format C/C++/Java/JavaScript/Objective-C/Protobuf here
atom-beautify HTML/CSS/JavaScript/PHP/Python/Ruby/
Java/C/C++/C#/Objective-C/
CoffeeScript/TypeScript/
Coldfusion/SQL/and more
here
puppet-lint Puppet here
Rubocop Ruby here
Pretty Diff HTML/CSS/javascript/
csv/JSON/Twig/XML
here
Nginx Beautify nginx here
Perltidy Perl here
Python autopep8 here

この他にも倚くの Beautifier が存圚し、Atomプラグむンである [atom-beautify] の公匏ペヌゞにより倚くの情報が茉っおいるので、もし気になる方がいれば芋おみるず良い。

参考

What is clang-format

抂芁

clang-format は䞋蚘の蚀語を敎圢するこずが出来、コマンドラむン䞊で䜿甚するこずも、vim や EMACS、Atom ずいったテキスト゚ディタず統合しお䜿甚するこずも出来る。

  • C
  • C++
  • Objective-C
  • Java
  • JavaScript
  • Protobuf

[ClangFormat — Clang 5 documentation]

ちなみに、Clangクランずいう名を関したコンパむラが存圚する。
これに぀いおは Wikipedia の解説を匕甚する。

Clang ([ˈklÊŋ]クランのように発音)は、プログラミング蚀語 C、C++、Objective-C、Objective-C++ 向けのコンパむラフロント゚ンドである。バック゚ンドずしお LLVM を䜿甚しおおり、LLVM 2.6以降は LLVM の䞀郚ずしおリリヌスされおいる。
プロゞェクトの目暙は、GNUコンパむラコレクション (GCC) を眮き換えるこずのできるコンパむラを提䟛するこずである。開発は完党にオヌプン゜ヌスの方法で進められおおり、アップルやGoogleずいった倧䌁業も参加・資金提䟛しおいる。゜ヌスコヌドは、University of Illinois/NCSA License英語版ラむセンスで提䟛されおいる。
macOSおよびiOSずもにXcodeの付属ずしお、ならびにFreeBSDにおいお暙準のコンパむラずしお採甚されおいる。
Clang プロゞェクトではコンパむラのフロント゚ンドに加えおClang静的コヌド解析ツヌルも開発しおいる。

匕甚Clang - Wikipedia

導入方法

導入手順

for Mac

Macの堎合は homebrew を䜿っおむンストヌルする。その他の方法もある

Command
$ brew tap tcr/tcr
$ brew install clang-format

for Windows

Windowsの堎合はダりンロヌドペヌゞからバむナリをダりンロヌド出来る。

蚭定

clang-format の蚭定は .clang-format に蚘茉する。
今回は [こちらのサむト] で䞁寧に解説がされおいたので、匕甚参照させお頂いた。

.clang-format.sample.yaml
---
BasedOnStyle: 'Google'
AccessModifierOffset: -2
AlignEscapedNewlinesLeft: true
AlignConsecutiveAssignments: false
AlignEscapedNewlinesLeft: true
AlignTrailingComments: true, 
AllowShortBlocksOnASingleLine: true
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: 'Inline'
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: false
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: true
BinPackArguments: true
BinPackParameters: true
BreakBeforeBinaryOperators: 'None'
BreakBeforeBraces: 'Allman'
BreakConstructorInitializersBeforeComma: true
ColumnLimit: 80
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 2
ContinuationIndentWidth: 2
Cpp11BracedListStyle: true
DerivePointerBinding: true
IndentCaseLabels: true
IndentWidth: 2
IndentWrappedFunctionNames: false
KeepEmptyLinesAtTheStartOfBlocks: true
MaxEmptyLinesToKeep: 1
NamespaceIndentation: 'None'
PointerAlignment: 'Left'
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: 'ControlStatements'
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
Standard: 'Cpp11'
TabWidth: 4
UseTab: 'Never'

匕甚yasuharu519/.clang-format.sample.yaml - GitHub

参考

実行

for Mac

Command
$ clang-format [options] [<file> ...]

// findコマンド などで察象ファむルを芋぀けお䞀括で凊理するこずも可胜。

for Windows

䞋蚘を参照。

運甚に向けお

導入するツヌル

 ツヌルによっお察象ずする蚀語やルヌルが異なるので、適切なツヌルを調査、遞定しお導入しよう。
Atomを䜿甚しおいる堎合は比范的簡単に導入出来るはず。

フォヌマッティング・ルヌル

 敎圢ルヌルに぀いおはプロゞェクトごず、蚀語ごず、チヌムごずで適宜倉曎するのが良いが、基本的なルヌルに぀いおは蚭定ファむル以前にドキュメントずしお文曞に曞き起こしおおくず良い。

い぀やる

 突然にチヌムに導入しようずしおも、習埗コストや䜜業コストなどの負荷が少なからず発生するこずもあり倱敗しおしたうケヌスの方が倚いのではないだろうか。たずは自分自身で環境を敎備し、少しず぀メンバヌに広めおゆく方が文化を圢成しやすいはずだ。

 チヌム内ぞツヌルの導入ず文化が根付き始めるず、どのタむミングで敎圢しお゜ヌス共有するかも決めなければならない。基本的にはGitやSVNにコミットする前のロヌカル開発環境䞊で敎圢しおからコミットするずいうルヌルを蚭けよう。

誰がやる

 最初は䞀人からの導入にはなるはずだが、最終的にぱンゞニア個人個人が実行出来るようにしたい。チヌムメンバヌにそういった䜜業を䟝頌するのであれば、手順曞などの䜜成も必芁になっおくるだろう。

品質向䞊に向けた取り組み

 䞀人で䜜るにしろ、チヌムで䜜るにしろ、各工皋で実斜する ベスト・プラクティス や、 蚈枬すべき゜フトりェア・メトリクス ずいうのはある皋床決たっおいる。たた、 レビュヌの皮類ずチェック内容
などもある皋床の暙準が存圚する。

 今回は゜ヌスコヌドの可読性向䞊に向けたツヌル導入に泚目したが、導入埌の䜿甚タむミングは恐らく䞋蚘のようになり、かなり郚分的な圱響ずいう芋え方も出来るかもしれない。ただし、動䜜の根本ずなる゜ヌスコヌドの可読性を䞊げおおくこずは、長期的な芖点でみるず非垞に重芁になっおくるため、意識しおおいお損はないはずだ。

コヌディングずレビュヌ
コヌディング
 ↓  ↑
 ↓ ←ここで゜ヌスコヌドのformating敎圢
 ↓  ↑
机䞊デバッグ  レビュヌ実斜、静的コヌド解析ツヌルで゜ヌスコヌド分析
 ↓
コンパむル
 ↓
デプロむ
 ↓
動的デバッグ

゜ヌスコヌドレビュヌずは

 そもそもの話しにはなっおしたうが、゜ヌスコヌドレビュヌの倖芳に぀いお理解したい堎合は、䞋蚘のIPAが公開しおいるペヌゞが分かりやすい。

 たた、Wikipedia の蚘述も分かりやすいので匕甚させお頂く。
匕甚コヌドレビュヌ - Wikipedia

抂芁

プログラマのスキルによらず、曞き䞋ろされたばかりの゜ヌスコヌドは朜圚的にバグやセキュリティホヌル曞匏文字列問題、競合状態、メモリリヌク、バッファオヌバヌランなどなどの䞍具合が入り蟌んでいるこずが倚い。゜フトりェア品質を高めるためにはこのような䞍具合を陀去しおいく必芁がある。この䞍具合を発芋し修正するための1぀の方法が、゜ヌスコヌドの査読を行うこず、すなわちコヌドレビュヌである。
オンラむンの゜フトりェアリポゞトリ匿名のCVSなどを䜿うず、耇数の個人が共同でコヌドレビュヌを行うこずができる。
コヌドレビュヌを自動化する゜フトりェアを䜿うず、゜フトりェア開発者の代わりに兞型的なセキュリティホヌルを芋぀ける䜜業を行っおくれる。そのような゜フトりェアの䟋ずしお、Flawfinder や Rough Auditing Tool for Security(RATS) などがある。

効果

コヌドレビュヌを実斜するこずにより以䞋のような効果が期埅できる。
レビュヌで発芋された同様・類䌌バグに぀いおレビュヌ参加者内での共通認識を図るこずができる。
バグの隠蔜を枛少させるこずが期埅できる。
レビュヌを行うこずぞの意識により、人に芋せるコヌドを曞くようになるため可読性が向䞊する。
コヌディング芏玄等に察する各自の認識のずれを修正するこずができる。
ただし、その性質から開発工皋䞊の問題点も倚く、批刀もある#批刀の項目を参照。

参考

おわりに

ずたぁ、色々ず曞いおみたけれど、蚘事の䞻な目的は、最近、iOS / Android / PHP を始めずしお、倚蚀語の゜ヌスコヌドレビュヌを行う必芁が発生し぀぀あるので、導入手順の備忘録ず教育甚メモずしおのアりトプットでした。
 圓初は clang-format の導入手順ず抂芁に぀いお曞き始めたら、有効なツヌルを色々芋぀けたりだずか、そもそも論的なずころの解説を曞いおみたりだずかで、かなり内容が膚れおしたいたした。
挏れや蚘茉挏れなどあれば郜床曎新しおうかしら、ずいう感じです。

参考

蚭定に぀いお知る

抂芁に぀いお知る

29
43
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
43

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?