前提
C#(WPF)にてクイズゲームのようなアプリを開発しています。
オブジェクト指向についての理解が浅く、どのようにクラスの設計したらよいか迷っています。
実現したいこと
クイズのコンテンツ(png,mp3等)をローカルに配置し、それらを参照して画面に表示させたり、音声を再生させるつもりです。
そこで1問のクイズを表すQuizクラスを作成しました。機能としてはローカルの読み取りを行い、適切な形に成形してプロパティにセットするといった内容です。(コンストラクタの引数で取得したいコンテンツ郡を指定しています。)
作っている中で、コンテンツを読み取ることはQuizクラスの責務ではないような気がしていて、クラスを分離したほうが良いのではないかと感じています。しかし具体的にどのようにクラスを設計したら良いかがよく分かりません。
この場合、どのように設計すると良いのでしょうか?
ソースコード
Quizクラス
C#
1using System; 2using System.Collections.Generic; 3using System.Collections.ObjectModel; 4using System.IO; 5using System.Linq; 6 7namespace QuizSample 8{ 9 public record Quiz 10 { 11 private readonly string _contentsPath = @"resources\quizset"; 12 13 /// <summary> 14 /// 難易度 15 /// </summary> 16 public string Level { get; init; } 17 18 /// <summary> 19 /// 問題文画像 20 /// </summary> 21 public Question Question { get; init; } 22 23 /// <summary> 24 /// 回答ボタン画像 25 /// </summary> 26 public ReadOnlyCollection<Answer> Answers { get; } 27 28 /// <summary> 29 /// </summary> 30 /// <param name="level">問題の難易度</param> 31 /// <param name="number">問題フォルダの番号</param> 32 public Quiz(string level, int number) 33 { 34 //対象ファイルを取得 35 var quizFolder = _contentsPath + @"\" + level + @"\" + number; 36 string[] quizElements = Directory.GetFiles(quizFolder); 37 38 //Questionを生成 39 var questions = new List<Question>(); 40 var questionImgPath = quizElements.Where(o => o.Contains("question.png")); 41 var questionVoicePath = quizElements.Where(o => o.Contains("question.mp3")); 42 var questionPaths = questionImgPath.Zip(questionVoicePath, (iPath, vPath) => 43 new { ImgPath = iPath, VoicePath = vPath }); 44 foreach (var path in questionPaths) 45 { 46 var question = new Question(path.ImgPath, path.VoicePath); 47 questions.Add(question); 48 } 49 Question = questions[0]; 50 51 //Answersを生成 52 var answers = new List<Answer>(); 53 var answerPath = quizElements.Where(o => o.Contains("answer", StringComparison.CurrentCulture)); 54 foreach (var path in answerPath) 55 { 56 var answer = new Answer(path); 57 answers.Add(answer); 58 } 59 Answers = answers.AsReadOnly(); 60 } 61 } 62} 63
resources └─quizset ├─easy │ └─1 │ answer1-correct.png │ answer2.png │ answer3.png │ question.mp3 │ question.png │ ├─hard │ └─1 answer1-correct.png │ answer2.png │ answer3.png │ question.mp3 │ question.png │ └─normal └─1 answer1-correct.png answer2.png answer3.png question.mp3 question.png
補足情報(FW/ツールのバージョンなど)
Visual Studio 2022
C#10.0
WPF
回答2件
あなたの回答
tips
プレビュー