Help us understand the problem. What is going on with this article?

githubで最もやべー関数を発掘する

はじめに

先日、職場で「自分が 改修したor 書いちゃった いちばんやべー関数」ネタで盛り上がりました。
みんないろいろ話してくれましたが、やっぱり僕の書いた「コマンドパターンのメインループ関数(1500行)」の圧勝でした。
なんであんなコード書いたんだろ。

そこで、今日は僕の傷ついたプライド癒すべくgithubから「世界でいちばんやべー関数」を発掘します。
つまり、「俺が書いた関数よりやべー関数に会いに行く」

結論

  • マジでやべー関数は次の2つ
  • 言語毎の傾向に着目すると...
    • javascriptにはやべー関数が多い
    • python/java/swift/rubyはきれいな関数が多い

方法

やべー関数ってなんだよ

ここでは、以下の手続きでやべー関数を洗い出します。
1. 「循環的複雑度が高い関数」を洗い出す。
   循環的複雑度はlizardを使って算出しました。
2. 本当にやべー関数に絞り込む
   中身を見て、テストコードとか自動生成コードを除外する。

対象リポジトリの決定

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 こいつはやばい

言語間の複雑度の比較

言語毎に複雑度の分布をプロットしてみた。

外れ値を含むバイオリンプロット

alt

外れ値を含まないバイオリンプロット

言語毎に平均値±2*標準偏差の範囲外の値を除外すると、以下の通り。
alt

最後に

なんか間違ってても勘弁して...

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away