65.9K
CodeProject 正在变化。 阅读更多。
Home

Mo+ - 面向模型的编程语言和 IDE,用于面向模型的开发

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.98/5 (45投票s)

2013年6月21日

CPOL

23分钟阅读

viewsIcon

121668

downloadIcon

4916

Mo+ 是第一个完全支持面向模型开发的技术,它使软件开发人员能够有力地扩展他们已经完成的工作。

注意:最新源代码可在 github 上找到:github.com/moplus/modelorientedplus。最新版本的安装程序(包括对 Visual Studio 包的支持)和示例包位于:github.com/moplus/modelorientedplus/releases

Mo+ 也作为扩展在 Visual Studio Gallery 中提供。

什么是面向模型开发?

面向模型开发 (MOD) 是一种流程,允许您在开发过程中的任何时候利用简单、集中的模型进行开发。您可以使用面向模型的模式或模板将模型信息转换为源代码和/或文档。

为什么要考虑面向模型开发?

您是一位繁忙的软件开发人员。您从事遗留系统的工作,或者从零开始创建新系统。您是瀑布、Scrum 或测试驱动开发等流程的拥护者或必须遵守这些流程。您喜欢或必须使用特定的编程语言。您的日常工作受到时间和其他限制。为什么您会考虑添加面向模型开发这样的东西?

面向模型开发 (MOD) 通过以下方式使您的开发工作受益:

  • 灵活 - 使用 MOD,您根本不必更改当前的整体开发流程。您可以选择在开发流程的早期或晚期利用简单、集中的模型。您可以选择利用模型的程度来生成和维护您选择的语言的代码。您将生成的代码与您的自定义代码无缝集成。

  • 高效 - 扩展并利用您已经完成的工作。与其多次编写相似的东西,不如为某个组件编写一个面向模型的模式一次,并将其应用于您工作中所有相似的东西。

  • 强大而健壮 - 当您需要它们解决带有业务规则和异常的复杂问题时,普通的基于模板/过程的代码生成工具往往会失败。编写良好的 MOD 工具(如 Mo+)让您完全访问您的模型,并能够指示您的规则和异常。面向模型的模式让您能够解决非常复杂的问题!面向模型代码中的错误数量往往较低,因为问题通常会在早期发现并解决。

  • 可重用 - 将根据您的最佳实践编写的面向模型的模式不仅用于当前项目,还用于未来的项目!重用强大的团队或社区开发和审查的模式。

简而言之,面向模型开发允许您继续您已经完成的工作,并且它允许您扩展您的工作以做得更好!

有效面向模型开发的要求

为了有效的面向模型开发,以下要求至关重要

  • 您需要一个模型 - 您需要一个模型来表示您希望您的系统是什么以及做什么。如果没有能力指定系统的结构和行为,您在代码生成和其他自动化方面所能做的事情就会受到限制。

  • 简单、专注、灵活的模型 – 模型结构应该简单、灵活且专注,包含面向模型开发所需的基本信息。设计、平台和层级细节通常应从模型中省略,并在您将模型信息转换为代码和文档时进行处理。总的来说,您需要建模工作量较低。

  • 完全访问模型 – 您需要能够以任何您认为合适的方式填充模型。您需要能够指示异常或其他条件。您可能需要创建自己的模型结构。您需要能够轻松识别您的模型结构。您需要灵活的方式来浏览、搜索和检索您的模型数据以执行您的任务。

  • 最大化代码生成 – 您需要能够充分利用您的模型信息,并最大化您的自动管理代码和文档的质量(不一定是数量)。然而,总的来说,您希望代码生成工作量相对较小。

  • 与自定义代码无缝集成 – 您需要自动管理代码和文档与您的自定义信息无缝集成。您需要能够在生成的文档中插入和维护异常和特定的业务规则。您需要生成的和自定义的代码和文档优雅地共存。

  • 完全控制代码生成 – 作为团队开发工作的一部分,您不能每次都重新生成所有代码。您需要完全控制何时、何地以及如何更新生成的代码和文档。

  • 最佳实践 – 您希望完全控制您的自动管理代码和文档,以使其符合您的组织和行业最佳实践以及其他要求。

介绍 Mo+

