能否将Cockburn风格的文本UML用例内容嵌入代码库以提高代码可读性?

6

在代码中尝试使用Cockburn用例进行实验

我正在编写一些复杂的UI代码。我决定采用Cockburn用例(Martin Fowler在他的书“UML Distilled”中讨论了鱼、风筝和海平面)并将其封装在静态C#对象中,以便可以针对表示UI工作流程步骤的静态常量测试逻辑条件。这个想法是,您可以阅读代码并知道它在做什么,因为封装的对象及其公共常量通过名称空间给出了英语用例。

此外,我将使用反射来生成包括描述的用例的错误消息。这个想法是,堆栈跟踪可以包含一些英文用户界面用例步骤....结果证明这是一个有趣的方法来实现小型、伪轻量级域语言,但不必编写DSL编译器。所以我的问题是这样做是否是一个好方法?有没有其他人做过类似的事情?


c#示例片段如下

假设我们有一个aspx页面,其中有3个用户控件(具有大量可点击部分)。用户必须单击一个特定的用户控件上的内容(可能进行某种选择),然后,UI必须以视觉提示用户选择成功。现在,在该项被选择的同时,用户必须浏览网格视图以查找另一个用户控件中的项目,然后选择某些内容。这听起来很容易管理,但代码可能会变得混乱。

在我的情况下,所有的用户控件都发送了事件消息,这些消息被主页面捕获。这样,页面就像UI事件的中央处理器一样,可以跟踪用户点击时发生的情况。

因此,在主aspx页面中,我们捕获第一个用户控制的事件。

using MyCompany.MyApp.Web.UseCases;   

protected void MyFirstUserControl_SomeUIWorkflowRequestCommingIn(object sender, EventArgs e)
{
  // some code here to respond and make "state" changes or whatever
  //
  // blah blah blah


  // finally we have this (how did we know to call fish level method?? because we knew when we wrote the code to send the event in the user control)
  UpdateUserInterfaceOnFishLevelUseCaseGoalSuccess(FishLevel.SomeNamedUIWorkflow.SelectedItemForPurchase)

}



protected void UpdateUserInterfaceOnFishLevelGoalSuccess(FishLevel.SomeNamedUIWorkflow  goal)
{
  switch (goal)
  {
     case FishLevel.SomeNamedUIWorkflow.NewMasterItemSelected:
           //call some UI related methods here including methods for the other user controls if necessary....
           break;
     case FishLevel.SomeNamedUIWorkFlow.DrillDownOnDetails:
           //call some UI related methods here including methods for the other user controls if necessary....
           break;
     case FishLevel.SomeNamedUIWorkFlow.CancelMultiSelect:
           //call some UI related methods here including methods for the other user controls if necessary....
           break;

     // more cases...


     }
  }

}


//also we have
protected void UpdateUserInterfaceOnSeaLevelGoalSuccess(SeaLevel.SomeNamedUIWorkflow  goal)
{
  switch (goal)
  {
     case SeaLevel.CheckOutWorkflow.ChangedCreditCard:
        // do stuff


     // more cases...


     }
  }

}

因此,在MyCompany.MyApp.Web.UseCases名称空间中,我们可能会有以下代码:

class SeaLevel...
class FishLevel...
class KiteLevel...

嵌入在类中的工作流用例可以是内部类、静态方法、枚举或任何使命名空间最清晰的东西。我不记得我最初做了什么,但你明白我的意思。


我正在使用C#开发一个Web应用程序。以下是一些代码片段,以便让您了解。 - fooledbyprimes
使用 MyCompany.MyApp.Web.UseCases;protected void MyFirstUserControl_SomeUIWorkflowRequestCommingIn(object sender, EventArgs e) { ... 当FishLevel.SomeNamedUIWorkflow.SelectedItemForPurchase成功时,更新用户界面上的鱼等级用例目标。 } - fooledbyprimes
我并非故意这么做。我只是在编辑一个帖子时,网络应用程序出了点问题。无论如何,我试图找出如何删除第二个帖子,但需要一些时间。新手可能无法找到删除按钮... :) 我会再次查看的。感谢您的提醒。 - fooledbyprimes
嗯...我在尝试找到删除意外重复帖子的方法时遇到了困难。有人能帮我一下吗?谢谢。 - fooledbyprimes
好的...!我找到了删除按钮!!!因为我太蠢了,所以很难看到它! :) - fooledbyprimes
显示剩余8条评论
2个回答

2

我从未尝试过,但经常考虑使用UC风格编写代码,先编写主要成功路径,然后将扩展作为下面捕获的异常。还没有找到理由去这样做 - 希望看到有人尝试并编写代码,即使在实验之后我们得出结论它很糟糕,尝试和参考仍将是有趣的。


1

我认为这是《设计模式》(四人帮)中中介者模式的一种变体,因此我认为这是一种有效的方法。在该模式中,他们讨论了控件之间复杂交互的原因。

编辑:链接到维基百科上的中介者模式


感谢您的输入。实际上,在我的代码中,我没有创建类的实例。我只是使用静态类作为保存鱼、风筝和海平面用例名称的方式。每个用例都是工作流程中的成功步骤。因此,我认为这不是完整的中介者模式。 - fooledbyprimes
不,这与维基百科描述的不同,但模式的概念是它们可以以许多不同的方式完成。我仍然认为这是中介者——它通过集中处理解决了复杂交互的问题——这是该模式的主要要点。 - Lou Franco
好的,我明白你的观点。然而,我仍在努力说服自己,我正在实现该模式的一个变体。我会再考虑一下。你有使用Cockburn风格的用例在代码库中的经验吗?我想人们已经将它们用于文档,但是在代码中呢? - fooledbyprimes
我还没有看到试图将Cockburn用例放入代码中的代码,但如果你发现它有用,那么我认为这已经足够证明它是有用的。 - Lou Franco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接