OOD:识别对象时遇到问题

时间:2009-02-28 00:08:54

标签: oop

这应该是一个简单的。

假设我正在设计一个非常简单的时钟应用程序。用户输入他的ID,应用程序向他显示他一周的工作时间,当天的小时数,然后允许他打出我们的工作。很聪明地知道一名员工目前是否被打入。没有休息或午餐或轮班或任何事情。

所以我有一个员工。我有一张Timecard,它有多个EventRecords。我有一个Timeclock当然可以保持时间,但也可能是整个模型的前端(也许)。

员工是否有时间卡,或者Timecard是否应该引用员工?

Timecard是否应负责计算当天的小时数等?

Timeclock是否应负责实例化员工和时间卡并将其关联起来?

Timeclock应该执行punchIn和punchOut,还是应该是Employee?

5 个答案:

答案 0 :(得分:2)

只需从最终用户视角回答您自己的问题,而不是从程序员的角度来回答。

  

员工是否应该有时间卡,或者Timecard是否应该引用员工?

谁拥有时间卡?

  

* Timecard是否应负责计算当天的小时数等?**

应该吗?

  

Timeclock是否应负责实例化员工和时间卡并将其关联起来?

时钟是否会实例化员工?

  

Timeclock是否应该执行punchIn和punchOut,还是应该是Employee?

...相同

首先,您必须分析问题。然后设计解决方案,并且只在该代码之后。

因此,您应该将每个流程与另一个流程分开。在这里,您似乎正在分析实施,然后设计等。

见Steve A. Lowe的this answer

一旦你清楚了解哪个对象对什么负责,并且在实施过程中,你可以调整一下你的设计并在有意义的情况下进行调整。

一旦你有更多的经验,这三个过程可能会真正地,非常快地发生在你的头脑中。但是,你必须要有耐心。

答案 1 :(得分:2)

这是一个很好的例子,当你的OO模型基本上应该反映现实世界时。

  

员工是否有时间卡,或者Timecard是否应该引用员工?

员工应该有时间卡。如果它是一张实时卡,你就会携带它。你不会在时间卡的口袋里。

  

Timecard是否应负责计算当天的小时数等?

我不确定你的意思。您的意思是计算结账时间减去办理登机手续的时间吗?这可能是你的时间卡可以做的事情。

  

Timeclock是否应负责实例化员工和时间卡并将其关联起来?

可能。什么是“Timeclock”?当我想到创建员工与时间卡并将其联系起来时,我更多地想到“办公室”。不过,我不确定你的模型的全部范围是什么。

  

Timeclock应该执行punchIn和punchOut,还是应该是Employee?

你有没有看到时间卡打卡进出?我认为可以说这是员工的行为。

编辑:正如TheTXI指出的那样,员工会在时间卡上调用punchIn和punchOut方法。但是时间卡本身并不负责知道什么时候打卡或打卡。

答案 2 :(得分:2)

注意:与大多数建模一样,并不总是有一种方法可以做到。

  

员工是否应该有时间卡,   或者Timecard是否应该参考   雇员?

域名会建议员工有一张考勤卡(正如所指出的那样,超过时间卡)。

  

Timecard应该负责   计算当天的小时数等?

我会把它作为TimeCardCalculator的可接受性。

  

Timeclock应该负责任   用于实例化员工和   时间卡和他们相关吗?

我认为应该可以通过您的应用程序在更高级别完成实例化。

  

Timeclock是否应该打卡和   punchOut,还是应该是员工?

TimeClock。员工在TimeClock上调用PunchIn / PunchOut。

答案 3 :(得分:2)

是的,这种事情非常经典。最简单的方法是应用另一条规则。我最喜欢的是Parnas定律:每个对象都“隐藏”了可以改变其界面背后需求的东西。

好的,很明显,员工有一个TimeCard,它是一个按时间排序的开始和停止时间列表。

就“”而言,当你“进入”时,你所做的只是做一个“时间开始”的记录。听起来像“时钟输入”和“时钟输出”可能是TimeCard方法,如果我们考虑它,它也隐藏了可能的需求变化(例如,它是数据库中的记录,平面文件中的行,以及你在本地时间,GMT或UNIX时间存储?)

员工是员工的代表,包含所有员工特定的信息;姓名,地址等。

到目前为止,除了作为外部世界域中进出时钟的“实现”之外,没有明显需要TimeClock。

现在,当您构建一个应用程序,但必须从域构建时,现在您需要某种UI,一种验证(建立您想要的员工)的方法,并从那里获得Employee的TimeCard - - 这表明了员工的方法。然后你需要一个在UI中“进入”和“退出”的地方。这听起来好像你的timeClock可能是实现中的View对象。它需要几个按钮以及您的登录协议。

这里还有一个部分是“业务流程”或“首先登录,然后登录。稍后,退出,然后退出”或类似的东西。有一个控制器;如何将其拆分在一定程度上取决于你如何操作UI。

答案 4 :(得分:2)

我认为你在这里对物理对象有点过分了。员工很可能拥有作为对象,因为它有一个标识符并且是场景中的玩家,但我没有看到Timecard或Timeclock是任何好的候选对象。 Timecard只是属于员工的EventRecords列表,因此您也可以将这些事件保存在Employee对象或集合列表中。 Timeclock根本没有做任何事情,只是分发DateTime.Now ...

EventRecord很好,或者它可能是一个WorkTime对象;一对或拳打和打卡时间。如果最后一条记录中没有打卡时间,那么员工就会被打入。

将时间记录保存在Employee对象中,或者将它们保存在一个单独的列表中,并引用每个Employee,这只是一种品味问题。

好吧,当我取消Timecard和Timeclock对象时,你的大多数问题都会出现......;)