WEB开发网
开发学院软件开发C语言 【渐进】浅尝DDD,对"试卷"建模 阅读

【渐进】浅尝DDD,对"试卷"建模

 2010-09-30 21:05:10 来源:WEB开发网   
核心提示: 试卷分块:分块将维持试题索引范围///<summary>///试卷分块///</summary>publicclassPaperPart:ICloneable{//构?publicPaperPart(){this.QuestionRang=newQuestionIndex

试卷分块:分块将维持试题索引范围

/// <summary>
/// 试卷分块
/// </summary>
public class PaperPart : ICloneable
{
    //构?
 
    public PaperPart()
    {
        this.QuestionRang = new QuestionIndexRang(-1, -1);
        this.QuestionList = new List<QuestionInfo>();
    }
 
    /// <summary>
    /// ?取或?置分块下的??索引?围 ?不存在??则索引??为-1
    /// </summary>
    public QuestionIndexRang QuestionRang { get; set; }
    /// <summary>
    /// ?取或?置?分块下的??列?
    /// </summary>
    public List<QuestionInfo> QuestionList { get; set; }
 
    #region ICloneable 成员
 
    public object Clone()
    {
        PaperPart clone = this.MemberwiseClone() as PaperPart;
 
        //处理引用
 
        return clone;
    }
 
    #endregion
} 

试卷试题列表:此设计用于映射分块中的试题,并控制对其的调用,使得对它的相关操作能映射至实际的试题。

/// <summary>
/// 试卷的试题列表
/// </summary>
public class PaperQuestionList : CustomList<QuestionInfo>
{
    /// <summary>
    /// 所在的?卷
    /// </summary>
    public Paper Paper { get; private set; }
    /// <summary>
    /// 初始化
    /// </summary>
    /// <param name="paper"></param>
    private PaperQuestionList(Paper paper)
        : base()
    {
        this.Paper = paper;
    }
    /// <summary>
    /// 生成试卷的试题列表
    /// </summary>
    public static PaperQuestionList Create(Paper paper)
    {
        PaperQuestionList list = new PaperQuestionList(paper);
 
        //拼接
        list.Paper.PaperPartList.ForEach(o => { list._list.AddRange(o.QuestionList as IEnumerable<QuestionInfo>); });
 
        return list;
    }
    /// <summary>
    /// 重载索引器
    /// </summary>
    /// <param name="index"></param>
    /// <returns></returns>
    public override QuestionInfo this[int index]
    {
        get
        {
            return base[index];
        }
        set
        {
            bool flag = false;
            int count = 0;
            for (int i = 0; i < this.Paper.PaperPartList.Count; i++)
            {
                if (flag) break;
 
                for (int j = 0; j < this.Paper.PaperPartList[i].QuestionList.Count; j++)
                {
                    if (count == index)
                    {   
                        //修正实际引用
                        this.Paper.PaperPartList[i].QuestionList[j] = value;
                        flag = true;
                        break;
                    }
                    count++;
                }
            }
            base[index] = value;
        }
    }
} 

更多考虑

对于模型的接口和属性暴露:本文所提及的设计并非采用贫血模型,模型内部需维持主要逻辑,对于对外接口和属性应慎重,如对于引用类型的属性,应考虑使用者有可能并不总是按照设计者的预期来使用,因此最小化设计原则和按需暴露接口,或者返回接口而非真实引用尤为必要。

领域模型并非为传输而设计,若希望模型同时能够支持跨层传输和序列化,则需额外注意相关属性和字段的设计和暴露。

DDD是从业务出发,关注业务,以业务价值为导向的设计方法,测试和业务的实现均是由它出发,以对象而不是关系数据库作为模型基础,而对于存储则不是业务人员需要过多关心,通常web开发者习惯了数据驱动设计,总是希望实体和数据库一一映射,那么您恐怕需要换个思路思考了,因而一个强有力的ORM框架支持也是DDD的执行的保证。

出处:http://wsky.cnblogs.com/

上一页  1 2 3 4 

Tags:渐进 浅尝 DDD

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接