はじめに
先日、職場で「自分が 改修したor 書いちゃった いちばんやべー関数」ネタで盛り上がりました。
みんないろいろ話してくれましたが、やっぱり僕の書いた「コマンドパターンのメインループ関数(1500行)」の圧勝でした。
なんであんなコード書いたんだろ。
そこで、今日は僕の傷ついたプライド癒すべくgithubから「世界でいちばんやべー関数」を発掘します。
つまり、「俺が書いた関数よりやべー関数に会いに行く」
結論
- マジでやべー関数は次の2つ
- 「opencvリポジトリのcv::agast_cornerScore<AgastFeatureDetector::AGAST_7_12s>関数」(複雑度1868)
- 「SuiteCRMリポジトリのOpenTag関数」(複雑度1509)
- 言語毎の傾向に着目すると...
- javascriptにはやべー関数が多い
- python/java/swift/rubyはきれいな関数が多い
方法
やべー関数ってなんだよ
ここでは、以下の手続きでやべー関数を洗い出します。
- 「循環的複雑度が高い関数」を洗い出す。
循環的複雑度はlizardを使って算出しました。 - 本当にやべー関数に絞り込む
中身を見て、テストコードとか自動生成コードを除外する。
対象リポジトリの決定
github-trending-apiを使い、
以下の言語の最近1カ月の人気プロジェクトを抜き出して、やべー関数を探します。
- C
- C++
- Python
- Java
- JavaScript
- Swift
- Ruby
- PHP
- Scala
- Golang
- Lua
コード
テストとか全くしてねぇ
cycro
結果
1.「循環的複雑度が高い関数」を洗い出す
コードの中身とか考えず、複雑度が高い関数Top10は以下の通り。
No | 複雑度 | 関数名 | プロジェクト名 | 言語名 |
---|---|---|---|---|
1 | 5505 | jo | node | javascript |
2 | 2013 | matchIcon | edex-ui | javascript |
3 | 2001 | foo | llvm-project | cpp |
4 | 1947 | *global* | node | javascript |
5 | 1868 | cv::agast_cornerScore<AgastFeatureDetector::AGAST_7_12s> | opencv | cpp |
6 | 1647 | int | kubernetes | go |
7 | 1532 | foo | llvm-project | cpp |
8 | 1509 | OpenTag | SuiteCRM | php |
9 | 1504 | foo | llvm-project | cpp |
10 | 1453 | iT | node | javascript |
2. 本当にやべー関数に絞り込む
コードの中身を実際に見てみると...
No | 複雑度 | 関数名 | プロジェクト名 | 言語名 | 備考 |
---|---|---|---|---|---|
1 | 5505 | jo | node | javascript | 難読化してるため |
2 | 2013 | matchIcon | edex-ui | javascript | if文を2000個並べてるだけ |
3 | 2001 | foo | llvm-project | cpp | テストのために&&を2000個並べてるだけ |
4 | 1947 | *global* | node | javascript | 難読化してるため |
5 | 1868 | cv::agast_cornerScore<AgastFeatureDetector::AGAST_7_12s> | opencv | cpp | こいつはやばい |
6 | 1647 | int | kubernetes | go | パーサジェネレータで自動生成したコード |
7 | 1532 | foo | llvm-project | cpp | テスト用コード |
8 | 1509 | OpenTag | SuiteCRM | php | こいつはやばい |
9 | 1504 | foo | llvm-project | cpp | テスト用コード |
10 | 1453 | iT | node | javascript | 難読化してるため |
結論
備考欄記述の通り、以下の二つが本当にやべー関数。
実際のコードは君の目で確かめてくれ!(長すぎて張れない)
No | 複雑度 | 関数名 | プロジェクト名 | 言語名 | 備考 |
---|---|---|---|---|---|
5 | 1868 | cv::agast_cornerScore<AgastFeatureDetector::AGAST_7_12s> | opencv | cpp | こいつはやばい |
8 | 1509 | OpenTag | SuiteCRM | php | こいつはやばい |
言語間の複雑度の比較
言語毎に複雑度の分布をプロットしてみた。
外れ値を含むバイオリンプロット
外れ値を含まないバイオリンプロット
言語毎に平均値±2*標準偏差の範囲外の値を除外すると、以下の通り。
最後に
なんか間違ってても勘弁して...