質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

7370閲覧

循環的複雑度を下げる

junkan

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/07/07 23:18

編集2018/07/08 05:02

質問

循環的複雑度を下げようとしているのですが、IFELSE文、SWITCH CASE文を連ねていると簡単に上がってしまいます。
条件分岐を分割するわけにもいかずどうすればいいか困っています。どうすればよいのでしょうか。

サンプルソース

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6 7namespace ConsoleApp1 8{ 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 string[] Programmers = 14 { 15 "Java", 16 "CSharp", 17 "VBnet", 18 "CSharp" 19 }; 20 21 foreach (var p in Programmers) 22 Coding(p); 23 24 Console.ReadKey(); 25 } 26 27 private static void Coding(string Language) 28 { 29 switch (Language) 30 { 31 case "Java": 32 Console.ForegroundColor = ConsoleColor.Red; 33 Console.WriteLine("Java Coding"); 34 break; 35 case "CSharp": 36 Console.ForegroundColor = ConsoleColor.Blue; 37 Console.WriteLine("C# Coding"); 38 break; 39 case "VBnet": 40 Console.ForegroundColor = ConsoleColor.Green; 41 Console.WriteLine("VB.NET Coding"); 42 break; 43 } 44 } 45 } 46}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/07/08 01:33

具体例を示された方がレスしやすいと思うのですが。どういうコードで、質問者さんとしては何が問題と思っていて、どう改善したいかなど。
junkan

2018/07/08 05:03

すみません。サンプルのソースコード載せました。
退会済みユーザー

退会済みユーザー

2018/07/08 06:16

> サンプルのソースコード載せました。 ←そのサンプルは Chironian さんの回答の 2. からリンクが張られている記事のもので、継承と多態性を利用した対応策もその記事に書かれているのですけど。それは質問者さんの求める答えになってないということですか? Chironian さんの回答にレスしていただくのがよさそうです。
guest

回答1

0

ベストアンサー

こんにちは。

循環的複雑度は初めてみました。要するにプログラム中の実行経路の組み合わせの数が増えると複雑化するという概念のようですね。であれば、条件分岐を減らす以外に循環的複雑度を下げることはできないように感じます。

条件分岐を減らすのは難しいですが、減らせる場合があるのも確かですので、それらを地道に適用するのが良いと思います。

パッと思いつく比較的汎用なテクニックとしては以下があります。

  1. 例外を使うことで、エラー条件判定用if文を大幅に減らせます。
  2. 種類判定のswitch-caseが2セット以上ある場合は、動的ポリモーフィズムのテクニックで1~2セットまで減らせます。
  3. 複数の種類の関数を登録するタイプの関数テーブルも有用な筈です。(2.と本質的には同じものですが、見た目がかなり異なりますので分けました。)
  4. ジェネリクスも効果的です。(型の違いだけで同様なコードを2つ以上書くなら、ジェネリクスでまとめれば、コード中の条件分岐をまとめることができます。)

例外は結構使い方が難しい上に結構面倒です。ですが、使えるようになると効果は絶大です。
2.、3.は、switch-caseが1セットしか無い時に適用してしまうと、コードが却って複雑化することが多いのでよく検討が必要です。(本当に複数セットへ拡張しますか?)

投稿2018/07/08 02:48

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

junkan

2018/07/08 06:04

回答ありがとうございます。 2番を採用しました。
junkan

2018/07/08 06:31 編集

補足 私が持っているソースは長文のため、 サンプルのソースはChironianさんの紹介した記事を利用しました。 元の記事はEnumでしたが、私のソースはString型をSwitchの条件分岐に使用していたため 合わせて加工しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問