我试图实现一个应用程序,但不想重新发明轮子。我一直在寻找一个最接近这个应用程序的设计模式,但是没有效果。
有谁知道设计模式或示例代码(或伪代码)是否与此匹配?
发布于 2017-08-08 19:36:46
我建议你根本不需要“移动”列表。你只需要把任务归为属性。
您可以有一个表和/或实体,该表和/或实体包含/聚合所有任务,而不考虑状态或“年份”。让我们按此设计逐步完成工作流:
启动时的
启动时,应用程序将提示管理员从任务列表中进行选择,并将所选任务复制到今年的任务中。
系统检索处于“未分配”状态的所有任务的列表,并将其显示给管理员。管理员检查一些任务,系统将状态更改为“已分配”。
任何剩余的未分配任务都可以保持原样(这意味着管理员在下次访问系统时会得到提示),也可以将它们移到“延迟”状态。
在整个一年中,正常用户将能够检查完成的任务。
系统检索并显示状态为“已分配”的所有任务。用户可以将其关闭。当他这样做时,系统将状态更改为“已完成”。
在年底,管理员将表示该年的任务已结束。这意味着不能删除、修改任务,也不能添加新任务。
系统检索状态为“已完成”的所有任务。管理员批准后,这些任务的状态将更改为“已关闭”。
系统只允许只读访问标记为已关闭的任务。
管理员将将完成的年度任务复制到下一年的任务中。
仍处于“指定”状态的任何任务都将继续执行。
请注意,这个设计没有任何“年份”的概念。在我看来,任何时候都只有一年的活动时间,所以它并不是真正需要的;你只需要知道哪些任务被分配或完成。如果需要将“年份”分配给他们,例如,对于报告或度量,您可以为每个任务存储一个DateAssigned
、DateCompleted
和DateClosed
,并按年度或其他时间运行报告,如果您的组织曾经移动到季度、财政年度或其他时间。
如果“年份”确实是数据模型中一个关键任务的概念,那么您当然可以为“年份”添加另一列。“将”任务从一年转移到另一年的行为仅仅意味着更新该列。你根本不用动任何东西。
发布于 2017-04-10 12:26:15
你可能是在问自己一个错误的问题,在这个时候,它看起来就像复制记录一样简单,但是在将来,即使现在,它也不是。您至少必须切换已完成的属性。您还必须检查访问权限,以查看用户是否拥有这样做的权限。
处决:
var task = repository.GetTask(id);
if (!currentUser.CanTransfer(task))
{
throw new ApplicationException(" Sorry, I can't let you do that :( ");
}
var newTask = task.TransferToNextYear();
repository.Save(newTask);
班长:
public class Task : ITransferable
{
string Key;
DateTime? CompletedDate;
DateTime CreateDate;
string AssignedUser;
// Lots of other fields
public Task TransferToNextYear()
{
var newTask = new Task();
newTask.CreateDate = DateTime.Now;
newTask.CompletedDate = null;
newTask.AssignedUser = null;
newTask.string Key = GetNewKey();
//Copy other fields
return newTask;
}
}
https://softwareengineering.stackexchange.com/questions/346873
复制