IntelliJ IDEA在一种语言示例上的全部功能(如图)

适用于任何应用程序的经典开发模型都暗含了有关用户界面和API的良好文档,并在必要时对源代码进行了很好的注释。 在这种情况下,系统的定型从研究文档开始,然后直接更改代码,最后更新所有必要的信息。

但是,这种方法的问题之一是它显着增加了成本并减慢了开发过程。 如果不是所有这些怎么办? 然后,IDE得以解救,因此,您可以使用裸代码研究当前逻辑。

当我们使用嵌入式语言开发lsFusion平台时,我们有几种选择。 要么重新发明轮子,然后像1C一样从头开始编写自己的IDE,要么为现有的IDE实施一个插件。 我们走了第二种方式,在本文中,我将展示发生了什么。

由于平台本身是用Java开发的,因此我们有两个主要选择:Eclipse或IDEA。 我们选择了最后一个选项,但没有失败。 当我们做出决定时,IDEA仍然不够流行,但是从那时起,它们就已经成为市场的领导者,而Eclipse却悄然落后。

开发插件本身并不需要花费很多时间,因为可以在平台执行期间直接使用所使用的代码。 因此,通过最少的努力,我们获得了非常强大的IDE,在许多方面,它们的功能明显优于许多其他ERP平台(本机的和基于Eclipse的)的IDE。

IDE在开发中的作用很难被高估。 尽管事实上许多开发人员仍在使用vim并认为应该这样做。 如果一个人发展并进一步支持该守则,则该职位享有生命权。 但是,在涉及大量人员的大型项目中,其互换性非常重要。 员工生病,休假,最后离开。 此外,不同项目的负载是不均衡的,有时需要将更多的人连接到其中一个上,才能满足截止日期。 在这种情况下,您必须将新人员与改进工作联系起来,他们需要快速弄清楚程序当前的工作方式,并进行必要的更改。 IDE来了。

首先,我们需要从IDE获得以下内容:

  • 语法支持 。 关键字突出显示,自动替换,错误突出显示。
  • 导览 转到广告,搜索用途,按文本字符串,文件或名称搜索,等等。
  • 分析 。 类和调用的层次结构,以及类的属性和操作。
  • 重构 重命名类,属性和操作。
  • 表格的可视化 。 向开发人员显示某种形式的当前设计。
  • 元编程 。 快速生成基于元代码的代码的能力。
  • 调试器 设置断点(包括条件),调试命令式逻辑,监视手表的能力。
  • 语言注入 。 在其他语言(Java和JasperReports XML)中使用时,导航,重构,自动替换和lsFusion语法突出显示。

由于我们将IDEA中嵌入的标准方案用于该插件,因此在lsFusion中使用逻辑进行工作的输出结果几乎与Java开发相同。 相同的菜单项,热键,透明的调试(可以从lsFusion代码切换为Java,反之亦然)等。

以下是一些简单的示例,以说明其实际操作方式。

语法支持


该插件可以替换有效的关键字,可能的属性,自动检测各种错误:

图片

导览


“物料管理”示例中获取逻辑。 假设我们需要查看Price属性的声明位置。 为此,您需要将您作为具有管理员权限的用户悬停在我们需要的列的标题上:

图片

在出现的窗口中,您可以立即看到在哪个模块中创建此属性(装运),其中包含什么行号(37),存储该行的表(_auto_Shipment_ShipmentDetail)以及许多其他信息。

要直接进入属性声明,您需要开始文件搜索并在出现的对话框中输入Shipment:

图片

图片

然后,使用导航-行/列,转到第37行,在此处看到属性声明:

图片

在光标位于所需属性上时,通过按CTRL + ALT + F7,您可以快速找到其在所有项目中的所有用途:

图片

在这种情况下,价格的第一个用途是计算每行的金额。 最后两个添加到适当的形式。

如有必要,如果删除了相应的选项,则只能通过按此属性中的记录来启用搜索:

图片

然后,仅此属性中的条目将保留在列表中。 要找出写入的特定值,您需要将光标放在salePrice上,然后单击“转到声明”或“用法”。 接下来,返回导航-返回并转到item属性的声明:

图片

总而言之,我们发现在需要的位置声明了该属性,在什么情况下使用了该属性,以及何时进行记录。 在视频上,我用鼠标进行了所有操作,尽管实际上,实际上只使用了键盘。 通过此技术,您可以完全确定将要导致的结果,从而快速确定当前实现的系统逻辑并对其进行更改。

重构


通常,在某些情况下需要更改属性,类,表单或系统中任何其他元素的名称。 要执行此操作,您需要站在此元素上,然后单击“重构-重命名”:

图片

重命名元素会自动在所有使用位置更改源代码。 另外,如果创建了migration.script文件,则将在其中添加相应的条目。 服务器需要知道名称更改的顺序,例如,以便自动将数据从一列迁移到另一列。 否则,将重命名与创建具有不同名称的新属性区分开来是不可能的。

分析方法


在执行重构之前,通常有必要找出“正在发生的事情”和“所有这些人是谁”。

为此,IDEA几乎是开箱即用的,可让您查看所选类的结构(该类可用的属性和操作):



另外,如果您需要大致了解正在发生的事情,则IDEA允许您构建各种层次结构:

  • 所选类别的继承
  • 所选项目的用途(例如,属性或表单)



实施搜索引擎广告后,IDEA会自动(以最少的手势)提供所有重要功能。 以下功能集合使插件有了更多的修改,但是IDEA提供了基础架构的重要部分(当然不是没有问题,稍后会更多)。

表格可视化


