2

アンケートのフレームワークを作成しています。

アンケートにはいくつかの質問があります。Question私の状況では、あなたが望む答えをサポートする、というクラスを探しています。

つまり、いくつかの質問は1つの答えだけを必要とし、他の2つは、文字列、int、double、または開発者が作成した新しい構造体を必要とします(たとえば、開発者が分数構造体を答えとして使用する数学の問題を作成していると想像してください)。

言い換えれば、私はあらゆるデータ型または回答の量をサポートする必要があります。

そこで、応答のQuestionを含む抽象クラスを作成することを考えていました。Dictionary

public abstract class Question
{
    protected Question(string questionText)
    {
        this.QuestionText = questionText;
        this.Responses = new Dictionary<string, object>();
    }

    public string QuestionText
    {
        get;
        set;
    }

    public IDictionary<string, object> Responses { get; protected set; }
}

たとえば、新しいを作成するQuestionと、これがデモになります。

public sealed class Question1 : Question
{
    public Question1(string questionText)
        : base(questionText)
    {
    }

    public int? Response1
    {
        get
        {
            int? value = null;

            if (this.Responses.ContainsKey("Response1"))
                value = this.Responses["Response1"] as int?;

            return value;
        }
        set
        {
            this.Responses["Response1"] = value;
        }
    }
}

このアイデアについてどう思いますか?私の最初の疑問:私が別の独立したクラスではなく、クラスに応答を含めたのは正しいですか。

4

3 に答える 3

2

誰がこれらの質問に答えますか?人を想定しましょう。それを考えると、人はおそらく何らかの方法でログインまたは自分自身を識別しているでしょう。そのため、Personモデルには、各質問への参照を含むResponsesが含まれている必要があると思います。

// pseudocode 
class Person 
   int PersonID 
   IList Responses     

class Response
   int ResponseID
   int QuestionID 
   string ResponseValue 

class Question
   int QuestionID
   string QuestionText 
   IList AllowedResponses 
   bool AllowsMultipleResponses
于 2012-06-26T17:41:47.470 に答える
1

jcollumのモデルから始めますが、少し異なる方法で、オブジェクトの使用にジェネリックスを追加します。

// pseudocode 
class Person 
   int PersonID 
   IEnumerable<IQuestionResponse> QuestionResponses

//non generic interface to allow all QuestionRespones 
//to be stored in one typed collection
interface IQuestionResponse

class QuestionResponse<TResponse> : IQuestionResponse
   Question<TResponse> Question
   IEnumerable<TResponse> Responses

class Question<TResponse>
   string QuestionText 
   IEnumerable<TResponse> AllowedResponses 
   bool AllowsMultipleResponses
于 2012-06-26T18:18:42.620 に答える
0

質問に回答を含めると、単一責任の原則に違反することになります。別の言い方をすれば、たとえば、回答を質問にマッピングする方法を変更することにした場合、なぜ質問クラスを変更する必要があるのでしょうか。また、Responseクラスもありません。さらに、Questionと回答のリストを使用してQuestionResponsesMappingクラスを作成します。

コメントに投稿された質問に答えるには(Javaの構文):

このQuestionResponsesMappingは、KeyがQuestion、valueがasのマップを持つことができます。

List<Response<T extends Object & SomeInterface>>

。質問クラスと応答クラスには、hashCode()とequals()を実装してください。応答の任意の種類のデータ型を格納できるという要件は、Responseをとして実装することで処理されResponse<T extends Object & SomeInterface>>ます。ここでのSomeInterfaceは、データ型間で共通のメソッドを持つことができます。

于 2012-06-26T18:18:31.957 に答える