【问题标题】:Designing a domain model (class diagram) for a financial software [closed]为财务软件设计域模型(类图)[关闭]
【发布时间】:2020-11-02 13:49:28
【问题描述】:

在准备软件工程考试期间,我在一次旧考试中遇到了以下任务:

对于客户,您创建了一个新的财务软件,其任务之一是执行税收计算。客户已向您传达以下要求:

  • 系统必须能够:
    • 计算并显示不同国家和税率的增值税(德国 19%、奥地利 20%、瑞士 8%)。
    • 根据特定国家/地区的税表(德国、奥地利、瑞士的单独表格)计算和显示所得税。
  • 系统必须允许用户:
    • 输入税务相关数据(增值税总额,所得税年收入)
    • 在网络打印机上打印税收计算结果。
    • 将税务计算结果发送至相应的税务局。

任务 1:使用以下信息在域模型(类图)中捕获客户端传达的需求:类、属性、方法、关系、多重性、关系名称。

解决方案: 我不确定如何定义正确的类、关系和多重性。但我尝试了一下,得出了以下不完整的解决方案:

第一次更新:

第二次更新:

有人可以帮我解决这个问题吗?谢谢:)

【问题讨论】:

    标签: uml domain-driven-design abstract-class class-diagram domain-model


    【解决方案1】:

    查看您的图表

    我建议您阅读您的第一个图表,并将其作为练习来交叉检查它是否真的满足要求:

    • “一个税率由一个国家组成”(顶部组成)。因此,国家并不是独立于税法而存在的。这真的是你的意思吗?要求中是否有任何内容表明每个国家/地区只有一个税率?
    • “一个税率由一个(可选的)所得税率和一个(可选的)增值税率组成”(中间是双重组成)。哦!?
    • “每个所得税率都有自己的税种”(底部组合)。类别的想法不是对相似的所得税率进行分组吗?
    • “一个税率聚合税收征管,一个税收征管可能出现在多个聚合中”(聚合)。为什么要在税码中汇总管理?

    第一个建议:在您的课程中阅读关联、聚合和组合之间的区别。聚合和组合的使用原则上是例外的,必须有充分的理由使用它。

    还有一些问题:

    • 关系的名称在哪里?
    • 税务机关有什么要求?如果有道理,不应该和国家有关吗?
    • 打印某些元素真的是域模型的一部分还是已经属于某个用户界面?

    第二条建议:只展示你可以从需求中合理推导出来的元素,避免任何与用户界面相关的行为。

    编辑:根据我们在评论部分的交流,您的最终图表更能代表您最初想要表示的内容。您可以为 1 个类别添加多重性 1..* 率。您还可以添加一个分隔符,以便与属性和操作部分一致地显示类,即使两者之一为空。设计仍然是基本的,因为所有属性/属性都是公开的,不建议这样做(但我想您这样做是为了避免设计中出现大量额外的 getter/setter)。

    替代方法:

    您的叙述描述了一个单独的用例,即执行税收计算,包括输入计算数据、打印和发送数据。演员可能是您客户的文员,也可能是税务局的职员。

    在阅读叙述时,我发现以下课程候选人按时间顺序排列:增值税、国家/地区、税率、所得税、“特定国家/地区的税表”、总额、年收入、税收计算、税务局。让我们仔细看看:

    • 税务局很不清楚:每个税务局都有网络打印机吗?相关税务机关如何确定?每个国家/地区是否有一个办事处,或者组织可以更复杂吗?
    • 增值税和所得税有很大不同:
      • 增值税有different rates per country。适用税率始终是已知的,计算基于适用税率和总值。
      • 对于所得税,叙述中提到了特定国家/地区的税表:这意味着税率可能事先不知道,但取决于应税收入水平。 (例如,Austria 有最低费率,超过了统一费率;但在France 中,有正常费率,前 500K 欧元的费率降低)。实际上,所得税要复杂得多,因为它也可能取决于企业的法律形式,或者收入的用途(再投资与分配),但让我们保持简单的练习。该措辞使每个国家/地区是否有一张桌子或多张桌子变得模棱两可。
      • 不过,您可以概括税收的概念,如果您愿意,在本练习中考虑到它的金额是根据基本金额(总金额或年收入)计算的。
    • 税收计算不完全清楚:它只是用户界面,还是计算实际上是某个域对象。这会给我们:

    这将导致如下图:

    【讨论】:

    • 是的,简单的关联通常是最好的。多重性似乎也更好(例如here您可以看到奥地利的正常税率为20,降低的税率为10,但有些国家甚至有超降低的税率,更不用说一定的税率变化日期)。继承是第二个选项。但是没有金额就无法计算任何税款。所以你必须微调 API。并且可能类别应该在速率的水平
    • @AbdalrohmanAlsalkhadi 作为关于堆栈溢出的一般建议:当您在发布答案后显着更改问题时,请在问题中说明您所做的更改,否则人们只会看到问题的最后状态和一个不再匹配问题并且看起来不相关或错误的答案。最好的方法是保留原始图表,并在末尾添加新图表,说明它是新版本:-)
    • @AbdalrohmanAlsalkhadi 关系名称(在大多数情况下)相当没有意义。附带说明:带问题的乒乓球并不是你能做的最好的。请保留一个问题,不要将您的逐步答案添加到问题中。
    • 你显然没有仔细阅读克里斯托弗斯的回答。
    • @AbdalrohmanAlsalkhadi 我用你最后一张图表上的最后几个 cmets 编辑了答案。我还添加了一个关于替代方法的部分,其中我以我的方式进行了叙述(但故意离你的不太远),并提出了一些问题,不是关于 UML,而是关于域。您会注意到关联名称,在某些情况下是它的角色名称,以及协调税收 API 的大部分努力,将税率隔离到唯一有意义的情况。如有疑问,请查看here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2011-01-08
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多