在lsFusion中,使用特殊结构以与域逻辑相同的代码设置表单的结构和设计。 此外,可以在不同的模块中声明表单的不同部分,并且服务器启动时,它们将“合并”在一起,具体取决于所连接的模块。

要查看结果设计,您当然可以重新启动服务器,并在客户端中查看结果。 但是服务器重新启动需要一些时间。 插件可以:

  • 在特殊的窗口中显示表单的当前设计和层次结构
  • 在形状结构中查找元素
  • 高亮显示设计中选定的形状元素

这是在IDE中的外观:

图片

构建表单时,仅考虑当前的活动模块及其依赖的所有内容。

由于表单是由几个代码块组成的,因此尚无法从视觉上更改当前的设计。 在修改期间,很难清楚地确定您需要在哪个位置进行适当的更改。 此外,可以在多个代码块中修改同一元素,并且该平台确保如果一个模块依赖于另一个模块,则其更改将最后应用。 但是,将来我们计划为视觉设计更改添加某些功能。

元编程


有时需要为各种任务创建相同类型的代码。 LsFusion具有元代码机制,该机制使您可以基于某些模板生成代码。 在这种情况下,如果元代码发生更改,则代码将自动更新。 实际上,这是一种自动复制/粘贴功能,能够用指定的值替换某些标识符。

要启用此机制,必须首先在菜单中将其激活。 之后,IDE将自动更改相应的代码。

图片

服务器启动时,将仅使用生成的代码。 启动服务器时,将不会考虑META模板本身。

顺便说一下,实现元编程的可能性迫使我们为开源(在本例中为Intellij IDEA)做出了另一贡献。 事实是,在ERP中,元代码的使用非常活跃,因此,经常需要生成代码/删除生成的代码。 这导致大量的异步文件更改,进而导致一个非常特殊的错误 。 问题在于它们无法在JetBrains本身中播放,因此所有这些都归结为我们自己必须编写一个非工作单元测试的事实。 这当然花费了几天,但间接地帮助我们实现了以下两种可能性。

调试器


当代码完全不清楚发生了什么时,您必须转向调试器。 在命令式逻辑的任何行上(动作,事件,限制),都可以设置断点。 一旦服务器执行到这一点,它将停止并控制将进入调试器。 此时,您可以观看手表,也可以逐行继续执行。 在左侧,将显示一个堆栈跟踪,您可以像在调试常规Java应用程序时一样浏览。

图片

查看当前值时,可以访问当前对象(例如Shipment)和数据库中的任何其他对象(例如Item i)。 但是,开发人员本人负责向手表中添加数据,读取数据会花费大量时间或内存,并且会导致性能下降。

您还可以在特定属性上设置断点。 对其进行记录时,执行将在任何地方停止:

图片

当您需要确定哪个事件或操作更改属性的值时,此功能很有用。

为了实际实现调试器,我们实际上使用了现有的IDEA Java调试器。 也就是说,该平台已作为常规Java应用程序进行了调试,但是对于lsFusion操作,我们创建代理Java方法并将其显示替换为我们的代码(据我在IDEA中了解的那样,这样做是为了支持Scala和其他基于Java的包装器)。 这是一个有趣的时刻。 在某些时候,IDEA开发人员其Java调试器构造函数设为私有。 而且,如果仍然可以通过反射来规避调用私有方法的情况,那么不清楚如何从带有私有构造函数的类继承。 但是就在那时,在上半部分出现了一个摊牌,上面有一个错误,我们“决定要求JetBrains的人员重新保护此构造函数,”他们对此反应很快(对此,当然要感谢他们)。

语言注入


IDEA最不寻常的功能之一就是能够以其他语言的字符串常量为您的语言提供支持。 为此,只需准确告诉IDEA哪种字符串常量适用于您的语言,然后自动告诉IDEA:

  • 为每个字符串常量生成一个具有给定前缀的虚拟文件(或多个文件)
  • 在源文件的编辑器中为所有常量创建一个进入该虚拟文件的“窗口”
  • 在此虚拟文件中提供对“嵌入式”语言的所有功能的支持,例如突出显示错误,切换到广告,自动完成,搜索用途以及最重要的是重构。 也就是说,当用一种语言重命名任何元素时,它会自动用其他语言引用该元素的所有字符串常量重命名。 因此,可以自动保护您免受断开的链接的攻击。



在IDEA中,这里有一个(现在仍然是)小错误 。 当虚拟文件很大时,如果IDEA在继续使用它时应转到“实现窗口”的开头,则实际上会转到先前的“实现窗口”的末尾(例如,到Java文件中该属性的先前使用)。 当然,有一个解决此错误的简单方法是为每个字符串文字创建一个单独的虚拟文件。 但是,当使用次数超过30次时,这种方法会变慢,因此,在这种情况下,您仍然必须使用一个大的虚拟文件(另一方面,当使用次数很多时,找到正确的用途并不难,也就是以下用途)。 我们要求在“服务交换”的框架中再次修复该错误,而JetBrains开发人员已对其进行了修复,但后来发现,某种程度上还是没有(通过提交仍然可以看到,但是我们认为这并没有达到最后了解他)。 但是,很长一段时间以来,我们都已经习惯了此错误,因为在一个文件中使用30个以上元素的情况非常少见。

结论


本文仅描述主要用例。 它还具有搜索抽象属性和类的实现,可视化模块和属性之间的依赖关系,基于xml / json自动生成表单等功能。 而且,当然,它与Git和Subversion的主要版本控制系统进行了内置集成,并支持Maven和Ant。

沿着开发IDEA插件的道路,我们不费吹灰之力就获得了一个非常强大的免费集成开发环境,该环境在许多方面都超过了竞争对手IDE。

Source: https://habr.com/ru/post/zh-CN465573/


All Articles