私は、タイプと呼ばれるプロパティを持つ質問というクラスがあります。このタイプに基づいて、特定の方法(複数選択=ラジオボタン、複数回答=チェックボックスなど)でhtmlに質問をレンダリングします。質問型に応じてサブメソッドを呼び出すRenderHtmlメソッドを1つ用意して始めましたが、インターフェイスを実装する個々のクラスにレンダリングロジックを分離することを検討しています。しかし、このクラスはHibernateを使用してデータベースに永続化され、インターフェイスの実装はプロパティに依存しているため、クラスをレイアウトするにはどうすればよいか分かりません。問題の.NETクラスの設計に関する質問
クラス:QuestionType列挙型プロパティに基づいて
public class Question
{
public Guid ID { get; set; }
public int Number { get; set; }
public QuestionType Type { get; set; }
public string Content { get; set; }
public Section Section { get; set; }
public IList<Answer> Answers { get; set; }
}
、私は次の(単なる例)をレンダリングしたいと思います:現在
<div>[Content]</div>
<div>
<input type="[Depends on QuestionType property]" /> [Answer Value]
<input type="[Depends on QuestionType property]" /> [Answer Value]
<input type="[Depends on QuestionType property]" /> [Answer Value]
...
</div>
、私は一つの大きなを持っていますRenderHtml()という関数でswitchステートメントを実行すると、汚い作業が行われますが、それを何かクリーナーに移動したいと思います。私はちょうど方法がわからない。
どのような考えですか?
編集:ありがとうございました!
public interface IQuestionRenderer
{
string RenderHtml(Question question);
}
そして、次の実装:
はpublic class MultipleChoiceQuestionRenderer : IQuestionRenderer
{
#region IQuestionRenderer Members
public string RenderHtml(Question question)
{
var wrapper = new HtmlGenericControl("div");
wrapper.ID = question.ID.ToString();
wrapper.Attributes.Add("class", "question-wrapper");
var content = new HtmlGenericControl("div");
content.Attributes.Add("class", "question-content");
content.InnerHtml = question.Content;
wrapper.Controls.Add(content);
var answers = new HtmlGenericControl("div");
answers.Attributes.Add("class", "question-answers");
wrapper.Controls.Add(answers);
foreach (var answer in question.Answers)
{
var answerLabel = new HtmlGenericControl("label");
answerLabel.Attributes.Add("for", answer.ID.ToString());
answers.Controls.Add(answerLabel);
var answerTag = new HtmlInputRadioButton();
answerTag.ID = answer.ID.ToString();
answerTag.Name = question.ID.ToString();
answer.Value = answer.ID.ToString();
answerLabel.Controls.Add(answerTag);
var answerValue = new HtmlGenericControl();
answerValue.InnerHtml = answer.Value + "<br/>";
answerLabel.Controls.Add(answerValue);
}
var stringWriter = new StringWriter();
var htmlWriter = new HtmlTextWriter(stringWriter);
wrapper.RenderControl(htmlWriter);
return stringWriter.ToString();
}
#endregion
}
修正質問クラスはそうのような内部の辞書を使用しています。
は、私は、次のインターフェイスを使用して戦略パターンと一緒に行くことになりました
public class Question
{
private Dictionary<QuestionType, IQuestionRenderer> _renderers = new Dictionary<QuestionType, IQuestionRenderer>
{
{ QuestionType.MultipleChoice, new MultipleChoiceQuestionRenderer() }
};
public Guid ID { get; set; }
public int Number { get; set; }
public QuestionType Type { get; set; }
public string Content { get; set; }
public Section Section { get; set; }
public IList<Answer> Answers { get; set; }
public string RenderHtml()
{
var renderer = _renderers[Type];
return renderer.RenderHtml(this);
}
}
かなりきれいに見えます。 :)
スイッチステートメントが非常に汚いです。その95%がそれを行う良い方法があります。 –
それが私がより良い方法を模索していた理由だろう。 :) – Chris