繁体   English   中英

如何设计/创建日历类

[英]How to design / create a calendar class

当我的程序启动时,我希望它立即用1875年1月1日到2025年12月31日之间的所有年/月/日填充“日历”类。 我在创建这个“日历”类时遇到了麻烦,我真的不知道我对C ++的选择是什么。

班级

实现这一目标的最佳方法是什么? 日/月/年应该是多图,如果是; 如何有效地使用该多图来实现我要执行的操作(多图甚至可以容纳两个以上的对象?)? 或者也许该类根本不应该是一个类,但是整个事情应该变成一个多图?

我把这个“日历”项目作为一个例子,但我认为我的问题实际上归结为:“我如何设计一个可以容纳多层数据的类(或替代),这些数据链接且易于控制/访问” 。

而'控制'我的意思是添加/删除/检查 - 如果已经存在等。

也许这样的事情(忽略我在图片中的例子):

calendar.addYear(1998) //Add 1998 to the year stack (array?) inside the "calendar" object.
calendar.addMonth(1,0) //Add month 1 (january) to month stack (array?) keeping year-array position 0 as a reference, so we know what year this month belongs to.
calendar.addDay(1,0) //Add day 1 to day stack (array?) keeping month-array position 0 as a reference, so we know which month this day belongs to.

我希望用这样的类以编程方式实现的一个例子是:

//This is a magical GUI object I just made up ;D
myGUIofChoiceCreateSomeGUIobject GUIobject;
int i;
for(i=0; i < calendar.yearCount; i++;)
{
    GUIobject.addYeartoGUIobject(calendar.year[i]); //Add current year to our GUI. The user can now select it, hooray!
    addMonthsToYear(i); //Add months belonging to this year to our GUI.
}

addMonthsToYear(int theYear)
{
    int i;
    for(i=0; i < calendar.year[theYear].monthCount; i++;)
    {
        /*
        Our made-up GUI will add the current month to the year we received as an 
        argument. As long as that year is selected in the GUI, our user can pick this month, 
        hooray!
        */
        GUIobject.addMonthToGUIobject(calendar.year[theYear].month[i])
        addDaysToMonth(i,theYear) //Add days to this month (not typing this one down, you can see where this is going)
    }
}

好像所有这些都不够复杂; 什么是没有待办事项的日历? 因此,“ calendar.day”需要链接到数组/多图/任何对象,看起来像这样:

struct stuffToDo{
    std::string message;
    float time;
}

之后,应该很容易将类似的对象添加到类中:

stuffToDo newstuff;
newstuff.message = "Find a C++ tutor so you can stop bothering stackoverflow";
newstuff.time = 15.20;

calendar.year[2012].month[11].day[18].addObject(newstuff);

我很茫然,在这里我有什么选择?

PS。 我为我的示例之间的不一致而感到抱歉,但是在不知道我该怎么做的情况下这是不可避免的,这是此问题的本质。

Boost库是您需要查看的。

为了帮助自己,你可以在这里找到你想要制作的日历课程http://sourceforge.net/projects/c-cpp-calender/

我认为你需要退后一步,清楚地思考你想做什么。 什么是关键的抽象? 您要支持哪些操作和动作? 写一篇关于系统使用的故事。 在这个故事中,重要的名词通常成为C ++代码中的对象,重要的动词成为方法。

看起来您希望数据结构跨越很多年,但是基本对象是Day,它有一个数字,是一个Tasks的容器,每个Tasks都有一条消息和一个与之关联的时间。 然而,一天属于一个月和一年。 现在几个月和几年可能只是一天的属性,或者它们可能是自己的完整对象(月和年)。 在第二种方法中,月份(也有名称)是“天”的容器,“年”(也有数字)是“月份”的容器。

如果您有多年和几个月只是属性,您可能希望主日历类中的数据结构映射多年到几天,一个映射年和月组合映射到天。 如果您使用月份和年份的对象,那么在顶层您将只有一个Year对象列表,或者可能是将年份数字映射到Year对象的地图。 要到达特定的一天,您只需从年份编号,月份名称和日期编号开始,然后在树中导航直到您到达那一天,也许您可​​以随时创建对象。

当然,如果您将基本对象设置为具有日,月和年属性的任务,则所有这些可能会变得更简单一些。 这些将存储在地图中,其中键是年,月和日的序列化。 如果地图确实是一个多图,那么每年/每月/每天组合可能有多个任务。 Task对象本身可以产生此序列化密钥,该密钥提供了很好的隐藏和解耦信息,尽管让类通过静态方法(而不是特定对象)生成类可能更灵活。 此多图成为Calendar对象的核心。 这也是有效的,因为结构的总大小随任务数量(而不是时间跨度)的增加而增加,前提是您可以在没有关联任务的情况下优雅地处理年/月/日组合的查找。 要呈现日历,只需迭代年,月和日,然后在日历中查找任务。

所有这些都归结为您需要认真思考数据模型这一事实。 我发现一旦找到一个好的数据模型,实际编码就差不多了。 没有明确的数据模型会导致大量的错误启动和混乱的代码。 查看统一建模语言( UML )表示法,并用铅笔和纸绘制一些图片。 我认为事情会变得更加清晰。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM