Upgrade to Pro — share decks privately, control downloads, hide ads and more …

jPeekでのクラスの凝集度計測の試行 / mild-web-sapporo#24

jPeekでのクラスの凝集度計測の試行 / mild-web-sapporo#24

「jPeekでのクラスの凝集度計測の試行」
ゆるWeb勉強会@札幌 #24 / Java Do共催にて発表
https://mild-web-sap.connpass.com/event/292535/

Hiroto YAMAKAWA

September 02, 2023
Tweet

More Decks by Hiroto YAMAKAWA

Other Decks in Technology

Transcript

  1. #javado Hiroto Yamakawa 2 公立千歳科学技術大学 情報システム工学科 専任講師 
 R&D: Experimental Development

    of ICT Services, Learning Technology, 
 Computer in Education, Programming & Programmer's Education 千歳市バスロケーションシステムの開発(2016-2022) 適応型学習支援システムの開発、活用 レポート内の話しことば診断システムの開発 大学・小学校・地域でのプログラミング教育の実践(最近は学生とドメイン駆動設計にモブワークで挑戦するのが楽しい)
  2. #ゆるWeb札幌 大学(研究室)のシステム開発の悩み  ⇒ ほぼ毎年,研究室の学生は卒業して一新される  ⇒ 学生は約一年で,担当するシステムの既存部分やノウハウを学び,開発して発展させる  ⇒ だんだんシステムの内部がカオスになっていく  ⇒ 悪循環...

    
 
   既存システムの複雑さ(認知負荷)を解消して,拡張性を高めたい!    
  けれども,複雑さ(認知負荷)が減った はどうやってわかる のだろう...? モチベーション 3 🧟
  3. #ゆるWeb札幌 メトリクスはプロジェクト・プロダクト品質などを測ることによく使われる  例) SLOC,FP,ターンアラウンドタイム,テストカバレッジ... 
 複雑さなどに対応するためのメトリクスもある  例) Cyclomatic Complexity(循環的複雑度),     Cognitive Complexity(認知複雑度),

        クラス/モジュール結合度     クラス/モジュール凝集度 今回は,クラス凝集度 に注目してみた 
 
 注)各メトリクスには癖がある(特定のパターンで計測が難しい場合がある)ので, 
   メトリクスだけで優劣を判断してはいけないが,ある程度の指標や参考として用いるのが大事 メトリクス 4
  4. #ゆるWeb札幌 Interface-based metrics 抽象的な設計段階でも計測しやすい凝集度のメトリクス 
 ただし,具体的な実装に(フィールドの利用や,メソッド間呼び出し) 
 などに影響されるメトリクスの計測は難しい Code-based metrics

    具体的なコードに基づく凝集度のメトリクス。 
 さらに概念(Conceptual)メトリクスと構造(Structual)メトリクスに分かれている。 概念メトリクス: 
  クラス名やメソッド名が持つキーワードの意味などから関連性を判断して計測する 
 構造メトリクス: 
  同じフィールドを使っているメソッドなど,ソースコード構造を抽出して計測する。 クラス凝集度を図るメトリクスの種類 6
  5. #ゆる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を別とみるかどうか
  6. #ゆる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 =
  7. #ゆるWeb札幌 • みなさんは普段,メトリクスを意識していますか? • どんなメトリクスを使っていますか? でワイワイしたいです! ところで... 14 まとめ システムの認知負荷を測るために,クラス凝集度に注目してみた

    CAMCを例に,jpeekでリファクタリング前後のソースコードで計測してみた 
  ⇒リファクタリング後の方がわずか値が上昇していた 
  ⇒リファクタリングでクラスごとのメソッド引数の与え方が変わった 今後はいろいろなメトリクスを試して,うまい使い方を追求していきたい
  8. #ゆるWeb札幌 15 Java Do : Javaユーザーグループ北海道 Javaはもちろん、Javaだけに限らずエコシステムや設計・開発手法などを テーマとして • 初心者向けの入門イベント

    • いろいろな技術をみんなで体験するモブワーク型イベント • 国内・海外のJavaエンジニアが発表するセミナーイベント などの勉強会を開催しています。 
 面白そうと感じてくれた皆さん、一緒にDoでしょう! https://javado.connpass.com/