Slide 1

Slide 1 text

#ゆるWeb札幌 jPeekでのクラスの凝集度計測の試⾏ 
 山川広人(@gishi_yama) 公立千歳科学技術大学, Javaユーザグループ北海道 1

Slide 2

Slide 2 text

#javado Hiroto Yamakawa 2 公立千歳科学技術大学 情報システム工学科 専任講師 
 R&D: Experimental Development of ICT Services, Learning Technology, 
 Computer in Education, Programming & Programmer's Education 千歳市バスロケーションシステムの開発(2016-2022) 適応型学習支援システムの開発、活用 レポート内の話しことば診断システムの開発 大学・小学校・地域でのプログラミング教育の実践(最近は学生とドメイン駆動設計にモブワークで挑戦するのが楽しい)

Slide 3

Slide 3 text

#ゆるWeb札幌 大学(研究室)のシステム開発の悩み  ⇒ ほぼ毎年,研究室の学生は卒業して一新される  ⇒ 学生は約一年で,担当するシステムの既存部分やノウハウを学び,開発して発展させる  ⇒ だんだんシステムの内部がカオスになっていく  ⇒ 悪循環... 
 
   既存システムの複雑さ(認知負荷)を解消して,拡張性を高めたい!    
  けれども,複雑さ(認知負荷)が減った はどうやってわかる のだろう...? モチベーション 3 🧟

Slide 4

Slide 4 text

#ゆるWeb札幌 メトリクスはプロジェクト・プロダクト品質などを測ることによく使われる  例) SLOC,FP,ターンアラウンドタイム,テストカバレッジ... 
 複雑さなどに対応するためのメトリクスもある  例) Cyclomatic Complexity(循環的複雑度),     Cognitive Complexity(認知複雑度),     クラス/モジュール結合度     クラス/モジュール凝集度 今回は,クラス凝集度 に注目してみた 
 
 注)各メトリクスには癖がある(特定のパターンで計測が難しい場合がある)ので, 
   メトリクスだけで優劣を判断してはいけないが,ある程度の指標や参考として用いるのが大事 メトリクス 4

Slide 5

Slide 5 text

#ゆるWeb札幌 あるクラスが達成したい目的に対して, ひとつのクラスの中に,その目的に関係する機能(のみ)がどの程度集まっているか の指標 
 凝集度が高ければ高いほど,そのクラスはある目的にのみ特化している:単一責任の原則 凝集度が低ければ低いほど,そのクラスは複数の目的のための機能が混ざっている 
 つまり,凝集度が低いクラスは,開発者にとっても様々な役割をもっている, 
 認知負荷が高い状態。 ⇒ 凝集度が高いクラスを目指して開発やリファクタリングをしていく必要がある。 クラス凝集度(Class Cohesion) 5

Slide 6

Slide 6 text

#ゆるWeb札幌 Interface-based metrics 抽象的な設計段階でも計測しやすい凝集度のメトリクス 
 ただし,具体的な実装に(フィールドの利用や,メソッド間呼び出し) 
 などに影響されるメトリクスの計測は難しい Code-based metrics 具体的なコードに基づく凝集度のメトリクス。 
 さらに概念(Conceptual)メトリクスと構造(Structual)メトリクスに分かれている。 概念メトリクス: 
  クラス名やメソッド名が持つキーワードの意味などから関連性を判断して計測する 
 構造メトリクス: 
  同じフィールドを使っているメソッドなど,ソースコード構造を抽出して計測する。 クラス凝集度を図るメトリクスの種類 6

Slide 7

Slide 7 text

