Blog | Phodal - A Growth Engineerhttp://www.phodal.com/blog/2020-10-11T00:59:23.066373+00:00BlogGradle IDEA 的项目模型2020-10-11T00:58:45+00:002020-10-11T00:59:23.066373+00:00Phodal Huanghttp://www.phodal.com/blog/author/root/http://www.phodal.com/blog/gradle-idea-project-model/最近在为新的工具 [Scie](https://github.com/phodal/scie/) 设计一个模型,以用于描述一个具体的代码工程。而刚好最近也在学习 Gradle 相关的项目模型,便想写一篇文章记录一下相关的模型,以支撑起 Scie 的开发。
PS:相关的代码位于 Gradle 源码中的 IDE 部分。
总体来说,用于支撑 IDE 开发的这个模型主要由这么几部分组成:
- Project,最顶层的类,包含项目的所有信息。
- Modules,模块,包含单个模块的信息。
- GradleProject,包含一个模块的 Gradle 的相关信息。
- ContentRoot,源码部分。
- Dependency,依赖
从目录上来看总体的类便是,这个就是我们所需要的所有 Gradle 的 IDEA 相关的接口模型了。
- BasicIdeaProject
- IdeaCompilerOutput
- IdeaContentRoot
- IdeaDependency
- IdeaDependencyScope
- IdeaJavaLanguageSettings
- IdeaLanguageLevel
- IdeaModule
- IdeaModuleDependency
- IdeaModuleIdentifier
- IdeaProject
- IdeaSingleEntryLibraryDependency
不过,还是让我们从头看起,即 IdeaProject 部分。
## IdeaProject
IdeaProject 部分的代码相对来说还是比较简单的,主要描述了项目相关的模块(Module)、JDK 信息和对应的语言版本等。
```java
public interface IdeaProject extends HierarchicalElement {
IdeaJavaLanguageSettings getJavaLanguageSettings() throws UnsupportedMethodException;
String getJdkName();
IdeaLanguageLevel getLanguageLevel();
DomainObjectSet<? extends IdeaModule> getChildren();
DomainObjectSet<? extends IdeaModule> getModules();
}
```
为了文章的完整性,我补充一下相关的接口类:
```java
public interface HierarchicalElement extends Element {
@Nullable
HierarchicalElement getParent();
DomainObjectSet<? extends HierarchicalElement> getChildren();
}
public interface Element extends Model {
String getName();
@Nullable
String getDescription();
}
```
接着,就是 IdeaModule 部分了。
## IdeaModule
代码也相对比较简单:
```java
public interface IdeaModule extends HierarchicalElement, HasGradleProject {
@Nullable
IdeaJavaLanguageSettings getJavaLanguageSettings() throws UnsupportedMethodException;
String getJdkName() throws UnsupportedMethodException;
DomainObjectSet<? extends IdeaContentRoot> getContentRoots();
GradleProject getGradleProject();
IdeaProject getParent();
IdeaProject getProject();
IdeaCompilerOutput getCompilerOutput();
DomainObjectSet<? extends IdeaDependency> getDependencies();
}
```
除了 Java 相关的配置信息,还有几个点值得关注:
- 描述源码相关的 IdeaContentRoot
- 描述 Gradle 信息的 GradleProject
- 描述依赖的 IdeaDependency
- 描述输出的 IdeaCompilerOutput
这里我们主要关注于 `IdeaContentRoot` 和 `IdeaDependency`
## IdeaContentRoot
IdeaContentRoot,是用于描述源码相关的信息。这里,只需要看一下对应的接口,就能了解对应的信息了:
```java
public interface IdeaContentRoot {
File getRootDirectory();
DomainObjectSet<? extends IdeaSourceDirectory> getSourceDirectories();
DomainObjectSet<? extends IdeaSourceDirectory> getGeneratedSourceDirectories();
DomainObjectSet<? extends IdeaSourceDirectory> getTestDirectories();
DomainObjectSet<? extends IdeaSourceDirectory> getGeneratedTestDirectories();
DomainObjectSet<? extends IdeaSourceDirectory> getResourceDirectories() throws UnsupportedMethodException;
DomainObjectSet<? extends IdeaSourceDirectory> getTestResourceDirectories() throws UnsupportedMethodException;
Set<file> getExcludeDirectories();
}
```
简单来说,就是我们在使用 IDE 的过程中,用于开发的那些要素:源码、测试代码、资源等等。
## IdeaDependency
由于依赖采用的是 `DomainObjectSet<? extends IdeaDependency>`,即继承了这个接口的类都行,于是我找到了:
```java
public interface IdeaSingleEntryLibraryDependency extends IdeaDependency, ExternalDependency {
File getFile();
File getSource();
File getJavadoc();
}
```
不过,我并没有在 Gradle 的代码里找到对应的实现类,而是在 Intellij IDEA 的源码里找到了:`InternalIdeaSingleEntryLibraryDependency`,真是有趣。
## 结论
抽象和描述一个项目并不是一件容易的事情。</file>重新思考工作2014-07-14T12:17:36+00:002014-07-14T12:19:51.251031+00:00Phodal Huanghttp://www.phodal.com/blog/author/root/http://www.phodal.com/blog/rethink-about-the-work/看到一篇关于工作还是爱好的文章之后,我在想当前似乎已经找不到我真正爱好及喜欢的东西。于是,我开始在我想做的事情里面找到了一些。
现在的工作对于我来说是合适的,也就是适合我的,只是我似乎是在比较某些东西。
> 不要把注意力放在工作给你带来的价值上,那是一种爱好的心态。
虽然我并没有将注意力放在工作给我带来的价值上,我所需要的或许是技术上的成长。因为我也是出于一种所谓的爱好的心态,只有愈强才能愈喜欢。我想对于自己来说,就是一件事:
- 积累所需要的技能
##加强基础技能
对于一个开发人员来说,基础的技能便是:编程。在上一篇文章中[《编程同写作,写代码只是在码字》](http://www.phodal.com/blog/write-similar-program-just-typing/),我似乎将编程说得有点简单,然而事实也似乎是如此。
###一、加强码字的速度
对于26字母来说,已经没有必要,但是对于大部分的字符来说。。以下图为例,大部分的程序员常用符号
"'\/.,<>;:[]{}()_-+=
都是由右手完成的。
<img src="http://www.phodal.com/static/media/uploads/huovd.png" width="600"/>
对于我来说,通常右手更多的时候可能是流离状态,也就是离开键盘。还有一个不好的习惯便是,打大小写字母的时候,就算只有一个字母会用``caps lock``,而不是``shift``+``字母``。于是我想,我需要提高打字的技能,即使相对于我来说,已经很快了。但是还没有达到专业的程度,所谓的专业我想应该是没有那么多的错误。
###二、写出更整洁的代码
整洁的代码似乎是很有必要的,虽然写的代码很少,但是总不能不写,多看,多实践多试试。于是很快也就有了一个清单:
- 将《重构》与Intellij Idea结合,写在博客上
- 将《设计模式》的思想运用到某实战中
- 看点书加上实践
###三、英语
英语对于我来说,我也想不清难度在哪,多半是口语+单词量不够。翻译一些文章可以做为一部分,但是似乎不一定靠谱,要找一些没人翻译的文章可能会有点难。
至于口语只能多听多练了,过去曾经有写英语博客的技术。只是其中不可行的因素可能会比较多,于是就渐渐地放弃了这个念头。
###四、针对性的加强语言技能
没想好具体针对于哪个语言,但是现在有两一个比较好的想法
- 写一个基于libGDX的游戏
- 写一个针对于移动领域的CMS
剩下的我想就是慢慢思考和计划其的可能性了。