有三种方法被证明对许多软件开发应用程序有效:建模基于模板的代码生成面向对象编程Mo+ 是第一项将这些方法合并并将其发展为真正面向模型的方法,以实现有效的面向模型开发的技术。

Mo+ 独特地结合了专注而灵活的模型、强大的面向模型编程语言和完整的集成开发环境,用于构建和维护模型,并从这些模型以多种灵活的方式创建和维护代码及其他文档。

您可以使用 Mo+ Solution Builder 使用以 Mo+ 语言编写的下载或创建的模板,非常快速地创建和维护企业解决方案、软件应用程序、任何语言的源代码以及其他材料。

Mo+ 是 Model Oriented Plus 的缩写,它是一种面向模型的编程语言,使用户能够执行各种任务,例如创建和维护任何语言的模型、文档和源代码。该语言与 C# 或 Java 等面向对象语言有一些相似之处,但具有直接面向模型驱动开发的功能。

免费、开源的 Mo+ Solution Buildermoplus.codeplex.com 上维护。在此网站上,您可以获取最新的安装程序、源代码和包含示例代码和规范模板库的示例包。文档部分还提供了许多视频教程。

Mo+ Solution Builder 使用以下其他开源组件

  1. Mo+ 解释器由 Irony 解析器提供支持 (https://irony.codeplex.com/)。

  2. 模板编辑使用 AvalonEdit 控件 (https://codeproject.org.cn/Articles/42490/Using-AvalonEdit-WPF-Text-Editor)。

  3. 文档查看通过 AvalonDock 增强 (https://avalondock.codeplex.com/)。

  4. 模板文档中的搜索和替换通过此查找/替换对话框增强 (https://codeproject.org.cn/Articles/173509/A-Universal-WPF-Find-Replace-Dialog)。

为什么使用 Mo+ 进行面向模型开发?

简而言之,Mo+ 是唯一能够“完成闭环”以释放面向模型开发全部威力的技术,它允许您以面向模型的方式完成其他技术无法完成的事情。Mo+ 轻松满足了上述所有要求。

面向对象程序员都知道面向对象语言在创建大型复杂软件方面相对于过程语言的优势,例如封装、可重用性、模块化、清晰性等。为什么您在管理面向模型开发模板时不能拥有这些相同的优势呢?使用 Mo+ 就可以!

虽然其他代码生成模板方法本质上是过程性的,但 Mo+ 模板(和语言)在设计上是面向模型的。Mo+ 模板可以像任何其他内置属性或方法一样被其他模板使用。它们可以用于表达式、创建内容和更新输出。您可以轻松地分解复杂任务,并在可重用模板中指定您的约定和最佳实践。Mo+ 模板相对于其他形式的模板这种高度的可重用性将使其更容易维护和发展您的代码以满足不断变化的需求。

为了让您的工作更轻松,我们计划在不同平台和语言中,根据社区的输入和审查,不断构建针对不同模型、应用程序、组件和其他文档的模板库。

Mo+ Solution Builder 是如何工作的?

Mo+ Solution Builder 包含一些基本功能,例如

  • 能够查看和编辑代表您要开发内容的模型。

  • 能够以您想要的任何方式从数据库和 XML 源加载模型信息,并为您提供自定义模型数据的方法.

  • 能够创建、维护面向模型的工作并将其与您的整体工作集成,包括任何语言的源代码、其他模型和其他类型的文档。

  • 能够创建、编辑、组织和调试用 Mo+ 编写的规范和代码模板。

MoPlusUI.png

使用 Mo+ Solution Builder,用户可以利用内部创建或下载的代码和规范模板库,非常快速地创建模型和输出解决方案。下图概述了实现此目的的基本过程。

MoPlusWorkflow.png

简而言之,使用 Mo+ Solution Builder 创建模型和输出解决方案的基本过程是

  • 使用 Solution Builder 界面,用户创建一个解决方案模型,可选地指定模型信息的来源作为规范源。对于每个规范源,用户选择一个 Mo+ 模板,该模板概述了如何从该源更新模型信息。

  • 规范解释器处理每个规范源,以评估规范输入(例如数据库或 XML 文件),并根据相应模板中的指令更新解决方案模型中的信息。规范解释器将特征、实体、属性、关系和方法等信息添加到模型中。

  • 用户可以进一步自定义解决方案模型,添加或修改特征、实体、属性、关系、方法等。

  • 用户在解决方案模型中创建项目,这指定了要生成的解决方案输出的类型。对于每个项目,用户选择一个 Mo+ 模板,该模板概述了如何创建和更新解决方案输出。

  • 代码解释器处理每个项目以评估 Mo+ 模型,并根据相应模板中的指令更新解决方案输出。代码解释器创建并更新诸如源代码文件、项目文件、数据库表或过程、测试用例、配置文件和其他文档等信息。

  • 使用 Solution Builder 界面,用户还可以创建、编辑和调试 Mo+ 规范模板和 Mo+ 代码模板,以定制模型更新或解决方案输出更新。

  • 用户将 Mo+ 模型保存为 Mo+ 模型文档。此文档只是一个 XML 文件,它只存储用户直接创建的信息(而不是从规范源解释的信息)。

创建和使用简单的 Mo+ 代码模板

在这里,我们将通过一个创建解决方案模型、代码模板和生成报告的基本示例。解决方案模型和模板将以其原始格式呈现。Solution Builder IDE 以友好的方式呈现此信息,包括树视图、表单、文本着色和突出显示,当然还有调试。

一切都始于模型

首先,您需要一个模型来表示您要生成和维护的内容的结构和行为。该模型包含实体、关系、属性等信息,可能还有更多。

我们将构建一个简单的解决方案,其中包含一个特征(订单),在该特征下,我们将有两个实体(客户和订单)。客户和订单实体将具有一些 ID 和 Name 属性。

解决方案模型存储为 XML 文件(例如 MyOrders.xml),我们的示例解决方案(省略其他详细信息)如下所示

<Solution>
    <SolutionName>MyOrders</SolutionName>
    <TemplatePath>
        C:\MyCodeTemplates\EntityAndPropertyReport.mpt
    </TemplatePath>
    <FeatureList>
        <Feature>
            <FeatureName>Orders</FeatureName>
            <EntityList>
                <Entity>
                    <EntityName>Customer</EntityName>
                    <PropertyList>
                        <Property>
                            <PropertyName>CustomerID</PropertyName>
                        </Property>
                        <Property>
                            <PropertyName>CustomerName</PropertyName>
                        </Property>
                    </PropertyList>
                </Entity>
                <Entity>
                    <EntityName>Order</EntityName>
                    <PropertyList>
                        <Property>
                            <PropertyName>OrderID</PropertyName>
                        </Property>
                        <Property>
                            <PropertyName>OrderName</PropertyName>
                        </Property>
                        <Property>
                            <PropertyName>CustomerID</PropertyName>
                        </Property>
                    </PropertyList>
                </Entity>
            </EntityList>
        </Feature>
    </FeatureList>
</Solution>   

创建代码模板

在这里,我们将创建一个名为 EntityAndPropertyReport 的代码模板,用于为我们的小型解决方案生成报告。此模板存储在扩展名为 .mpt 的文件中(例如 EntityAndPropertyReport.mpt),其原始格式如下

<CONFIG>
    NAME EntityAndPropertyReport
    CATEGORY Test
    NODE Solution
    TOPLEVEL True
</CONFIG>
<CONTENT>
<%%-List of entities and their properties:%%>
<%%:
foreach (Entity)
{
    <%%-
    Entity: %%><%%=EntityName%%>
    foreach (Property)
    {
        <%%-
        Property: %%><%%=PropertyName%%>
    }
}
%%>
</CONTENT>
<OUTPUT>
<%%=SolutionDirectory%%><%%-/EntityAndPropertyReport.txt%%>
<%%:
if (File(Path) == null || File(Path) != Text)
{
    update(Path)
}
%%>
</OUTPUT> 

代码模板分为三个部分

  • 配置 - 这是由 <CONFIG></CONFIG> 标签限定的区域。此部分概述了如何识别和使用模板。此模板由其 NAME, EntityAndPropertyReport 标识。NODE 也很重要,它指示此模板最初在解决方案模型中操作的实例类型。这是一个解决方案模板,当调用此模板时,它将始终传递解决方案实例。

  • 内容 - 这是由 <CONTENT></CONTENT> 标签限定的区域。此部分构建要放置在某处和/或由调用模板使用的文本内容。此部分可以包含将原始文本附加到内容、模型数据和其他表达式数据附加到内容,以及任意数量的丰富语句集以执行任务来构建内容。

  • 输出 - 这是由 <OUTPUT></OUTPUT> 标签限定的区域。此部分包含决策制定,以确定何时、何地以及如何执行文件系统上模板内容和其他材料的更新。此部分可以包含将原始文本附加到输出路径、模型数据和其他表达式数据附加到输出路径,以及任意数量的丰富语句集以执行输出更新的决策制定。

带有适当高亮显示的内容部分如下所示

Template content section

此部分首先附加一些原始文本,该文本由 <%%- 和 %%> 文本标签限定。之后是一组由 <%%: 和 %%> 评估标签限定的语句。

让我们看看 foreach (Entity) 语句。这里发生了什么?由于是面向模型的,当调用此模板时,它会传入解决方案实例,该实例被推送到模板的上下文堆栈。在 foreach (Entity) 语句处,解释器获取解决方案中所有实体(在我们的例子中是客户和订单)的集合,并且在 {} 之间的一组语句中,将集合中的下一个实体推送到堆栈上(并在 foreach 范围结束时将其从堆栈中弹出)。在这个 foreach 中,您可以直接访问实体的属性,例如 EntityName。这是一种模型上下文形式,它消除了在 foreach 和其他语句的范围内声明临时变量来保存当前项目的需要。

在此 foreach 中,一些额外的原始文本被附加到内容中。然后实体名称,即由 <%%= %%> 属性标签限定的表达式,是附加到内容中的数据。

foreach (Property) 语句遍历上下文堆栈中实体的属性集。在该语句集中,原始文本和属性名称被附加到内容中。

带有适当高亮显示的输出部分如下所示

Report template output

此部分以附加一些模型数据和原始文本开始,这是要更新的报告文件的路径。if 语句显示了一些关于更新输出的简单决策。在此 if 语句中有两个属性,TextPathText 属性保存了在 Content 部分中形成的内容,而 Path 属性保存了在此 Output 部分中形成的文本。在这种情况下,如果文件不存在或者该文件的内容与 Text 不同,模板将使用 Text 更新指定 Path 处的文件。

生成报告

好的,您有一个模型和一个代码模板,现在怎么办?回到解决方案模型文件,您会看到您的报告模板在 TemplatePath 属性中链接到解决方案。这实际上是解释器的主程序。您可以使用 Mo+ Solution Builder IDE 来创建报告,或者您可以使用 Mo+ Solution Updater 命令行工具来完成此操作

MoPlusSolutionUpdater  MyOrders.xml 

您的输出报告应该如下所示

List of entities and their properties:
    Entity: Customer
        Property: CustomerID
        Property: CustomerName
    Entity: Order
        Property: OrderID
        Property: OrderName
        Property: CustomerID 

总结

一旦您的解决方案模型和模板设置完成,无论您使用 Mo+ Solution Builder IDE 还是 Mo+ Solution Updater 命令行工具,更新输出解决方案文件的过程都是相同的(请参阅上面的流程图)

  • 您的解决方案文件加载到内存中。

  • 如果需要从任何数据库或 XML 规范源加载解决方案模型信息(在我们的示例中没有),规范解释器会调用每个源的主规范模板来构建模型数据。这些规范模板可能会调用其他规范模板等。

  • 代码解释器调用解决方案级模板来更新输出解决方案文件。此规范模板可能会调用其他模板等(在我们的示例中,我们没有进行任何模板调用)。如果解决方案有附加模板的项目,解决方案模板可以调用这些模板来生成其输出(在我们的示例中,我们没有项目)。

这个非常简单的例子只使用了一个代码模板。下图预览了您可以使用模板实现的功能,包括调用带或不带参数的其他模板,以及在表达式中使用模板。

使用随附的下载

随附的下载为您提供了多种安装和使用 Mo+ 的选项。

您有几个选项可以安装 Mo+

  • 安装程序 - WinApp + VS2010 + VS2012 + VS2013 - 如果您使用 Visual Studio (2010-2013),请使用此安装程序。还提供了非 Visual Studio Windows 应用程序,即使您没有 Visual Studio,安装它也没有害处。
  • 安装程序 - 仅限 WinApp - 如果您不打算将 Mo+ 与 Visual Studio 一起使用,请使用此轻量级安装程序。

您有一些示例包可以帮助您开始使用 Mo+ 创建解决方案(您可以将任何这些示例包作为起点,完全按照您的意愿创建模型和解决方案)

  • 入门包(模板) - 此示例包向您展示了一些简单的模板示例,让您了解如何使用 Mo+。有关更多详细信息,请参阅该下载中的 readme 文件。
  • 模型和 .Net 示例包(模板) - 此示例包使您能够从 MySQL 和 SQL Server 数据库加载信息(规范模板),并能够生成各种 .Net 解决方案(代码模板)。有关更多详细信息,请参阅下载中的 readme 文件。
  • Entity Framework Code First 示例包(模板) - 此示例包使您能够生成一个利用 Entity Framework Code First 的工作多层应用程序。有关更多详细信息,请参阅该下载中的 readme 文件。

有关其他信息,请参阅 readme 和源代码下载。

关于查看附带代码

源代码可在 moplus.codeplex.com 获取,您可以在此处下载最新源代码以及安装程序。

列表底部是一些代码和规范模板的示例包。

在 Mo+ 源代码的顶部,查看 MoPlus.Interpreter、MoPlus.SolutionBuilder.WPFClient 和 MoPlus.ViewModel 项目/文件夹。您会发现 Mo+ Solution Builder 的大部分实际上是由它自己生成和维护的(所有名称中带有 _G 的文件以及一些其他文件)。异常通过标记解决方案模型 (MoPlus.xml) 来管理,或者在必要时在生成文档的保护区域内添加自定义。用于生成和维护 Mo+ Solution Builder 的模板也已附加(所有这些都可以在 CodePlex 网站上更轻松地浏览)。

关于建模和模型结构的注意事项

如果我能指出 Mo+ 与其他方法有何不同,那就是 Mo+ 使您能够使用模型做更多的事情,尤其是从代码生成的角度来看。Mo+ 工具目前较少关注从视觉角度进行建模的过程。

Mo+ 不是一种建模语言

UML 和 Mo+ 等建模语言完全不同。Mo+ 是一种面向模型的语言,类似于面向对象语言。Mo+ 使用模型结构元素(如对象)和模型元素实例(如对象实例),以减少您的建模工作量,并最大限度地提高创建和维护高质量代码的能力。Mo+ 旨在创建和维护模型结构和数据。Mo+ 旨在以面向模型的方式创建和维护您的代码和其他文档。

内置与自定义模型结构

Mo+ 语言可以使用此版本 Mo+ Solution Builder 中提供的内置实体/关系+结构。但是,Mo+ 不必使用此结构。事实上,Mo+ 已经可以处理任何层次模型结构(如果您对此主题确实感兴趣,请参阅 moplus.codeplex.com 文档部分中的视频教程 #20)。您可以创建自己的模型结构以满足您的需求。您甚至可以选择模仿 UML 模型结构,并编写模板以从该模型结构填充和生成代码。您只是无法获得可视化工具。

您会问,为什么要这种自定义 ER+ 结构?嗯,这个想法是尽可能少地进行建模,并将模型简化为基本的结构和行为细节。开发人员会在模型中做出较少的设计决策,而更多地通过以面向模型的方式在模板中进行编程。

我期待着收到关于语言和内置模型结构的反馈,看看是否有更多开发人员希望使用当前或改进的内置结构,是否有更多开发人员希望创建自己的结构,或者是否有更多开发人员希望使用 UML 结构等。

建模工具

此版本的 Mo+ Solution Builder 不打算成为 OOA 或 OOD 建模工具。Solution Builder 提供的建模级别更类似于 Entity Framework 等 ORM,但包含行为和结构元素。一些开发人员希望进行 OOA/OOD 建模,利用现有工具,而一些开发人员则不想进行此类建模。尽管您可以从头开始创建模型,但我目前假设大多数 Mo+ Solution Builder 用户会将模型信息存储在其他地方(在关系数据库或 XML 中),对 Mo+ 模型进行很少的额外工作,然后从那里管理他们的代码。

如果有足够多的用户希望使用 Mo+ 工具进行 OOA/OOD 或更广泛的建模,我设想 Mo+ 工具可以发展以满足这一点,或与其他提供该功能的工具集成。期待对此主题的更多反馈!

主要优点

Mo+ 能为您做什么?以下是一些主要优点:

  • 扩展您的工作 - 无需重复进行 100 次类似的工作,使用 Mo+ 一次完成,让 Mo+ 为您管理这 100 次工作!
  • 重用您的工作 - 使用 Mo+ 一次创建代表约定和其他规则的面向模型构建块。多次重用这些构建块以在您的系统中生成各种组件。您通常可以重用这些相同的构建块和更高级别的模板来构建具有不同模型的不同系统!
  • 提高您的更改能力 - 当您的系统更多地以面向模型的方式管理时,您可以轻松更改模型以及面向模型组件的构建方式,并让 Mo+ 自动更新这些组件。然后,您所要做的就是更改您的自定义代码。如果您有 Mo+ 管理的面向模型测试,那么测试这些更改就会变得更容易。
  • 将您的最佳实践编码化 - 将您的最佳实践编码为面向模型的构建块,使您的整体代码(甚至自定义代码)更具可读性和一致性。
  • 让您专注于您的想法 - 凭借以上所有极大地帮助管理繁琐和重复任务的优势,您将有更多时间专注于您的想法!

主要用途

您会在什么时候使用 Mo+?以下是一些主要用途(用例):

  • 从零开始构建系统时 - 从零开始构建系统,使用 Mo+ 扩展您的工作,同时您开发或使用模板,并构建您的模型。
  • 改进遗留系统时 - 创建模型或从现有来源(如数据库)导入模型。当您需要进行功能更改和其他改进时,以面向模型的方式重构组件。首先从面向模型的测试开始,立即获得好处!
  • 构建多个系统时 - 重用您为一个系统创建或使用的模板,并使用不同的模型构建其他系统。以面向模型的方式实现的最佳实践和技术方法使创建新系统变得更加容易!
  • 快速原型设计时 - 使用 Mo+ 示例包,根据您的模型立即生成可工作的应用程序!在您理清需求时重构您的模型,然后更改模板或创建自己的模板以支持您真正需要的代码。
  • 将系统迁移到新技术和方法时 - 将您的技术更改体现为面向模型的模板,从而使您更快地进行这些更改。

了解更多

除了这里介绍的,**_Mo+_** 语言和 **_Mo+ Solution Builder_** IDE 还有更多内容。该语言拥有一套丰富的语句,可帮助搜索和访问模型数据、组装模型数据、组装内容、更新输出文件以及一般的决策制定。模板可以调用其他模板(带或不带参数)来执行任务。模板可以像任何内置属性或方法一样被其他模板使用,以轻松分解复杂的任务。您可以定义受保护区域,以在生成的文档中保存自定义内容。

学习 Mo+ 语言最简单的方法是在 moplus.codeplex.com 下载 Mo+ Solution Builder 和示例包。使用这些示例包创建解决方案模型和输出解决方案,然后修改或创建新的模板。Mo+ Solution Builder 附带的帮助提供了关于语言和模型结构以及用户界面的详细操作指南和参考。

此外,要了解有关 Mo+Mo+ Solution Builder 的更多信息,CodePlex 网站的文档部分(moplus.codeplex.com/documentation)有许多教程。编号靠前的教程涵盖较简单的主题,而编号靠后的教程则深入探讨功能和能力。

以下文章提供了有关 Mo+ 的其他信息

成为会员!

Mo+ 社区通过 https://modelorientedplus.com 网站获得额外支持,并为 Mo+ 的发展做出贡献。 成为会员可以为 Mo+ 用户带来额外好处,例如额外的论坛支持、会员贡献的工具以及投票和/或贡献 Mo+ 方向的能力。此外,我们正在为会员举办月度竞赛,您可以通过使用 Mo+ 开发解决方案来赢取奖金。

如果您对高效的面向模型软件开发有丝毫兴趣,请注册成为会员。 它是免费的,您不会收到垃圾邮件!

历史

© . All rights reserved.