#ゆるWeb札幌 Jagdish Bansiya, Letha Etzkorn, Carl Davis and Wei Li による 概念メトリクス • どのメソッドもフィールド(インスタンスの状態)に自由にアクセスできるはずなので, 
 メソッドの引数の型は,クラス内でのメソッドの大幅な違いの代表的な情報である • クラス内の全てのメソッドが類似した引数の型を用いていれば, 
 メソッド間で密接に関連する情報を処理している(処理される情報に対して凝集している) という仮定のもとで,クラス内のメソッドの引数の型の種類数から,クラスの凝集度合いを計算する。 
 設計時(クラス図の段階)から計算しやすいという特性がある。 
 
 (フィールドの利用に関わらず)クラスの単一の責務にむけて... 
 どのメソッドも利用する引数の型が同様であれば,同様な処理をしている 
 引数の型が大きく違えば,他のメソッドと大きく異なる処理をしている,みたいな考え方 例)CAMC:Cohesion Among Methods of Classes 7 CAMC = a: ϝιου಺Ͱॏෳ͠ͳ͍Ҿ਺ͷܕͷ਺ͷ૯࿨ k: ϝιου਺ × l: Ϋϥε಺Ͱॏෳ͠ͳ͍Ҿ਺ͷܕͷ਺ 0.35 以上であれば凝集度が保たれているクラス。 判断が任される部分: 
 ※ コンストラクタを含むかどうか 
   (フィールド変数が多い時に影響が大きい) 
 ※ intとIntegerを別とみるかどうか

Slide 8

Slide 8 text

#ゆるWeb札幌 CAMC:Cohesion Among Methods of Classes 8 public class HighCAMC { void method1(int a) { } public void method2(int a, int b) { } public void method3(int a, int b, int c) { } } CAMC = {1, 1, 1} 3 × 1 = 1.0 = 3 3 public class LowCAMC { public void method1(int i) { } public void method2(double d, String S) { } public void method3(char c) { } } CAMC = (int, {double, String}, char) 3 × (int, double, String, char) (int, int, int) 3 × int = {1, 2, 1} 3 × 4 = 0.3 = 12 4 =

Slide 9

Slide 9 text

#ゆるWeb札幌 クラス凝集度を測る代表的な Interface-based metrics,Code-based metricsを計測するため のJava製ツール https://github.com/cqfn/jpeek jpeek 9 MavenのプラグインもあるけどJava8でコンパイルされている...🥲

Slide 10

Slide 10 text

#ゆるWeb札幌 Demo 10

Slide 11

Slide 11 text

#ゆるWeb札幌 Demo 11

Slide 12

Slide 12 text

#ゆるWeb札幌 12

Slide 13

Slide 13 text

#ゆるWeb札幌 リファクタリング前 リファクタリング後 jPeekで実際に測ってみた 13 イエロー(普通),レッド(よくない)の数が減り,グリーン(理想的)のクラス数が増えている ⇒ CAMCは,クラスの中のメソッドで使われている引数の型が似ているか 
   (あるクラスが,同じような型の引数だけを使っているか) を計測している 
 
 ⇒ 同じような型の引数だけを使っているクラスを増やすことができている

Slide 14

Slide 14 text

#ゆるWeb札幌 • みなさんは普段,メトリクスを意識していますか? • どんなメトリクスを使っていますか? でワイワイしたいです! ところで... 14 まとめ システムの認知負荷を測るために,クラス凝集度に注目してみた CAMCを例に,jpeekでリファクタリング前後のソースコードで計測してみた 
  ⇒リファクタリング後の方がわずか値が上昇していた 
  ⇒リファクタリングでクラスごとのメソッド引数の与え方が変わった 今後はいろいろなメトリクスを試して,うまい使い方を追求していきたい

Slide 15

Slide 15 text

#ゆるWeb札幌 15 Java Do : Javaユーザーグループ北海道 Javaはもちろん、Javaだけに限らずエコシステムや設計・開発手法などを テーマとして • 初心者向けの入門イベント • いろいろな技術をみんなで体験するモブワーク型イベント • 国内・海外のJavaエンジニアが発表するセミナーイベント などの勉強会を開催しています。 
 面白そうと感じてくれた皆さん、一緒にDoでしょう! https://javado.connpass.com/

Slide 16

Slide 16 text

#ゆるWeb札幌 ⽇本Javaユーザーグループ 秋のイベントの発表審査〆切がもうすぐです! 16 9月6日(水)