【问题标题】:How to describe C# yield return in UML sequence diagram?如何在 UML 序列图中描述 C# yield return?
【发布时间】:2023-04-05 07:25:01
【问题描述】:

例如,

using System;
using System.Collections;

namespace ConsoleApplication
{
    class A : IEnumerable
    {
        B b;
        public A()
        {
            b = new B();
        }
        public IEnumerator GetEnumerator()
        {
            yield return b.FunA(0);
            yield return b.FunB(1);
            yield return b.FunC(2);
            yield return b.FunD(3);
            yield return b.FunE(4);
        }
    }

    class B
    {
        public int FunA(int x)
        {
            return x;
        }
        public int FunB(int x)
        {
            return x * 2;
        }
        public int FunC(int x)
        {
            return x * 3;
        }
        public int FunD(int x)
        {
            return x * 4;
        }
        public int FunE(int x)
        {
            return x * 5;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var a = new A();
            foreach(var number in a)
            {
                Console.WriteLine(number);
            }
            Console.ReadLine();
        }
    }
}

如何用时序图描述这个程序? 我认为它应该类似于下面的循环或 alt 部分。

+------------+ +------------+ +------------+ |程序 | |一个 | |乙| +-----+------+ +------+-----+ +------+-----+ | | | | | | | | | | | | +-----+-------------------------------------------- ------------------+ |循环 | | [0] | | | +-----+ | | | | | | | | | | | | | | | | | | | +-------------------------------------------------- ------------------+ | | [1] | | | | | | | | | | | | | | | | | | | | | | | +-------------------------------------------------- ------------------+ | | [2] | | | | | | | | | | | | | | | | | | | | | | | +-------------------------------------------------- ------------------+ | | [3] | | | | | | | | | | | | | | | | | | | | | | | +-------------------------------------------------- ------------------+ | | [4] | | | | | | | | | | | | | | | | | | | | | | | +-------------------------------------------------- ------------------+ | | | | | |

编辑: 我正在分析 Unity3D 的一个插件的源代码。 IEnumerator 和 yield 用于实现协程模型。协程用作线程的替代方案。所以在时序图中展示协程的部分逻辑是合理的。

【问题讨论】:

  • 就个人而言,我不会。恕我直言,序列图更适合对象之间交互的一系列步骤。如果这些步骤只是重复相同的动作,迭代一系列值,这对我来说似乎没有什么用处。
  • @PeterDuniho 也许最好明确一点,我正在阅读一些用 Unity3D 编写的代码。 IEnumerator 和 yield 用于实现 coroutine 模型。 coroutine 被用作线程的替代方案。所以说这些步骤只是相同动作的重复是不恰当的
  • 我会选择@PeterDuniho。在大多数情况下,以图形方式描述代码没有附加价值。 SD 应用于通信概述。代码更好地描述算法。将 SD 中区域的使用减少到最低限度!
  • @ThomasKilian SD 应该用于通信概述。 是的,我的意思是向其他人解释源代码,显示类的交互很重要。
  • 类的交互不是程序逻辑。您以图形方式绘制一个 for 循环。这不是概述,而是对算法的描述。

标签: c# uml yield


【解决方案1】:

对于序列图,您可以定义循环(while 循环),只要关注 yield 关键字执行,请参考以下链接 internals of C# interators

我认为这个链接将帮助您理解为什么产量可以表示为循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多