Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

メソッド分割による処理の単純化 #176

Merged
merged 2 commits into from
Sep 29, 2019

Conversation

ochaochaocha3
Copy link
Member

CodeClimateでCognitive Complexity(コードの複雑さ)が大きいと指摘されたメソッドを分割して、処理を単純にしました。

CodeClimateでCognitive Complexityの問題を指摘された箇所。
メソッドを分けて単純な処理にする。

また、不要なテストを削除した。
CodeClimateでCognitive Complexityの問題を指摘された箇所。
メソッドを分けて単純な処理にする。
# @return [Array<Cinch::Target>]
# @note Cinch::Channel, Cinch::User は、どちらも Cinch::Target の
# サブクラスのため、Cinch::Target と同様に扱う。
def to_cinch_target_array(targets)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1つのメソッドで処理をしていたときには処理を統一できませんでしたが、メソッドを分割したことで、 to_cinch_target_array と to_cinch_target でほぼ同一の処理をしていることが明確になりました。
メソッドを統一し DRY に出来ないでしょうか。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

両者の case 式の when 節の部分が同じですが、返すのが配列かそうでないオブジェクトかという違いがあるので、これ以上の統一は難しいように思えました(統一しようとすると、結局 if でフラグを見るのが必要になりそうです)。

end
@plugin_paths = config.plugins.map { |name|
[name, "#{PLUGINS_ROOT_PATH}/#{name.underscore}"]
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

複数行からなるブロックは {} ではなく、do - end 構文を使うように統一していたと思います。
今回の {} の採用には何か意味があるのでしょうか。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

最近は、ブロック付きメソッド呼び出しの戻り値を使う場合 { } を使うようにしていました。特に mapselectreduce では、戻り値を変数に代入したり、メソッドチェーンで戻り値をさらに利用したりするので、ほぼすべてで { } を使っているのではないかと思います。log-archiverでも、例えば以下の部分で { } を使っていました。
https://github.com/cre-ne-jp/log-archiver/blob/684282991d9582765fd6d09602d3acee53e56beb/app/models/hour_separator.rb#L31-L32

do ... end については、戻り値よりブロック内でする(do)こと(≒副作用)に主眼を置く場合に使っていました。

外部では、クックパッドのスタイルガイドで、この書き方について言及されています。

  • [MUST] ブロック付きメソッド呼び出しでは、do/end 記法でブロックを書くこと。i.e. blockの副作用が目的

  • [MUST] ブロック付きメソッド呼び出しの戻り値に対して処理を行う場合は、ブロックを中括弧で書くこと。

    # good
    puts [1, 2, 3].map {|i|
      i * i
    }
    
    # bad
    puts [1, 2, 3].map do |i|
      i * i
    end
    
    # good
    [1, 2, 3].map {|n|
      n * n
    }.each {|n|
      puts Math.sqrt(n)
    }
    
    # bad
    [1, 2, 3].map do |n|
      n * n
    end.each do |n|
      puts Math.sqrt(n)
    end

@@ -26,32 +25,46 @@ def initialize(config)
# 読み込みエラー時に該当要素をスキップするか
# @return [Array] 読み込んだプラグイン構成要素のクラスの配列
def load_each(component_name, skip_on_load_error = false)
loaded_classes = component_paths(component_name).map { |class_name, path|
try_load(class_name, path, skip_on_load_error)
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

{} と do - end 構文の使い分けについて、同上です。

end
@plugin_paths.map { |name, path|
["#{name}::#{component_name}", "#{path}/#{component_name_underscore}"]
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

{} と do - end 構文の使い分けについて、同上です。

@@ -26,32 +25,46 @@ def initialize(config)
# 読み込みエラー時に該当要素をスキップするか
# @return [Array] 読み込んだプラグイン構成要素のクラスの配列
def load_each(component_name, skip_on_load_error = false)
loaded_classes = component_paths(component_name).map { |class_name, path|
Copy link
Member

@koi-chan koi-chan Sep 26, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この行は長すぎるという指摘対象にならないでしょうか。

loaded_classes = 
  component_paths(component_name).map do |class_name, path|

このように書き換えた方が良いと思います。

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ぎりぎりですが80文字以内(79文字)だったので、OKにさせてください😅

@koi-chan
Copy link
Member

動作確認は出来ました。

@koi-chan
Copy link
Member

レビューの返信、ありがとうございました。すべて承知しました。
マージお願いします。

ブロックの書き方は、既存の他のコードも今回の基準で随時書き直していきたいと思います。

@ochaochaocha3
Copy link
Member Author

こちらこそ、レビューありがとうございました。それではマージいたします。

@ochaochaocha3 ochaochaocha3 merged commit 80c387c into master Sep 29, 2019
@koi-chan koi-chan deleted the reduce_cognitive_complexity-20190926 branch November 3, 2019 05:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants